Version: Unity 6.0 (6000.0)
언어 : 한국어
Unity 2022 LTS로 업그레이드
Unity Building Blocks

Unity 2021 LTS로 업그레이드

이 페이지에는 2020에서 2021 LTS 버전으로 업그레이드할 경우 기존 프로젝트에 영향을 미칠 수 있는 Unity 2021 LTS 버전의 변경 사항이 나와 있습니다.

참고: 2021 LTS는 2021.3으로도 알려져 있습니다.

페이지 개요

렌더 파이프라인

이 업그레이드 가이드에서는 Unity의 빌트인 렌더 파이프라인 2021 버전으로 업그레이드하는 방법에 대해 설명합니다. 다른 렌더 파이프라인 2021 버전으로 업그레이드하려면 다음을 참조하십시오.

다른 패키지를 업그레이드하려면 사용하는 패키지의 문서를 참조하십시오.

Device Simulator

이제 Device Simulator는 에디터에 포함되며 게임 창에서 액세스할 수 있습니다. Device Simulator를 설정하려면 Screen, Application, SystemInfo 클래스 UnityEngine.Device.Screen; UnityEngine.Device.Application; UnityEngine.Device.SystemInfo;UnityEngine.Device 네임스페이스를 추가합니다.

UnityEngine.Device로 전환하려면 시뮬레이터에서 사용하려는 각 스크립트에 다음 로직을 추가해야 합니다. using Screen = UnityEngine.Device.Screen; using Application = UnityEngine.Device.Application; using SystemInfo = UnityEngine.Device.SystemInfo; 새로운 네임스페이스 UnityEngine.Device가 시뮬레이터(에디터에 있는 경우)에서 런타임 빌드를 통해 실제 기기 API로 원활하게 전환됩니다.

환경 조명

이제 에디터가 기본 스카이박스 프로브와 앰비언트 프로브를 자동으로 베이크하고 씬을 수동으로 베이크할 때까지 해당 데이터를 보관합니다. 업그레이드하면 주변광 기여가 없는 씬이 시각적으로 변경될 수 있습니다. 이러한 씬의 원래 모습을 복원하려면 환경 조명 강도 멀티플라이어를 0으로 설정합니다. 또는 스카이박스를 검은색으로 설정하고 씬을 베이크한 다음 스카이박스를 원하는 하늘색으로 초기화합니다.

환경 조명: 이제 앰비언트 프로브와 스카이박스 반사 프로브가 자동으로 베이크됨

Unity의 프로그레시브 라이트매퍼는 이제 기본적으로 모든 씬에 대한 앰비언트 프로브와 스카이박스 반사 프로브를 자동으로 생성합니다. 즉, 씬이 Lighting Settings 패널의 Environment 탭에 있는 설정에 따라 자동으로 환경 조명을 받습니다. 에디터는 환경 조명이 변경될 때마다 조명을 생성할 때까지 앰비언트 프로브와 스카이박스 반사 프로브를 업데이트합니다. Generate Lighting 컨트롤을 사용하여 베이크하는 경우 에디터는 프로브 업데이트를 중지하고 다음 베이크 시에만 다시 업데이트합니다. Auto Generate 옵션을 활성화하면 에디터는 환경 조명이 변경될 때마다 프로브를 계속 업데이트합니다. 조명을 생성한 후 프로젝트에서 조명 데이터 에셋을 제거하여 이 조명 데이터를 삭제하면 에디터가 자동으로 앰비언트 프로브와 스카이박스 반사 프로브를 다시 생성합니다.

프로젝트를 업그레이드할 때 조치를 취해야 하는 한 가지 상황이 있습니다. 이는 다음과 같은 프로젝트에서 환경 조명 기여를 원하지 않으려는 경우입니다.

  • 조명 데이터 에셋이 없습니다.
  • Auto Generate가 활성화되어 있지 않습니다.
  • 검은색 이외의 컬러로 설정된 환경 기여가 있습니다.

이 경우 Window > Rendering > Lighting Settings > Environment로 이동한 후 다음 변경 작업 중 하나를 수행하여 자동으로 생성된 앰비언트 프로브와 스카이박스 반사 프로브의 환경 기여를 비활성화하십시오.

  • 옵션 1: Intensity Multiplier를 0으로 설정합니다.
  • 옵션 2: 검은색 스카이박스 머티리얼을 사용합니다.
  • 옵션 3: Source에 대해 Color 또는 Gradient 모드에서 검은색을 사용합니다.

