Version: 2023.2
언어: 한국어
API 업데이터
2023.1로 업그레이드

Unity 2023.2로 업그레이드

이 페이지에는 2023.1 버전에서 2023.2로 업그레이드할 때 기존 프로젝트에 영향을 줄 수 있는 Unity 2023.2 버전의 변경 사항이 나열됩니다.

페이지 개요

환경 조명: 이제 주변광 프로브와 스카이박스 반사 프로브가 자동으로 베이크되지 않음

Unity의 프로그레시브 라이트매퍼는 더 이상 기본적으로 주변광 프로브와 스카이박스 반사 프로브를 베이크하지 않으며, Lighting 창의 Recalculate Environment Lighting 설정도 제거되었습니다.

새로 생성된 씬에 환경 조명이 없는 상황을 방지하기 위해, Unity는 기본 스카이박스 머티리얼과 일치하는 환경 조명이 포함된 기본 조명 데이터 에셋을 할당합니다.

다음과 같은 경우 Lighting 창에서 Generate Lighting을 선택해야 합니다.

  • 이전의 자동 베이킹 동작에 의존하는 씬의 조명을 수정하려는 경우.
  • 환경 조명 설정을 변경하고 새 씬에서 조명 변경 사항을 확인하려는 경우.

이전의 자동 베이킹 동작에 의존하지만 기본 환경 조명 설정을 사용하는 경우 Unity는 기본 조명 데이터 에셋을 사용하도록 씬을 업그레이드합니다.

자동 생성된 조명 제거

Lighting 창의 Auto Generate 설정이 제거되었으며, 관련 API도 이제 더 이상 사용되지 않습니다.

씬에 베이크된 조명을 생성하려면 다음 중 하나를 수행할 수 있습니다.

  • Lighting 창에서 Generate Lighting을 선택합니다.
  • Lightmapping.Bake API를 사용합니다.
  • Lightmapping.BakeAsync API를 사용합니다.

편집하는 동안 라이트맵을 확인하려면 Scene View Draw Mode를 선택하고 Lighting DataPreview로 설정합니다. 그러면 베이크된 조명의 미리보기가 표시됩니다. 미리보기 라이트맵은 비파괴적이며 씬을 베이크한 후에 사용할 수 있습니다.

씬이 자동 생성된 조명에 의존하는 경우 이제 베이크된 조명이 누락됩니다. 조명을 수동으로 베이크하려면Lighting 창에서 Generate Lighting을 선택합니다.

스크립트를 사용하여 씬을 여는 경우 이제 자동 생성 조명이 완료될 때까지 기다리지 말고 Lightmapping.Bake 또는 Lightmapping.BakeAsync를 사용해야 합니다.

DepthAuto, ShadowAuto 및 VideoAuto 그래픽스 포맷 사용 중단

2022.1에서 지원이 중단된 다음 그래픽스 포맷은 이제 더 이상 사용되지 않으며, 사용 시 컴파일 오류가 발생합니다.

  • GraphicsFormat.DepthAuto
  • GraphicsFormat.ShadowAuto
  • GraphicsFormat.VideoAuto

GraphicsFormatUtility.GetGraphicsFormat API는 사용되지 않는 포맷을 더 이상 반환하지 않습니다. 대신 다음과 같은 작업을 수행합니다.

  • RenderTextureFormat.DepthGraphicsFormat.DepthAuto 대신 GraphicsFormat.None으로 변환합니다. GraphicsFormat.None은 뎁스 전용 렌더링을 나타냅니다.
  • RenderTextureFormat.ShadowmapGraphicsFormat.ShadowAuto 대신 GraphicsFormat.None으로 변환합니다. GraphicsFormat.None 포맷으로 렌더 텍스처를 생성하는 경우 뎁스 비교 샘플링을 활성화하기 위해 RenderTextureDescriptor.shadowSamplingMode를 ShadowSamplingMode.CompareDepths로 설정해야 합니다.

GraphicsFormat.DepthAutoGraphicsFormat.ShadowAuto는 모두 뎁스 스텐실 포맷으로 간주되었지만 컬러 포맷으로 사용되므로 코드를 조정해야 할 수 있습니다.

예를 들어, 다음 스니핏에서 GraphicsFormatUtility.IsDepthFormattrue가 아닌 false를 반환합니다.

RenderTextureDescriptor desc = new RenderTextureDescriptor(256, 256, RenderTextureFormat.Depth, 32);
bool isDepthOnly = GraphicsFormatUtility.IsDepthFormat(desc.graphicsFormat);

RenderTexture 또는 RenderTextureDescriptor가 뎁스 전용인지 확인하려면 다음 중 하나를 사용합니다.

  • if (renderTexture.graphicsFormat == GraphicsFormat.None && renderTexture.depthStencilFormat != GraphicsFormat.None)
  • if (renderTexture.format == RenderTextureFormat.Depth || renderTexture.format == RenderTextureFormat.Shadowmap)

밉맵 제한이 더 이상 기본적으로 런타임 텍스처에 영향을 미치지 않음

