Build-in seriallization

유니티의 내부 기능 중 직렬화를 사용 하는곳이 많다.

Serialization

오브젝트(메모리에 로딩된 인스턴스)상태를 파일등에 저장하기 위해서 바이트 스트림으로 변환하는 작업.

Saving and loading

유니티는 Scenes, Assests, AssetBundles를 저장하고 로딩할때 직렬화한다. 이것은 MonoBehaviour 와 ScriptableObject 들도 포함된다.

Inspector window

인스펙터 윈도우에서 값을 보거나 변경 할때 유니티는 해당 오브젝트를 직렬화해 저장하고 로딩 후 보여준다. 유니티가 인스펙터 윈도우에 필드가 값을 보여 줄때는 script API 를 사용하지 않는다. (즉 속성의 get, set 함수가 호출되지 않는다.)

Reloaing sripts in the Unity Enditor

만약 스크립트를 변경하고 저장하면, 유니티는 로딩되어 있는 해당 스크립트 변수들을 직렬화해서 저장하고 변경된 스크립트와 함께 재 로딩한다. 즉 직렬화 되지 않은 값들은 삭제된다.

프라이빗 필드는 명시적으로 'SerializeFiled'라고 선언 하지 않아도 자동 직렬화되고 로딩된다.

Prefabs

프리팹은 직렬화된 데이터이다. 이 데이터는 하나 또는 여러개의 게임 오브젝트와 컴포넌트로 구성되어 있다.

프리팹 인스턴스는 프리팹소스와 해당 인스턴스에 적용된 변경 리스트로 구성되어 있다. 변경 리스트는 유니티가 해당 프리팹을 생성 할때 소스와 다른점을 적용 하기 위해 사용된다.

프리팹 인스턴스는 유니티 에디터에만 존재한다. 프로젝트가 빌딩될때 유니티 에디터는 프리팹과 변경 리스트를 사용해 직렬화된 게임오브젝트를 생성한다.

Instantiation

런타임 그리고 유니티 에디터에서 이미 존재하는 Scenes, Prefab, GameObject 를 Instantiate 하면 유니티는 일단 직렬화 한다. (UnityEngine.Object 를 상속한 애들은 직렬화 할 수 있다.)

유니티는 새로운 게임오브젝트를 생성하고 아까 직렬화된 게임오브젝트를 역직렬화 한다. 그다음 해당 오브젝트의 모든 참조들에 대해 위와 직렬화, 역직렬화 작업을 한다. 해당 작업을 할때 참조값이 텍스처 같은 외부 참조라면 해당 값을 유지한다. 참조된 오브젝트가 내부의 자식 게임오브젝트라면 해당 오브젝트를 복사 후 복사본을 참조하게 설정한다.

Unloading unused assets

Resource.GarbageCollectSharedAssets() 은 Scene 이 로드된 다음에 사용되지 않는 오브젝트들(예를 들어 텍스처)을 언로드한다. 유니티 가비지 컬랙터가 직렬화을 사용해 게임 오브젝트의 외부 참조들을 기록하고 이것을 사용해 현재 Scence 에서 참조되지 않는 녀석을 언로드 한다.

메뉴얼 {}