프로퍼티 백
Understand the role of property bags and the performance considerations when using them.
읽는 시간 2분최근 업데이트: 한 달 전
프로퍼티 백은 특정 .Net 오브젝트 유형의 프로퍼티 컬렉션으로, 해당 유형의 오브젝트 인스턴스에 대한 데이터에 액세스하고 이를 설정하는 데 사용할 수 있습니다.
개념
특정 유형의 프로퍼티 백은 해당 유형의 인스턴스에 기반한 효율적인 데이터 이동 알고리즘을 활성화하는 컴패니언 오브젝트입니다. 기본적으로 Unity는 반사를 사용하여 유형에 대한 프로퍼티 백을 생성합니다. 이 반사 방식은 편의성을 제공하며 프로퍼티 백이 아직 등록되지 않은 경우 유형별로 한 번만 발생합니다.
성능을 향상시키기 위해 유형을 으로 태그하여 코드 생성을 선택할 수 있습니다. 또한 코드 생성을 활성화하려면 어셈블리에 태그를 지정해야 합니다. 코드로 생성된 프로퍼티 백은 도메인이 로드될 때 자동으로 등록됩니다.
[Unity.Properties.GeneratePropertyBag][assembly: Unity.Properties.GeneratePropertyBagsForAssembly]반사 및 코드 생성 시나리오 모두에서 프로퍼티 백은 다음과 같은 프로퍼티를 생성합니다.
- 공용 필드
- ,
[SerializeField]또는[SerializeReference]로 태그가 지정된 비공개 또는 내부 필드[CreateProperty] - 태그가 지정된 공용, 비공개 또는 내부 프로퍼티
[Unity.Properties.CreateProperty]
프로퍼티 백은 로 태그가 지정된 공용, 비공개 또는 내부 필드에 대한 프로퍼티를 생성하지 않습니다.
[DontCreateProperty]필드가 읽기 전용이거나 프로퍼티에 게터만 있는 경우 생성된 프로퍼티는 읽기 전용입니다.
[Unity.Properties.CreateProperty(ReadOnly = true)]편의를 위해 직렬화 속성을 사용하여 프로퍼티 백에 프로퍼티를 생성하는 것은 항상 적절한 접근 방식이 아닐 수 있습니다. Unity의 직렬화 시스템은 필드와 자동 프로퍼티에서만 작동하므로 검증을 수행하거나 변경 사항을 효과적으로 전파하기가 어려워집니다.
다음은 Unity 직렬화 시스템과 Unity 프로퍼티 시스템을 결합한 예제입니다.
using UnityEngine;using Unity.Properties;public class MyBehaviour : MonoBehaviour{ // Serializations go through the field, but we don't want to create a property for it. [SerializeField, DontCreateProperty] private int m_Value; // For the property bag, use the property instead of the field. This ensures that // the value stays within the appropriate bounds. [CreateProperty] public int value { get => m_Value; set => m_Value = value; } // This is a similar example, but for an auto-property. [field: SerializeField, DontCreateProperty] [CreateProperty] public float floatValue { get; set; }}
Unity 직렬화 시스템과 달리, 프로퍼티 백 내의 프로퍼티는 가 있는 값 유형으로 적합하지 않습니다. 대신 구조체 유형은 값 유형으로 인식되고 클래스 유형은 레퍼런스로 인식됩니다.
[SerializeField]Unity 직렬화에서는 다형성이 지원되지만, 명시적으로 선택하려면 속성을 사용해야 합니다. 그렇지 않으면 인스턴스는 값 유형으로 직렬화됩니다. 유형은 레퍼런스 유형으로 자동 직렬화되므로 이 규칙의 예외입니다.
[SerializeReference]UnityEngine.Object성능 고려 사항
Unity 프로퍼티는 .NET Reflection을 사용하여 강유형(Strongly Typed) 프로퍼티 백과 프로퍼티를 생성합니다. 이렇게 하면 특정 컨테이너 유형에 대한 프로퍼티 백을 처음 요청할 때 성능 오버헤드가 발생할 수 있습니다.
반사를 통해 필드 멤버에 대한 프로퍼티를 생성하면 이러한 프로퍼티는 IL2CPP 빌드에서 가비지를 할당할 수 있습니다. 이 할당은 불가피한 박싱으로 이어지는 의 직접적인 사용으로 인해 발생합니다.
System.Reflection.FieldInfo반사를 방지하기 위해 컴파일 중에 프로퍼티 백을 코딩으로 생성할 수 있습니다. 하지만 이러한 최적화로 인해 컴파일 시간이 길어질 수 있습니다. 어셈블리에 대한 코드 생성을 활성화하려면 어셈블리에 태그를 지정하고 개별 유형에 태그를 지정합니다. 프로퍼티 백이 내부 및 비공개 필드와 프로퍼티에 액세스할 수 있도록 하려면 유형 을 만듭니다.
[Unity.Properties.GeneratePropertyBagsForAssemblyAttribute][Unity.Properties.GeneratePropertyBagAttribute]partial