프로퍼티 백은 특정 .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__Unity에서 개발한 스크립팅 백엔드로, 여러 플랫폼용 프로젝트를 빌드할 때 Mono 대신 사용할 수 있습니다. 자세한 정보
See in Glossary 빌드에서 가비지를 할당할 수 있습니다. 이 할당은 불가피한 박싱으로 이어지는 System.Reflection.FieldInfo의 직접적인 사용으로 인해 발생합니다.
반사를 방지하기 위해 컴파일 중에 프로퍼티 백을 코딩으로 생성할 수 있습니다. 하지만 이러한 최적화로 인해 컴파일 시간이 길어질 수 있습니다. 어셈블리에 대한 코드 생성을 활성화하려면 어셈블리에 [Unity.Properties.GeneratePropertyBagsForAssemblyAttribute] 태그를 지정하고 개별 유형에 [Unity.Properties.GeneratePropertyBagAttribute] 태그를 지정합니다. 프로퍼티 백이 내부 및 비공개 필드와 프로퍼티에 액세스할 수 있도록 하려면 유형 partial을 만듭니다.