런타임에 생성된 2D 텍스처에서 더 이상 기본적으로 밉맵 업로드가 제한되지 않습니다. 이전에는 Texture2D 생성자를 통해(생성자가 TextureFormat으로 호출될 때 ignoreMipmapLimit 부울 파라미터를 제공하거나, GraphicsFormat으로 호출될 때 IgnoreMipmapLimit TextureCreationFlag를 제공하는 방식) 또는 생성된 텍스처의 tex.ignoreMipmapLimit를 토글하여 명시적으로 밉맵 제한을 비활성화해야 했습니다. 이제 이 동작이 변경되어 런타임에 생성된 2D 텍스처에 대해 밉맵 제한을 옵트인할 수 있습니다.

프로젝트를 변경하지 않으면 다음과 같은 경우 사용자가 GPU 대역폭과 메모리 최적화를 놓치고 텍스처가 최대 해상도로 업로드되어 의도한 것보다 좋은 품질을 얻을 수 있습니다.

  • 런타임 텍스처가 품질 설정을 따르기를 무의식적으로 바라는 경우.
  • 런타임 텍스처가 품질 설정을 따르기를 의도적으로 바라며 기본 Texture2D 생성자를 사용하여 품질을 달성한 경우.

다음과 같은 경우 사용자는 이 변경의 영향을 받지 않습니다.

  • 런타임 텍스처가 전체 해상도로 유지되기를 명시적으로 바라는 경우.
  • 런타임 텍스처가 품질 설정을 따르기를 의도적으로 바라며 다음 사항을 명시적으로 설정하여 품질을 달성한 경우.
    • TextureFormat이 있는 생성자를 사용하고 ignoreMipmapLimitfalse로 설정.
    • 생성 후 tex.ignoreMipmapLimitfalse로 설정.

이러한 사용자는 지원이 중단된 생성자를 사용하는 경우 스크립트를 업그레이드해야 할 수 있습니다.

스크립트를 업그레이드하려면 Texture2D 생성자를 MipmapLimitDescriptor와 함께 사용하여 런타임 텍스처가 품질 설정의 영향을 받아야 함을 나타냅니다.

이 변경은 Texture2DArrays에 대한 새로운 밉맵 제한 지원과의 일관성을 위해 이루어졌습니다. 각 텍스처 셰이프가 자체 기본 밉맵 제한 동작을 정의하도록 하는 대신, 일관성을 위해 런타임 텍스처가 명시적으로 밉맵 제한을 활성화하도록 했습니다. 이 옵트인 동작이 옵트아웃보다 선호되는 이유는 런타임 텍스처가 예상보다 적은 밉을 예기치 않게 업로드하는 것이 더 많은 밉을 예기치 않게 업로드하는 것보다 유해할 수 있는 다양한 방식으로 사용되는 경우가 많기 때문입니다.

UXML을 사용한 커스텀 컨트롤 생성 향상

UI 툴킷에서 UXML로 커스텀 컨트롤 생성을 간소화하여 워크플로를 가속화하고 더욱 직관적으로 만들 수 있습니다.

주요 개선 사항은 UxmlElement 및 UxmlAttribute 속성의 도입입니다. 이러한 속성은 속성 저작을 간소화하고 프로퍼티 이름에서 속성 이름을 자동으로 파생하므로 UxmlTraits 및 UxmlFactory 클래스의 필요성을 없애 줍니다.

이제 특정 데이터 타입에 대한 커스텀 속성 컨버터를 생성하여 UXML 속성 문자열에서 값을 원활하게 전환할 수 있습니다. 또한 시각적 요소 내에서 커스텀 비시각적 요소를 정의할 수 있도록 UxmlObjects를 개선했습니다. 새로운 시스템은 Unity 직렬화를 활용하고 소스 제너레이터를 사용하여 각 커스텀 요소 클래스에 대한 모든 UxmlAttribute 정의에서 요소에 대한 UxmlSerializedData 클래스를 생성하므로 커스텀 프로퍼티 드로어, 데코레이터 및 다양한 속성을 지원할 수 있습니다.

’속성 오버라이드’의 도입으로 UXML 속성의 동작을 커스터마이즈할 수 있으며, 상속된 속성으로 작업할 때 유연성이 더 높아집니다. 이러한 개선 사항을 통해 Unity 2023.2 이상에서 복잡한 UI 요소를 생성할 때 더 효율적이고 사용자 친화적인 경험을 이용할 수 있습니다.

UxmlFactory 및 UxmlTraits로 생성된 레거시 커스텀 컨트롤:

public class HealthBar : VisualElement
{
   private const float k_LowValue = 0;
   private const float k_HighValue = 100;

