[내배캠] 최종 프로젝트 #13. Unity Editor의 직렬화와 자동 객체 생성

Sungchan Ahn(안성찬)·2024년 12월 20일

내일배움캠프

목록 보기
86/104

Unity Editor의 직렬화와 자동 객체 생성

  1. Unity의 직렬화 시스템: Unity는 게임 객체와 그 구성 요소를 직렬화하여 저장하고, 다시 로드한다. Unity는 public 필드나 [SerializeField]로 선언된 필드를 직렬화하여 저장하고 로드한다. 클래스에 [System.Serializable] 속성을 붙여 직렬화할 수 있다.

  2. Unity Editor의 동작: Hierarchy 창에서 게임 객체를 클릭할 때 Unity Editor가 해당 객체의 데이터를 인스펙터 창에 표시하면서, 모든 직렬화된 필드를 확인하고 필요한 경우 기본값을 설정한다.

  3. 자동 객체 생성: 필드가 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를 최신화

  • 원인 분석 과정

  1. [Image 2]의 Refresh() 메서드에서 if (itemInstances[i] != null)을 보면 Item을 획득한 적도 없고 착용한 적도 없어서 itemInstance[i] == null이어야 함
  2. 하지만 오류가 발생했을 때 itemInstances[i]는 null이 아니었고, 그 ItemInstance의 ItemID값은 0이었음
  3. 기획 테이블의 아이템 데이터에서 ItemID로 데이터를 가져오는데 ItemID는 1001 ~ 1999까지로 설정되어 있고 0은 없어서 오류 발생
  4. 왜 0이 생겼는지 파악하기 위해 오류 발생 과정을 파악

[Image 3] 인벤토리 정상 동작
[Image 4] 오류

  • 오류 발생 과정
  1. 처음 인벤토리를 눌렀을 때 [Image 3]과 같이 정상적으로 동작
  2. Hierarchy 창에서 ItemManager를 선택하고 다시 인벤토리를 여는 과정에서 [Image 4]와 같이 오류가 발생
  1. [Image 4]의 Inspector 창에서 ItemManager 스크립트를 보면 Weapon Instance가 있는 것을 확인. 해당 데이터가 문제의 원인이라는 것을 알게 됨

  2. 아이템을 획득한 적이 없는데 데이터가 있는 것과 데이터 값이 0 등 기본값으로 되어 있는 것, 그리고 ItemManager를 선택하여 확인하는 순간 오류가 발생하는 점이 이상해서 유니티 에디터에서 자동으로 객체를 생성하고 있는 것은 아닌지 의심하고 찾아봄

  3. 위에서 작성한 Unity Editor의 직렬화와 자동 객체 생성을 알게 됨


정리

  • Hierarchy 창에서 GameObject를 클릭하면, Unity Editor는 인스펙터에 모든 직렬화된 데이터를 표시
    -> 이 과정에서 필드가 null인 경우 자동으로 새 객체를 생성하고 기본값을 설정
  • Unity는 직렬화 가능한 대상에 대해 null 상태를 그대로 직렬화할 수 없기 때문에, 직렬화 대상 필드가 null일 때 자동으로 인스턴스를 생성하고 기본값으로 설정

이런 특성으로 인해 예상치 못한 오류가 발생할 수 있다.

profile
게임 개발 기록

1개의 댓글

comment-user-thumbnail
2024년 12월 20일

캬!!! 멋있습니다!!!

답글 달기