Enable Code Coverage 환경 설정

코드 커버리지 관리를 위한 사용자 인터페이스가 General Preferences에서 Code Coverage 패키지 안으로 이동되었습니다.

Unity 2021에서는 Enable Code Coverage 체크박스가 Code Coverage 창에서 이동되었습니다.
Unity 2021에서는 Enable Code Coverage 체크박스가 Code Coverage 창에서 이동되었습니다.

Code Coverage 패키지는 Unity 2019.3 이상의 패키지 관리자를 통해 릴리스된 패키지로 제공됩니다. 최신 버전은 1.0.0입니다.

다음 방법 중 하나를 사용하여 코드 커버리지를 활성화할 수 있습니다.

// Create a new C# script called CodeCoverageMenuItem and place it
// under the Editor folder.
// This class creates a toggle menu item under Code Coverage > Enable
// Code Coverage. Use it to enable/disable Code Coverage.

using UnityEditor;
using UnityEngine.TestTools;

class CodeCoverageMenuItem
{
    const string EnableCodeCoverageItemName = "Code Coverage/Enable Code Coverage";

    [MenuItem(EnableCodeCoverageItemName, false)]
    static void EnableCodeCoverage()
    {
        Coverage.enabled = !Coverage.enabled;
    }

    [MenuItem(EnableCodeCoverageItemName, true)]
    static bool EnableCodeCoverageValidate()
    {
        Menu.SetChecked(EnableCodeCoverageItemName, Coverage.enabled);
        return true;
    }
}

파티클 시스템 힘 필드

이전에는 일부 Force Field 프로퍼티가 프레임 속도에 따라 또는 Time Manager에서 Time Scale을 사용하는 경우 다르게 동작했습니다.

이제 파티클 시스템은 시뮬레이션에 30fps의 레퍼런스 프레임 속도를 사용합니다. 앱이 다른 프레임 속도로 실행되는 경우 다음 설정은 이전 Unity 버전과 비교하여 다르게 동작할 수 있습니다.

  • Gravity
  • Rotation
  • Vector Fields

이러한 설정이 영향을 받는 경우 영향을 받는 영역의 강도를 조정하여 원하는 외형을 얻으십시오.

파티클 시스템 시작 지연 + 거리당 방출량

이전에는 거리당 방출량이 시작 지연 설정을 무시했습니다. 시작 지연 설정을 정의하면 거리 기반 방출의 시작이 지연됩니다.

이 필드가 이전에 설정된 경우 조정해야 할 수 있습니다.

BuildReport - PackedAssets

PackedAssets.file은 직접 교체 없이 사용 중지로 표시되었습니다. 이전에는 BuildReport.files에 대한 파일 ID 또는 인덱스를 나타내는 정수를 포함했습니다. 이제 BuildReport 파일을 검색하려면 PackedAssets.shortPath를 사용해야 합니다.

Terrain API의 실험 단계 종료(WIP)

실험 단계의 터레인 API가 비실험 단계의 네임스페이스로 이동되었습니다. 터레인 API에 몇 가지 작은 변경 사항이 있습니다. 실험 단계의 터레인 API를 사용한 경우 대신 다음 API를 사용하십시오.

  • UnityEngine.TerrainTools;
  • UnityEditor.TerrainTools;
  • UnityEngine.TerrainUtils;

