[유니티] custom class serialization

jh Seo·2025년 1월 10일
0

유니티

목록 보기
58/62

개요

커스텀 클래스를 작성했을 때, monobehaviour나 Scriptable object를 상속받지 않는다면
어떻게 유니티가 처리하는지에 대한 문서를 보고 정리한 글이다.
두 가지 경우가 있다.
SerializeReference키워드를 사용할 때와 inline serializeReference 할때

[SerializeReference]키워드 사용할 때

클래스에 SerializeReference키워드를 붙이게 되면

  • Unity는 해당 객체를 관리된 참조로 설정한다.

  • 메인 객체는 여전히 데이터를 직렬화하지만, 별도의 레지스트리 섹션에 저장한다.

  • 이를 통해 동일한 인스턴스를 여러 필드에서 참조해도, 동일한 하나의 객체를 가리킨다.

Inline Serialization ([SerializeReference] 사용 x)

기본적으로 유니티는 커스텀 클래스를 inline형식으로 직렬화 한다고 한다. 따라서

  • 인스턴스 참조가 여러 필드에서 동일한 값이라도, 각 필드는 별개의 객체로 직렬화된다.

  • 이로 인해 직렬화된 데이터를 줄 때 각 필드가 동일한 데이터의 별개 객체를 가지게 된다.

  • 따라서 서로 다른 메모리 영역에서 동일한 데이터가 저장된 별개의 객체가 생성된다.

SerializeReference가 제공하는 유틸들

  • 필드가 null이 가능하다.
    인라인 직렬화는 null을 표현할 수 없기 때문에 null을 할당하지 않은 필드가 있는 인라인 객체로 대체한다.

  • 같은 객체에 대한 여러 참조.
    위에 말했듯이 [SerializeReference]를 사용하지 않고 커스텀 클래스 인스턴스를 여러 필드에 참조하면 직렬화 시 별개의 객체가 됨.

  • 그래프 및 순환 데이터 (예: 자기 자신을 참조하는 객체).
    인라인 클래스 직렬화는 null이나 공유 참조를 지원하지 않기 때문에 데이터 내 순환은 예기치 않은 결과(이상한 인스펙터 동작, 콘솔 오류 또는 무한 루프) undefined behaivour 일어남.

  • 다형성.
    만약 부모 클래스를 상속하는 자식 클래스를 만들고 그 자식 클래스를 부모 클래스 타입으로 필드에 할당하고, [SerializeReference]를 사용하지 않은 상태면 Unity는 부모 클래스에 속한 필드만 직렬화한다. Unity가 클래스 인스턴스를 역직렬화할 때, 파생 클래스 대신 부모 클래스를 인스턴스화한다.

  • 데이터 구조가 특정 객체를 가리키는 안정된 식별자가 필요할 때, 객체의 배열 위치를 하드코딩하거나 배열 전체를 검색하지 않는다.

레퍼런스

유니티 DOC : Serialization of custom classes

profile
코딩 창고!

0개의 댓글

관련 채용 정보