Unity 매뉴얼: 스크립팅 API 및 직렬화
개요
Unity의 스크립팅 API는 게임 오브젝트의 상태와 데이터 구조를 효율적으로 저장하고 복구하는 방법인 "직렬화"를 지원합니다. 이 문서에서는 Unity에서 직렬화를 구현하는 방법, 직렬화 규칙 및 최적화 방법을 소개합니다.
1. 직렬화란?
직렬화는 데이터 구조 또는 게임 오브젝트의 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 과정입니다. 이 과정은 프로젝트 성능에 큰 영향을 미칠 수 있습니다.
2. 직렬화 규칙
Unity의 직렬화는 런타임 시 효율적으로 작동하도록 설계되었으며, C# 클래스의 필드에서 직접 작동합니다. 필드를 직렬화하려면 아래의 조건을 충족해야 합니다.
| 조건 | 설명 |
|---|---|
| 공용이거나 SerializeField 속성을 가져야 함 | 필드는 public이거나 SerializeField 속성이 있어야 합니다. |
| 정적이지 않아야 함 | 정적 변수는 직렬화되지 않습니다. |
| 읽기 전용이 아니어야 함 | 값을 변경할 수 있어야 합니다. |
| 자료형 | 기본 데이터 형식, 열거형 타입, Unity 빌트인 타입 등이어야 합니다. |
3. 커스텀 직렬화
커스텀 클래스를 직렬화하려면 클래스가 [Serializable] 속성을 가져야 하며, UnityEngine.Object에서 파생된 인스턴스를 필드에 할당하여야 합니다. 이를 통해 Unity는 필드를 해당 인스턴스에 대한 레퍼런스로 직렬화합니다.
인라인 직렬화 vs. SerializeReference
- 인라인 직렬화: 기본적으로 사용되며, 클래스 인스턴스를 사용하여 데이터가 직렬화됩니다.
- [SerializeReference] 직렬화: 메모리에 관리되는 참조로 오브젝트를 구축할 수 있도록 합니다. 서로 다른 참조를 지원하며 더 복잡한 시나리오에 유용합니다.
4. 프로퍼티 직렬화
Unity는 일반적으로 프로퍼티를 직렬화하지 않지만, 명시적 지원 필드가 있는 경우 직렬화 규칙을 따릅니다. 프로퍼티의 필드를 직렬화하려면 [field: NonSerialized] 속성을 사용하여 원치 않는 직렬화를 방지할 수 있습니다.
5. 스크립트 직렬화 오류
스크립트 직렬화 중 발생할 수 있는 오류에는 다음과 같은 것들이 있습니다.
| 오류 메시지 | 설명 |
|---|---|
| MonoBehaviour 생성자에서 Find 불가 | Begin의 Start에서만 호출해야 합니다. |
| 직렬화 중 Find 불가 | 직렬화된 오브젝트의 생성자에서 호출하지 않아야 합니다. |
6. 베스트 프랙티스
- 데이터 정리: 직렬화할 데이터 양을 최소화하여 이전 프로젝트와의 역호환성을 유지합니다.
- 중복 데이터 방지: 중복된 데이터나 캐시된 데이터는 직렬화되지 않도록 합니다.
- 직렬화 배열과 리스트: Unity는 배열과 리스트를 지원합니다.
7. 종합
Unity의 직렬화 시스템은 데이터의 저장 및 로드를 효율적으로 관리할 수 있도록 돕습니다. 스크립트 작성 시 직렬화 규칙을 잘 이해하고, 최적화 모범 사례를 따르면 더 나은 성능과 관리를 이끌어낼 수 있습니다.