다음은 API 변경 사항의 전체 리스트입니다.

  • 대부분의 경우, UnityEngine.Experimental.TerrainAPIUnityEditor.Experimental.TerrainAPI는 이제 각각 UnityEngine.TerrainToolsUnityEditor.TerrainTools로 변경되었습니다. 일부 런타임 API가 새 UnityEngine.TerrainUtils 네임스페이스로 이동했습니다.
  • TerrainPaintTool<T> 클래스의 GetDesc() 이름이 GetDescription()으로 변경되었습니다.
  • TerrainUtility 클래스는 UnityEngine.Experimental.TerrainAPI에서 UnityEngine.TerrainUtils로 이동했습니다.
  • TerrainUtility.TerrainMap 클래스는 더 이상 내부 클래스가 아니며 UnityEngine.TerrainUtils 네임스페이스에 속합니다.
  • TerrainMap.TileCoord 구조는 더 이상 TerrainMap 클래스에 없으며 이름이 TerrainTileCoord로 변경되었고 이제 UnityEngine.TerrainUtils 네임스페이스에 속합니다.
  • UnityEditor.Experimental.TerrainAPI.BrushPreviewMode 열거형의 이름이 TerrainBrushPreviewMode로 변경되었고 UnityEditor.TerrainTools 네임스페이스로 이동했습니다.
  • TerrainPaintUtilityEditor.BuiltinPaintMaterialPasses 열거형은 TerrainPaintUtilityEditor 클래스에서 UnityEditor.TerrainTools 네임스페이스로 이동했습니다. 또한 이름이 TerrainBuiltinPaintMaterialPasses로 변경되었습니다.
  • IOnInspectorGUI의 세 가지 ShowBrushGUI 함수가 다른 과부하 함수 대신 기본 파라미터 값을 사용하는 단일 함수로 병합되었습니다.
  • TerrainFilter가 제거되었습니다. 대신에 System.Predicate<Terrain>을 사용합니다.

Texture2D.Resize가 Reinitialize로 이름이 변경됨

Texture2D.Resize와 그 오버로드의 이름이 Texture2D.Reinitialize로 변경되었습니다.

API 업데이터가 자동으로 이름을 이렇게 변경합니다. 그렇지 않으면 Texture2D.Resize의 사용을 Texture2D.Reinitialize로 변경합니다.

Android 변경 사항

Android 빌드 파이프라인의 많은 부분이 증분 방식으로 변경되었으며, Unity는 이전 빌드 파이프라인에 있던 다음 기능을 제거했습니다.

  • Unity는 Assets/Plugins/Android/[res, assets]에 있는__ Gradle__여러 빌드 프로세스를 자동화하는 Android 빌드 시스템입니다. 이러한 자동화로 인해 많은 일반적인 빌드 오류가 발생할 가능성이 감소합니다. 자세한 정보
    See in Glossary
    프로젝트 에셋을 Gradle 프로젝트로 더 이상 복사하지 않습니다.
    • 이전에는 Gradle 리소스를 이 폴더에 넣으면 Unity가 Gradle 프로젝트에 복사했습니다. 이제 추가 Gradle 리소스를 애플리케이션에 전달하려면 AAR 또는 androidlib 플러그인을 사용해야 합니다.
    • 이 폴더에 프로젝트 에셋을 배치하면 Unity가 빌드 오류 메시지를 표시합니다.
  • Unity는 더 이상 GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN 주석 내의 파일을 무시하지 않습니다.
    • 이전에는 이 주석을 삭제해도 Unity가 파일을 덮어쓰지 않았습니다. 주석을 삭제하지 않으면 Unity는 항상 build.gradle, manifest, UnityPlayerActivity 파일을 다시 생성했습니다.
    • 새로운 빌드 파이프라인을 사용하여 변경 사항을 유지하려면 템플릿을 사용하십시오.
  • Android 프로젝트를 익스포트하면 Unity가 심볼 zip 패키지를 더 이상 생성하지 않습니다. 이제 압축할 수 있는 unityLibrary\symbols 디렉토리에서 심볼을 사용할 수 있습니다. 이렇게 변경한 이유는 프로젝트를 익스포트할 때 모든 심볼 파일을 사용할 수 없기 때문입니다. Gradle은 애플리케이션을 빌드할 때 libil2cpp.so 심볼을 생성합니다.
  • Unity가 obb가 apk와 호환되는지 확인하는 방법이 변경되었습니다. 이제 apk와 obb 모두 내부에 unity_obb_guid 파일이 있으며, 둘의 내용이 일치하면 Unity는 호환되는 것으로 처리합니다.
  • PatchPackage를 사용하는 커스텀 빌드 스크립트의 경우 이제 Patch/Patch & Run이 모든 유형의 에셋에서 작동하며 스크립트 전용 빌드를 필요로 하지 않습니다.

기본 mainTemplate.gradle 파일이 변경되었습니다. 커스텀 메인 템플릿을 사용하는 경우 이를 다시 생성하고 변경 사항을 위에 다시 적용해야 합니다. 그렇지 않으면 애플리케이션이 Resources.Load를 사용하는 경우 성능 저하가 발생할 수 있습니다.

UI 툴킷 - 이미지에 대한 기본 scaleMode가 변경됨

기본 Image.scaleMode가 ScaleAndCrop에서 ScaleToFit으로 변경되었습니다.