   // Declare as usable with Uxml
   public new class UxmlFactory : UxmlFactory<HealthBar, UxmlTraits> { }
   // Define attributes (and connect with class properties) for Uxml 
   public new class UxmlTraits : BindableElement.UxmlTraits
   {
       UxmlColorAttributeDescription m_Color = new UxmlColorAttributeDescription { name = "color", defaultValue = Color.white };
       UxmlFloatAttributeDescription m_Value = new UxmlFloatAttributeDescription { name = "value", defaultValue = k_HighValue };

       public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
       {
           base.Init(ve, bag, cc);
           var bar = ve as HealthBar;
           bar.color = m_Color.GetValueFromBag(bag, cc);
           bar.value = m_Value.GetValueFromBag(bag, cc);
       }
   }

   public Color color { get; set; }

   [Range(k_LowValue, k_HighValue)]
   public float value { get; set; }
}

다음과 같이 새 UxmlElement 및 UxmlAttributes 시스템으로 전환할 수 있습니다.

[UxmlElement]
public class HealthBar2 : VisualElement
{
   private const float k_LowValue = 0;
   private const float k_HighValue = 100;

   [UxmlAttribute]
   public Color color { get; set; } = Color.white;

   [UxmlAttribute]
   [Range(k_LowValue, k_HighValue)]
   public float value { get; set; } = k_HighValue;
}

추가 예시와 정보는 Unity UI 툴킷 기술 자료를 참조하십시오. 이번 가을에 공개될 상세 블로그 포스트에서도 확인할 수 있습니다.

Assets/Create 메뉴 및 ScriptTemplates 재구성

Assets/Create 메뉴가 재구성 및 분류되었습니다. 이번 점검의 일부로 Unity Built-In ScriptTemplate 파일의 이름이 변경되었습니다.

Assets/Create 메뉴에 CreateAssetMenuAttribute, MenuItemAttribute 또는 Custom ScriptTemplate으로 요소를 추가한 사용자는 이제 다른 요소에 대한 위치가 달라지므로 메뉴 항목의 우선순위를 변경해야 할 수 있습니다.

EditorApplication.ExecuteMenuItem API에서 이러한 메뉴 항목을 실행하여 에셋을 생성한 사용자는 메뉴 항목의 새 경로를 확인해야 합니다.

이전에 Unity Built-In ScriptTemplate을 오버라이드한 사용자는 오버라이드 파일의 이름을 Built-In Template의 새 이름과 일치하도록 업데이트해야 합니다.

UI 툴킷 이벤트 처리 재구성 및 간소화

ExecuteDefaultActionExecuteDefaultActionAtTarget 메서드의 지원이 중단되었습니다. 이를 대체하여 다음 메서드가 추가됩니다.

  • HandleEventTrickleDown
  • HandleEventBubbleUp

Unity는 이벤트 디스패치 경로의 각 요소에서 해당 요소의 TrickleDown 직후 및 BubbleUp 콜백 전에 이러한 새로운 메서드를 실행합니다. 이러한 메서드가 실행되는 동안 디스패치 단계는 TrickleDown 또는 BubbleUp으로 설정되고 이벤트의 currentTarget은 메서드를 실행하는 요소와 일치하게 됩니다.

AtTarget 디스패치 단계와 PreventDefault 메서드는 지원이 중단되었습니다. StopPropagation 또는 StopPropagationImmediately를 호출하면 TrickleDownBubbleUp 콜백의 추가 호출을 중지하는 동시에 HandleEventTrickleDownHandleEventBubbleUp의 추가 실행을 중지합니다.

대부분의 경우 새 메서드로 업그레이드하지 않으면 코드의 동작이 크게 변경되지 않습니다. 사용되지 않는 메서드는 이전과 동일한 순서로 호출되거나 최소한의 조정만 이루어집니다. 그러나 UI 툴킷 내의 모든 표준 컨트롤은 새로운 메서드를 사용하도록 마이그레이션되었으며, 그에 따라 로직 실행 순서가 조정되었습니다. 사용되지 않는 메서드를 호출하면서 업그레이드된 컨트롤을 사용하면 특정 로직이 이전 Unity 버전과 동기화되지 않을 수 있습니다.

기존 코드를 새 메서드로 업그레이드하려면 다음과 같이 진행합니다.

  • ExecuteDefaultActionExecuteDefaultActionAtTargetHandleEventBubbleUp으로, PreventDefaultStopPropagation으로 대체합니다. 또는 동일한 코드 블록에서 StopPropagation이 이미 호출된 경우 PreventDefault 호출을 제거합니다. 이는 대부분의 경우에 해당됩니다.
  • BubbleUp 콜백 중에 PreventDefault를 호출하는 이전 코드로 인해 문제가 발생하는 경우(이벤트가 이미 타겟에 도달하여 더 이상 사용할 수 없고 StopPropagation으로 대체할 수 없음), TrickleDown 단계에서 콜백을 추가하여 StopPropagation을 호출하는 것을 고려합니다. 이 단계는 일반적으로 이러한 시나리오를 해결할 수 있습니다.
  • 드물지만 위의 변경 사항이 이전 코드의 기능을 유지하기에 적절하지 않은 경우 철저한 사례별 분석이 필요합니다. 이러한 상황에서는 해결 방법이 간단하지 않을 수 있습니다.
API 업데이터
2023.1로 업그레이드