- 한줄 요약 : 아무 곳에나 [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 모두 직렬화 가능하다고 유니티는 이해
유니티의 인스펙터창은 직렬화 가능한 필드를 직렬화해서 보여주는 것
근데 직렬화 할 수 있는 필드들은 모두 기본값으로 세팅되어짐
- 문제 발생 원인
디버그 모드에서는 Inventory의 InventoryItem 배열이 전부 기본값으로 0이 들어가서 초기화 되어 있음
유니티 인스팩터창은 직렬화 가능한 필드를 직렬화 해서 보여주는 것
→ 디버그 모드의 인스펙터창도 동일. 즉, 직렬화 가능 클래스들의 필드들을 강제로 다 직렬화해서 보여주는 것이였음.
→ 고로 클래스의 모든 필드들에 SerialzableField를 붙인 것과 동일한 효과가 남
노말모드에서 보기위해 Inventory 의 InventoryItem[]에 [SerialzeField] 를 붙여서 확인하면 조금 이상하게 되어있음
→ Inventory 클래스의 InventoryItem[]에 직렬화 하라고 시켜서 직렬화해서 배열은 보여줬는데, 안에 InventoryItem클래스의 안에 필드에는 [SerialzeField]를 붙이지 않아서
InventoryItem을 기본값으로 세팅은 하지만, ItemData는 초기화를 하지않음. 또한, 직렬화 가능한 필드가 없으니 인스펙터에도 정상적으로 표시하지 않음
VS로 디버그하면 Inventory의 InventoryItem[]이 크기는 할당 되어 있지만, 안에는 모두 널값이 들어있음.
→ 원래 기대되는 상태
결론
- 기본적으로 유니티의 인스펙터창은 직렬화 가능한 필드를 직렬화해서 보여줍니다
- 디버그 모드는 직렬화 가능한필드가 아니고, 직렬화 가능한 클래스면 모두 강제로 직렬화 가능한 필드로 만들어서 보여줍니다.
- 직렬화 가능한 필드는 생성시(?) 자동으로 초기값을 할당해줍니다.
'Unity&C# > Unity' 카테고리의 다른 글
[Unity] TextMeshPro AtlasRenderMode (0) | 2024.11.09 |
---|---|
TMP_Text vs TextMeshPro vs TextMeshProUGUI (1) | 2024.11.08 |
[Unity] Rigidbody ForceMode (0) | 2024.10.29 |
[Unity] Tag와 Layer의 성능차이 (0) | 2024.10.28 |
[Unity] Monobehaviour를 상속받지 않은 클래스에서 Coroutine 실행하기 (0) | 2024.10.20 |