이미지의 예상 동작은 요소의 크기에 맞게 조정되므로 Image.scaleMode의 기본값을 ScaleToFit으로 변경했습니다. 이미지 스케일 모드를 오버라이드하지 않으면 일부 잘린 이미지가 요소의 크기에 맞게 축소될 수 있습니다. ScaleAndCrop이 이미지의 예상 모드인 경우 UXML 파일 인라인 스타일에 다음 값을 추가하여 스타일을 오버라이드할 수 있습니다.

-unity-background-scale-mode: scale-and-crop;

오버라이드를 통해 스타일 클래스를 만들고 ScaleAndCrop을 필요로 하는 이미지에 적용할 수도 있습니다.

Mono 업그레이드 동작에 대한 변경 사항

기본 C# 런타임인 Mono가 최신 버전으로 업그레이드되었습니다. 여기에는 Mono 업스트림 버전의 여러 수정 사항과 일부 주요 동작 변경 사항이 포함됩니다.

  • Directory.GetFiles가 정렬된 리스트를 더 이상 반환하지 않습니다.
    • 이전에는 항상 알파벳순으로 정렬된 항목 리스트를 반환했습니다. 프로젝트에 항상 동일한 순서로 항목을 반환해야 하는 경우 반환된리스트를 정렬합니다. 예: var 파일 = Directory.GetFiles(dir).OrderBy(f => f)
  • 이제 Object.GetHashCode는 다른 값을 반환하며, 운영체제 간의 결정론적 해싱 알고리즘으로 사용해서는 안 됩니다.
    • 일반적으로 GetHashCode의 결과를 현재 프로세스 외부에서 사용해서는 안 됩니다. 즉 직렬화하거나 다음에 코드가 새 프로세스에서 실행될 때 동일할 것으로 기대하지 마십시오. Unity는 MD5 같은 결정론적 해싱 알고리즘을 사용할 것을 권장합니다.
  • 일부 버그 수정으로 인해 새로운 예외가 발생했습니다. 일부 예외 메시지의 콘텐츠도 변경되었습니다.
    • 이 새로운 동작은 자동화된 테스트 시나리오에서 특히 두드러지며, 테스트가 특정 예외 메시지에 대한 로그를 구문 분석하는 경우 예상되는 동작을 변경해야 할 수 있습니다.

Adaptive Performance

이제 Adaptive Performance 패키지 3.0 버전을 사용할 수 있습니다. 버전 3.0으로 업그레이드하는 방법에 대한 자세한 내용은 Adaptive Performance 업그레이드 가이드를 참조하십시오.

RenderTexture DepthStencilFormat

이전에는 RenderTexture.depth 프로퍼티를 32비트로 설정하면 플랫폼에 따라 D24_S8을 얻을 수 있었습니다. 이제 32비트로 설정하면 현재 플랫폼에서 지원되는 경우 뎁스 컴포넌트에 32비트가 포함된 D32_S8이 제공됩니다. 하지만 이렇게 하면 해당 뎁스 버퍼의 메모리 사용량이 2배로 증가합니다.

RenderTexture.depthStencilFormat 프로퍼티는 그래픽스 API가 비디오 메모리에 리소스를 생성하는 데 사용하는 포맷을 반환합니다. 이 프로퍼티를 사용하여 특정 포맷을 요청할 수도 있습니다. 그러나 모든 플랫폼이 모든 뎁스 스텐실 포맷을 지원하지는 않습니다. DepthStencilFormat 프로퍼티를 지원되지 않는 포맷으로 설정하면 Unity는 뎁스 및 스텐실 컴포넌트의 비트 수가 동일하거나 더 큰 호환 가능 포맷을 자동으로 선택합니다.

업그레이드

이제 RenderTexture 에셋이 선택한 뎁스 스텐실 포맷을 직렬화합니다. 포맷 대신 비트 수를 입력값으로 받는 API를 사용하는 경우, 해당 비트는 포맷에 매핑되고 해당 포맷은 직렬화됩니다. 뎁스를 16비트 이상으로 설정한 이전 버전의 RenderTexture 에셋은 D24_S8을 사용하도록 자동으로 업그레이드됩니다.

