커스텀 클래스를 작성했을 때, monobehaviour나 Scriptable object를 상속받지 않는다면
어떻게 유니티가 처리하는지에 대한 문서를 보고 정리한 글이다.
두 가지 경우가 있다.
SerializeReference키워드를 사용할 때와 inline serializeReference 할때
클래스에 SerializeReference키워드를 붙이게 되면
Unity는 해당 객체를 관리된 참조로 설정한다.
메인 객체는 여전히 데이터를 직렬화하지만, 별도의 레지스트리 섹션에 저장한다.
이를 통해 동일한 인스턴스를 여러 필드에서 참조해도, 동일한 하나의 객체를 가리킨다.
기본적으로 유니티는 커스텀 클래스를 inline형식으로 직렬화 한다고 한다. 따라서
인스턴스 참조가 여러 필드에서 동일한 값이라도, 각 필드는 별개의 객체로 직렬화된다.
이로 인해 직렬화된 데이터를 줄 때 각 필드가 동일한 데이터의 별개 객체를 가지게 된다.
따라서 서로 다른 메모리 영역에서 동일한 데이터가 저장된 별개의 객체가 생성된다.
필드가 null이 가능하다.
인라인 직렬화는 null을 표현할 수 없기 때문에 null을 할당하지 않은 필드가 있는 인라인 객체로 대체한다.
같은 객체에 대한 여러 참조.
위에 말했듯이 [SerializeReference]를 사용하지 않고 커스텀 클래스 인스턴스를 여러 필드에 참조하면 직렬화 시 별개의 객체가 됨.
그래프 및 순환 데이터 (예: 자기 자신을 참조하는 객체).
인라인 클래스 직렬화는 null이나 공유 참조를 지원하지 않기 때문에 데이터 내 순환은 예기치 않은 결과(이상한 인스펙터 동작, 콘솔 오류 또는 무한 루프) undefined behaivour 일어남.
다형성.
만약 부모 클래스를 상속하는 자식 클래스를 만들고 그 자식 클래스를 부모 클래스 타입으로 필드에 할당하고, [SerializeReference]를 사용하지 않은 상태면 Unity는 부모 클래스에 속한 필드만 직렬화한다. Unity가 클래스 인스턴스를 역직렬화할 때, 파생 클래스 대신 부모 클래스를 인스턴스화한다.
데이터 구조가 특정 객체를 가리키는 안정된 식별자가 필요할 때, 객체의 배열 위치를 하드코딩하거나 배열 전체를 검색하지 않는다.