Unity&C#/Unity

[Unity] 디버그 모드와 SerializeField

리네엔 2024. 11. 1. 22:11
  • 한줄 요약 : 아무 곳에나 [SerialzeField]와 [Serialzable]을 붙이면 안되며, 편하게 디버깅하려 하면 안된다.

문제 상황 코드

Inventory (class)

  • InventoryItem[] (field)

InventoryItem Class

  • ItemData
  • int

ItemData Class

  • string 및 int로 이루어진 필드

ItemData클레스에 [Serialzable]
Inventory클래스에도 [Seriazable]을 붙여 둔 상황.

(별 이유 없이 붙임. 그냥 붙임. << 그러면 안됐음)

문제 상황

디버그 모드에서는 Inventory의 InventoryItem 배열이 전부 기본값으로 0이 들어가서 초기화 되어 있음

노말모드에서 보기위해 Inventory 의 InventoryItem[]에 [SerialzeField] 를 붙여서 확인하면 조금 이상하게 되어있음

VS로 디버그하면 Inventory의 InventoryItem[]이 크기는 할당 되어 있지만, 안에는 모두 널값이 들어있음.

이유

  • 기본 배경

Serialzable → 직렬화 가능함을 나타내는 키워드(?)로 InventoryItem과 ItemData 모두 직렬화 가능하다고 유니티는 이해

유니티의 인스펙터창은 직렬화 가능한 필드를 직렬화해서 보여주는 것

근데 직렬화 할 수 있는 필드들은 모두 기본값으로 세팅되어짐

  • 문제 발생 원인
  1. 디버그 모드에서는 Inventory의 InventoryItem 배열이 전부 기본값으로 0이 들어가서 초기화 되어 있음

    유니티 인스팩터창은 직렬화 가능한 필드를 직렬화 해서 보여주는 것

    → 디버그 모드의 인스펙터창도 동일. 즉, 직렬화 가능 클래스들의 필드들을 강제로 다 직렬화해서 보여주는 것이였음.

    → 고로 클래스의 모든 필드들에 SerialzableField를 붙인 것과 동일한 효과가 남

  2. 노말모드에서 보기위해 Inventory 의 InventoryItem[]에 [SerialzeField] 를 붙여서 확인하면 조금 이상하게 되어있음

    → Inventory 클래스의 InventoryItem[]에 직렬화 하라고 시켜서 직렬화해서 배열은 보여줬는데, 안에 InventoryItem클래스의 안에 필드에는 [SerialzeField]를 붙이지 않아서

    InventoryItem을 기본값으로 세팅은 하지만, ItemData는 초기화를 하지않음. 또한, 직렬화 가능한 필드가 없으니 인스펙터에도 정상적으로 표시하지 않음

  3. VS로 디버그하면 Inventory의 InventoryItem[]이 크기는 할당 되어 있지만, 안에는 모두 널값이 들어있음.

    → 원래 기대되는 상태

결론

  • 기본적으로 유니티의 인스펙터창은 직렬화 가능한 필드를 직렬화해서 보여줍니다
  • 디버그 모드는 직렬화 가능한필드가 아니고, 직렬화 가능한 클래스면 모두 강제로 직렬화 가능한 필드로 만들어서 보여줍니다.
  • 직렬화 가능한 필드는 생성시(?) 자동으로 초기값을 할당해줍니다.