DirectX 그래픽스 API를 사용하는 일부 플랫폼(예: Windows)에서는 비트를 16보다 높게 설정한 경우 그래픽스 백엔드가 내부적으로 D32_S8 포맷을 선택하기 때문에 뎁스 비트가 더 적은 포맷이 생성됩니다. 모든 플랫폼에서 일관된 업그레이드를 보장하기 위해 모든 플랫폼에서 자동 업그레이더에 D24_S8을 사용합니다. 하지만 프로젝트에 RenderTexture 에셋이 있는 경우 프로젝트의 렌더 출력에 시각적 결함이 발생할 수 있습니다. 이러한 에셋을 검토하고 필요한 경우 뎁스 스텐실 포맷을 D32_S8로 변경합니다. 다음과 같은 문제가 발생할 수 있습니다.

  • 사용하는 RenderTexture의 메모리 크기가 증가할 수 있습니다. 하지만 이제 보고되는 메모리는 정확합니다.
  • 이제 뎁스 프로퍼티를 32비트로 설정하면 32비트 뎁스 컴포넌트가 제공되므로 메모리 사용량이 증가합니다. 이 문제를 방지하려면 비트를 24로 설정하고 플랫폼에서 지원되는 경우 D24_S8을 사용하십시오.
  • 플랫폼이 D24_S8을 지원하지 않는 경우 Unity는 기본적으로 호환 가능한 포맷인 D32_S8로 폴백합니다. 이를 방지하려면 인스펙터 창에서 에셋의 Enable Compatible Format 프로퍼티를 비활성화합니다. Unity가 D32_S8 포맷을 지원하지 않고 폴백할 수 없는 경우 다음 오류 메시지가 표시됩니다. RenderTexture.Create failed: depth/stencil format unsupported. There is no compatible format on this platform or this fallback to a compatible format is disabled in the import inspector.. 대부분의 경우, 문제를 해결하려면 Enable Compatible Format을 활성화합니다.

DepthAuto, ShadowAuto 및 VideoAuto 그래픽스 포맷이 더 이상 사용되지 않음

다음 그래픽스 포맷은 지원이 중단되었습니다.

  • DepthAuto
  • ShadowAuto
  • VideoAuto

이러한 자동 포맷은 사용되는 정확한 포맷이 불분명하며, 플랫폼에 따라 다를 수 있습니다.

지원이 중단된 포맷의 사용을 제거하는 단계는 포맷 및 사용 사례에 따라 다릅니다.

VideoAuto의 경우

현재 플랫폼의 자동 비디오 포맷을 가져오려면 SystemInfo.GetGraphicsFormat(DefaultFormat.Video)를 사용합니다.

DepthAuto/ShadowAuto의 경우 뎁스 전용 렌더 텍스처를 나타내는 데 사용됩니다.

GraphicsFormat API는 종종 DepthAuto 또는 ShadowAuto를 사용하여 컬러 버퍼 없는 뎁스 전용 렌더링을 통해 렌더 텍스처를 생성합니다. 다음은 이러한 사용 사례의 예시입니다.

  • renderTextureDescriptor.graphicsFormat = GraphicsFormat.ShadowAuto
  • RenderTexture.GetTemporary(width, height, bits, GraphicsFormat.ShadowAuto)

뎁스 전용(컬러 없음) 렌더링을 표시하려면 GraphicsFormat.None을 새로운 컬러 포맷으로 사용하십시오. renderTextureDescriptor.graphicsFormat = GraphicsFormat.None;

ShadowAuto를 사용한 경우 RenderTextureDescriptor의 shadowSamplingMode를 ShadowSamplingMode.CompareDepths로 설정하여 뎁스 텍스처에 대한 뎁스 비교 샘플링을 활성화하고, RenderTextureDescriptor를 취하는 오버로드를 사용하도록 코드를 변경하십시오. renderTextureDescriptor.shadowSamplingMode = ShadowSamplingMode.CompareDepths;

다른 상황에서 DepthAuto/ShadowAuto의 경우

경우에 따라 DepthAuto/ShadowAuto 포맷은 현재 플랫폼에 적합한 자동으로 선택된 뎁스 포맷을 나타냅니다. 이 경우 사용이 중단된 값을 대체하려면 SystemInfo.GetGraphicsFormat(DefaultFormat.Depth/Shadow)를 사용합니다.

WebGL: Emscripten을 2.0.19로 업데이트함

