2023. 11. 16. 23:49ㆍ개발공부/Unity
https://docs.unity3d.com/kr/2021.3/Manual/script-Serialization.html
스크립트 직렬화 - Unity 매뉴얼
직렬화는 데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 자동 프로세스입니다.
docs.unity3d.com
위 유니티 공식 문서를보면 직렬화란 다음과 같이 정의되어있다
"직렬화는 데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 자동 프로세스입니다."
그리고 유니티에서 직렬화는 게임 상태를 저장 및 로드하거나 에디터와 런타임 간에 데이터를 전송하는 데 사용된다.
그리고 직렬화 하기 위해선 다음 규칙을 따라야한다.
직렬화 규칙
하지만 위에 해당하는
커스텀 클래스 직렬화
Unity가 커스텀 클래스를 직렬화하려면 클래스가 다음 사항을 준수하는지 확인해야 합니다.
- Serializable 속성이 있어야 함
- 정적이 아님
Unity에서 직렬화가 사용하는 경우
저장 및 로드
Unity는 직렬화를 사용하여 씬, 에셋, 에셋 번들을 기기 메모리에 저장 및 불러옴. 여기에는 MonoBehaviour컴포넌트와 ScriptableObjects와 같은 자체 스크립팅 API 오브젝트에 저장된 데이터가 포함됨.
Unity 에디터의 여러 기능은 코어 직렬화 시스템을 기반으로 제작됩니다.
인스펙터 창
인스펙터 창은 검사한 오브젝트의 직렬화된 필드 값을 보여줌(그래서 public , serializefield 속성인 변수가 보임)
인스펙터에서 값을 변경하면 직렬화된 데이터를 업데이트하고 검사한 오브젝트를 업데이트하는 역직렬화가 발동한다.
핫 리로드
스크립트를 변경해서 저장하면 Unity는 로드한 모든 스크립트 데이터를 핫 리로드함.
Unity는 로드한 모든 스크립트에 직렬화 가능한 변수를 저장한 다음 해당 스크립트를 리로드하고 직렬화된 변수를 복원
핫 리로드는 직렬화할 수 없는 모든 데이터를 폐기하므로 나중에는 데이터에 액세스할 수 없음.
프리팹 - 프리팹은 하나 이상의 게임 오브젝트 및 컴포넌트가 직렬화된 데이터
인스턴스화 (공식문서 내용)
프리팹이나 게임 오브젝트처럼 일반적으로 씬에 존재하는 항목에 Instantiate를 호출하면 Unity는 다음을 수행합니다.
- Unity가 이를 직렬화합니다. 이는 런타임 시 에디터에서 발생합니다. Unity는 UnityEngine.Object에서 파생한 모든 항목을 직렬화할 수 있습니다.
- Unity는 새로운 게임 오브젝트를 생성하고 새로운 게임 오브젝트에 데이터를 역직렬화합니다.
- Unity는 다른 배리언트에서 동일한 직렬화 코드를 실행해 어떤 UnityEngine.Objects가 레퍼런스된 것인지 보고합니다. 모든 레퍼런스된 UnityEngine.Objects를 체크하여 Unity가 인스턴스화하는 데이터의 일부인지 확인합니다. 레퍼런스가 텍스처 같은 외부 요소를 가리키면 Unity는 해당 레퍼런스를 그대로 유지합니다. 레퍼런스가 자식 게임 오브젝트 같은 내부 요소를 가리키면 Unity는 해당 복사본 레퍼런스로 패치합니다.
결론
[serializfield]는 단순히 유니티 인스펙터상에 띄우기 위해서 쓰는 속성이 아니다.!!