Unity의 직렬화 시스템: Unity는 게임 객체와 그 구성 요소를 직렬화하여 저장하고, 다시 로드한다. Unity는 public 필드나 [SerializeField]로 선언된 필드를 직렬화하여 저장하고 로드한다. 클래스에 [System.Serializable] 속성을 붙여 직렬화할 수 있다.
Unity Editor의 동작: Hierarchy 창에서 게임 객체를 클릭할 때 Unity Editor가 해당 객체의 데이터를 인스펙터 창에 표시하면서, 모든 직렬화된 필드를 확인하고 필요한 경우 기본값을 설정한다.
자동 객체 생성: 필드가 null이거나 초기화되지 않은 경우, Unity는 이를 직렬화할 수 없기 때문에 자동으로 새 인스턴스를 생성하여 기본값을 설정한다.
아이템을 획득한 적이 없는데 아이템 장착을 관리하는 스크립트에서 아이템 데이터를 찾아오는 오류가 발생했고 그 원인을 파악하다가 위의 내용을 알게 되었다.
[Image 1] ItemManager
[Image 2] 장착 관리 스크립트
아이템 장착 UI 동작 방식
[Image 1]에서 보면 ItemManager에서 선언된 장착 아이템(ex - ItemInstance weaponInstance)들은 선언만 되어 있어 null인 상태(아이템을 장착한 적이 없어서)
장비 장착 UI를 담당하는 스크립트([Image 2])에서 인벤토리를 오픈하는 순간에 장착된 아이템을 확인하여 UI를 갱신
=> ItemManager의 장착된 아이템(weaponInstance 등)을 List로 받아와 Refresh() 메서드에서 반복문을 돌려 각 아이템이 null이 아니면 해당 아이템의 ID로 데이터를 가져와 UI를 최신화
원인 분석 과정
[Image 3] 인벤토리 정상 동작
[Image 4] 오류
- 오류 발생 과정
- 처음 인벤토리를 눌렀을 때 [Image 3]과 같이 정상적으로 동작
- Hierarchy 창에서 ItemManager를 선택하고 다시 인벤토리를 여는 과정에서 [Image 4]와 같이 오류가 발생
[Image 4]의 Inspector 창에서 ItemManager 스크립트를 보면 Weapon Instance가 있는 것을 확인. 해당 데이터가 문제의 원인이라는 것을 알게 됨
아이템을 획득한 적이 없는데 데이터가 있는 것과 데이터 값이 0 등 기본값으로 되어 있는 것, 그리고 ItemManager를 선택하여 확인하는 순간 오류가 발생하는 점이 이상해서 유니티 에디터에서 자동으로 객체를 생성하고 있는 것은 아닌지 의심하고 찾아봄
위에서 작성한 Unity Editor의 직렬화와 자동 객체 생성을 알게 됨
정리
이런 특성으로 인해 예상치 못한 오류가 발생할 수 있다.
캬!!! 멋있습니다!!!