고급 사용자에게 제공되던 asm.js 링커 타겟은 더 이상 사용할 수 없습니다.

  • Unity 2021.2에서는__ WebGL__웹 브라우저에서 2D 및 3D 그래픽스를 렌더링하는 JavaScript API입니다. Unity 웹 빌드 옵션을 사용하면 콘텐츠를 JavaScript 프로그램으로 퍼블리시할 수 있습니다. 이 프로그램은 HTML5 기술과 WebGL 렌더링 API를 사용하여 Unity 콘텐츠를 웹 브라우저에서 실행합니다. 자세한 정보
    See in Glossary
    플랫폼에서 사용되는 기본 Emscripten 컴파일러가 버전 2.0.19로 업데이트되었습니다. 이렇게 하면 네이티브 코드 오브젝트 파일 포맷이 업그레이드되므로 프로젝트의 모든 네이티브 코드 플러그인(C/C++ 코드 플러그인)을 다시 컴파일해야 합니다. 예를 들어 Unity 에셋 스토어에서 비공개 소스 타사 플러그인을 사용하는 경우, 작성자에게 Unity 2021.2의 업데이트 버전을 요청해야 합니다.
  • Emscripten 런타임 JavaScript 함수 Pointer_stringify()는 현재 사용 중단되었습니다. 대신 함수 UTF8ToString()을 호출하여 WebAssembly 힙에서 UTF8로 인코딩된 null로 끝나는 C 문자열을 JavaScript 문자열로 마셜링합니다.

프로그레시브 GPU 라이트매퍼가 CPU OpenCL 기기에 대한 지원을 중단함

프로그레시브 GPU 라이트매퍼는 더 이상 CPU OpenCL 기기를 지원하지 않습니다. 지원되는 GPU를 찾을 수 없지만 CPU OpenCL 기기가 감지되면 기기가 건너뛰고 프로그레시브 CPU 라이트매퍼로 폴백된다는 경고 메시지가 표시됩니다. 프로그레시브 CPU 라이트매퍼를 통해 CPU 기반 라이트맵 계산의 성능을 높일 수 있습니다. 이러한 동작 변경은 자동으로 발생하며, 라이트맵은 예상대로 계산되어야 합니다.

OnPostprocessAllAssets 동작 변경 사항

에셋 임포트 프로세스 중에 Unity가 InitializeOnLoad 메서드를 호출하면 에셋 로드가 실패할 수 있습니다. 에셋 임포트 중에 에셋 데이터베이스는 업데이트 상태이며 Unity는 이미 임포트한 에셋을 확인할 수 없습니다. InitializeOnLoad 메서드는 임포트되지 않은 에셋을 로드할 수 없습니다.

에셋 임포트 프로세스를 개선하기 위해 OnPostprocessAllAssets 콜백을 개선했습니다. 특히 OnPostprocessAllAssets 콜백을 다음과 같이 개선했습니다.

  • 에셋 데이터베이스의 준비 상태가 보장되는 경우 도메인 리로드 후 초기화를 수행할 수 있습니다.
  • 도메인이 리로드되면 true로 설정되는 didDomainReload 파라미터를 포함합니다.
  • 에셋 작업을 지원합니다. 여기에는 메뉴 항목을 통해 에셋을 로드하는 것과 동일한 방식으로 작동하는 에셋 로드가 포함됩니다.
  • 에셋 데이터베이스 임포트 루프에서 이동했습니다. 에셋 임포트가 완료될 때까지 콜백 처리가 연기됩니다.

에셋 작업이 필요한 도메인 관련 초기화 로직을 OnPostprocessAllAsset 콜백으로 이동시킵니다. InitializeOnLoad 메서드 내에서 에셋 작업을 수행하지 마십시오.

다음 동작 변경 코드 예제는 에셋 작업이 이전에 어떻게 연기되었는지 보여 줍니다.

예제1:

public class AssetPostprocessorTester1 : AssetPostprocessor
{
    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        var assetPath = "Assets/hello.txt";

        if (File.Exists(assetPath))
        {
            var txtObj = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/hello.txt");
            AssetDatabase.DeleteAsset("Assets/hello.txt");

            if (txtObj == null)
                Debug.Log("New Behaviour: Asset object is unloaded");
            else
                Debug.Log("Old Behaviour: Asset is loaded for deleted asset!!");
        }
    }
}

