Unity에 빌트인된 일부 기능은 자동으로 직렬화를 사용합니다. 해당 항목은 아래와 같습니다.
자세한 내용은 스크립트 직렬화 문서를 참조하십시오.
Unity는 씬, 에셋 및 에셋 번들을 컴퓨터 하드 드라이브에 저장하거나 로드할 때 직렬화를 사용합니다. 여기에는 MonoBehaviour 컴포넌트와 ScriptableObjects 같은 스크립팅 API 오브젝트에 저장된 데이터가 포함됩니다.
이는 에디터의 재생 모드와 편집 모드에서 발생합니다.
인스펙터 창에서 게임 오브젝트의 컴포넌트 필드 값을 보거나 변경할 때는 Unity가 이 데이터를 직렬화해서 인스펙터 창에 표시합니다. 인스펙터 창이 필드의 값을 표시할 때는 Unity 스크립팅 API와 통신하지 않습니다. 스크립트에서 프로퍼티를 사용하면 Unity가 인스펙터 창 필드를 직접 직렬화하기 때문에 인스펙터 창에서 값을 보거나 변경해도 프로퍼티의 게터와 세터가 호출되지 않습니다.
스크립트를 변경 및 저장할 때 Unity는 현재 로드된 스크립트 데이터를 모두 재로드합니다. 먼저 모든 로드된 스크립트에서 직렬화 가능한 변수를 저장하고, 스크립트 로드 후 복원합니다. 직렬화할 수 없는 모든 데이터는 스크립트 재로드 이후 사라집니다.
이는 모든 에디터 창과 프로젝트의 모든 MonoBehaviours에 영향을 끼칩니다. Unity의 다른 직렬화와는 달리 프라이빗 필드는 ‘SerializeField’ 속성이 없더라도 재로드할 때 기본적으로 직렬화됩니다.
직렬화에서 프리팹은 하나 이상의 게임 오브젝트 및 컴포넌트의 직렬화된 데이터입니다. 프리팹 인스턴스에는 프리팹 소스와 수정 리스트에 대한 레퍼런스가 포함되어 있습니다. 수정은 프리팹 소스에서 특정 프리팹 인스턴스를 생성하기 위해 Unity가 수행하는 작업입니다.
프리팹 인스턴스는 Unity 에디터에서 프로젝트를 편집할 때만 존재합니다. 프로젝트 빌드 과정에서 Unity 에디터는 게임 오브젝트를 두 세트의 직렬화 데이터(프리팹 소스와 프리팹 인스턴스의 수정 사항)로 부터 인스턴스화합니다.
프리팹 또는 게임 오브젝트 같이 씬에 존재하는 것에 Instantiate를 호출하면 Unity가 이 항목을 직렬화합니다. 이는 런타임 시 그리고 에디터에서 모두 발생합니다. UnityEngine.Object에서 파생된 모든 항목이 직렬화될 수 있습니다.
이후 Unity는 새 게임 오브젝트를 생성해 데이터를 새 게임 오브젝트에 역직렬화합니다. 다음으로 Unity는 다른 배리언트에서 동일한 직렬화 코드를 실행해 어떤 UnityEngine.Objects
가 레퍼런스된 것인지 보고합니다. 모든 레퍼런스된 UnityEngine.Objects
를 체크해 인스턴스화되는 데이터의 일부인지 확인합니다. 레퍼런스가 텍스처 같은 “외부” 요소를 가리키면 Unity는 해당 레퍼런스를 그대로 유지합니다. 레퍼런스가 자식 게임 오브젝트 같은 “내부” 요소를 가리키면 Unity는 해당 복사본 레퍼런스로 패치합니다.
Resource.GarbageCollectSharedAssets()
는 네이티브 Unity 가비지 컬렉터로 일반적인 C#의 가비지 컬렉터와는 기능이 다릅니다. 씬을 로드한 후 텍스처처럼 더 이상 레퍼런스되지 않는 오브젝트를 확인하고 안전하게 언로드합니다. 네이티브 Unity 가비지 컬렉터는 어떤 오브젝트가 모든 레퍼런스를 외부 UnityEngine.Objects
로 보고하는지 변형에서 시리얼라이저를 실행합니다. 이렇게 해서 한 씬에서 사용된 텍스처가 다음 씬에서 언로드됩니다.