예제2:

 public class AssetPostprocessorTester2 : AssetPostprocessor
{
    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        var assetPath = "Assets/SomeText.txt";
        if (!File.Exists(assetPath))
        {
            File.WriteAllText(assetPath, "hello world");

            AssetDatabase.ImportAsset(assetPath);
            var txtObj = AssetDatabase.LoadAssetAtPath<TextAsset>(assetPath);

            if (txtObj == null)
                Debug.Log("Old Behaviour: Asset hasn't been imported yet");
            else
                Debug.Log("New Behaviour: Asset is imported and loaded");
        }
    }
}

다음 예시에는 didDomainReload 파라미터가 있는 새 OnPostprocessAllAssets 배리언트가 있습니다.

static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths, bool didDomainReload)
{
    if (didDomainReload)
        Debug.Log("Domain has been reloaded");
    else
        Debug.Log("Domain did not reload during import");
}

이제 모든 도메인 리로드는 에셋 데이터베이스 내에서 처리됩니다

이제 OnPostprocessAllAssets가 에셋 작업에 더 잘 작동하지만, 이 콜백에서 처리하면 에셋 데이터베이스 새로고침과 도메인 리로드 시간이 늘어납니다. InitializeOnLoad 메서드도 도메인 리로드 시간이 늘어납니다. 반복 간 에디터 응답성을 개선하려면 이러한 콜백의 처리를 최소화하는 것이 좋습니다.

그림자 없는 혼합 점 광원 및 스폿 광원이 Subtractive 조명 모드에서 직접광을 베이크함

이제 Mixed 모드 점 광원과 스폿 광원은 Shadow Type 설정에 관계없이 Subtractive 조명 모드를 사용하는 씬에서 지속적으로 베이크된 직접광을 제공합니다. 따라서 영향을 받는 씬에서 정적 게임 오브젝트의 스페큘러 조명이 누락된 것처럼 보일 수 있습니다. 이 문제를 해결하려면 영향을 받는 Mixed 모드 광원을 Realtime 모드 광원으로 바꿉니다. 또는 혼합 조명으로 Baked Indirect 또는 Shadowmask 조명 모드를 사용하십시오.

셰이더 키워드 시스템에 대한 개선 사항

이제 셰이더 키워드 시스템은 셰이더 또는 컴퓨트 셰이더당 최대 65,534개의 로컬 키워드와 프로젝트당 232–2개의 전역 키워드를 지원합니다. 이제 셰이더 또는 컴퓨트 셰이더에서 선언하는 모든 키워드는 이 셰이더에만 국한됩니다. _local 접미사로 지시문에서 선언하는 키워드는 전역 키워드의 상태에 영향을 받지 않습니다.

예:

셰이더의 패스는 다음 키워드를 선언합니다.

  • #pragma shader_feature FOO BAR
  • #pragma shader_feature_local BOO BAZ

이 패스를 사용하면 전역 또는 머티리얼에서 활성화된 경우 FOO 및 BAR 키워드가 활성화됩니다. BOO 및 BAZ 키워드는 머티리얼에서 활성화된 경우에만 활성화됩니다.

Unity가 .NET Standard 2.1 API를 지원함

이제 Unity는 .NET Standard 2.1 API의 모든 API를 포함하여 .NET 기본 클래스 라이브러리의 여러 추가 API를 지원합니다. 새로운 API와 충돌하는 코드가 있으면 프로젝트가 컴파일되지 않을 수 있습니다.

이전 버전의 Unity에서 생성된 프로젝트를 업그레이드할 때 오류를 피하려면 코드를 확인한 후 업데이트하여 현재 .NET Standard 2.1에서 사용할 수 있는 타입 및 메서드와 충돌하지 않도록 하십시오.

충돌의 원인은 다음과 같습니다.

  • 모호한 레퍼런스
  • 확장 메서드
  • 사전 컴파일된 어셈블리

모호한 레퍼런스 해결

코드가 .NET Standard 2.1에서 추가하는 타입 또는 메서드와 충돌하는 이름을 가진 타입이나 메서드를 구현하는 경우 코드가 컴파일되지 않습니다. 이름 충돌이 발생하면 모호한 레퍼런스로 인해 C# 컴파일러 오류가 발생할 수 있습니다.

예를 들어 프로젝트의 코드에 MyCompany.MyCode.Range라는 타입을 추가하면 기존의 System.Range 타입과 충돌할 수 있습니다. using System;using MyCompany; 문이 모두 포함된 코드는 컴파일되지 않습니다.

오류를 방지하려면 충돌하는 이름의 타입에 대해 C# 코드에서 네임스페이스를 완전히 지정하십시오.

충돌하는 확장 메서드 해결

.NET Standard 2.1이 타입에 대해 직접 구현하는 확장 메서드가 기존 코드에 있는 경우 확장 메서드의 이름을 바꾸거나 기본 클래스 라이브러리에서 구현한 메서드를 사용하도록 선택할 수 있습니다.

예를 들어 프로젝트의 코드는 ArraySegment 타입에서 CopyTo라는 확장 메서드를 구현할 수 있습니다. .NET Standard 2.1에서 ArraySegment에는 빌트인 CopyTo 메서드가 있습니다. CopyTo 확장 메서드의 이름을 변경하거나 완전히 제거하고 빌트인 메서드를 사용할 수 있습니다.

충돌하는 어셈블리 해결

프로젝트가 이제 기본 클래스 라이브러리의 일부인 타입 및 메서드를 구현하는 사전 컴파일된 어셈블리(즉 관리되는 플러그인)를 사용하는 경우 프로젝트에서 이러한 어셈블리를 제거하고 빌트인 구현을 사용하십시오.

예를 들어 이전 Unity 버전에서는 NuGet의 System.Memory.dll 어셈블리를 사용하여 System.Span 값 타입에 액세스해야 했습니다. 이제 .NET Standard 2.1은 기본 클래스 라이브러리의 System.Span을 제공합니다. Unity 2021.2에서 System.Memory.dll 관리되는 플러그인을 사용하려고 하면 프로젝트가 빌드되지 않습니다.

Windows XR 플러그인이 제거됨

Microsoft는 Windows__ XR__XR은 VR(가상 현실), AR(증강 현실)과 MR(혼합 현실) 애플리케이션을 모두 포함하는 포괄적인 용어입니다. 이러한 형태의 인터랙티브 애플리케이션을 지원하는 기기를 XR 기기라고 합니다. 자세한 정보
See in Glossary
플러그인에 대한 지원을 중단했으며, 이제 OpenXR 플러그인을 통해 WMR(Windows Mixed Reality) 기능 및 기기를 지원합니다.

  • Windows XR 플러그인은 Unity 2021.2부터 제거되었습니다.
  • Unity 2021.2에서 기존 프로젝트를 열면 업데이트 프로세스에서 Windows XR 플러그인을 제거합니다(존재하는 경우).
  • Windows Mixed Reality용 프로젝트를 계속 사용하려면 Unity OpenXR 플러그인을 활성화해야 합니다.
  • 사용하려는 기능에 따라 Microsoft의 Mixed Reality OpenXR 지원 플러그인과 Microsoft Mixed Reality 툴킷의 추가 툴도 설치해야 합니다.

Unity OpenXR 플러그인으로 업그레이드하려면 다음 단계를 따르십시오.

  1. Project Settings 창을 엽니다.
  2. XR Plug-in Management 섹션의 Plug-in Providers 리스트에서 OpenXR을 활성화합니다. 필요한 경우 Unity는 OpenXR 플러그인을 다운로드하고 설치합니다.

OpenXR 플러그인이 활성화되면 Microsoft에서 제공하는 Mixed Reality Feature Tool을 사용하여 필요한 지원 패키지를 설치할 수 있습니다.

WMR 기능, 툴 및 샘플을 설치하거나 업데이트하려면 다음 단계를 따르십시오.

  1. 다운로드하여 Mixed Reality Feature Tool을 실행합니다.
  2. 업데이트할 Unity 프로젝트를 선택하고 Discover Features를 클릭합니다.
  3. Platform Support에서 Mixed Reality OpenXR 플러그인을 선택합니다.
  4. 추가하려는 기능을 선택합니다.
  5. Get features를 클릭합니다.
  6. Import를 클릭한 후 Approve를 클릭하여 프로세스를 완료합니다.
  7. Unity 프로젝트 설정의 XR Plug-in Management 섹션으로 돌아와서 추가된 기능을 활성화하고 설정합니다.

Windows Mixed Reality를 사용하도록 신규 및 업데이트된 Unity 프로젝트를 설정하는 방법에 대한 자세한 내용은 Microsoft 기술 자료 사이트의 XR 구성 설정을 참조하십시오.

Unity 2022 LTS로 업그레이드
Unity Building Blocks