[ 아이템 데이터 NullReferenceException 에러 ]
트러블 슈팅
클릭한 오브젝트, 놓인 오브젝트, 들고 있는 오브젝트 비교해서 모두 동일하면 해당 오브젝트를 보이게 하는 코드가 있다. 기존에는 테스트를 위해 전역 변수로 직접 인스펙터 창에서 오브젝트를 할당해서 사용했는데, 팀원들과 작업물을 합치면서 플레이어가 실제로 장착하고 있는 아이템의 정보를 가져오는 코드로 수정했다.
하지만 플레이어가 항상 아이템을 장착하고 있는 것이 아니기 때문에, 아이템을 장착하고 있지 않을 때 클릭을 하면 NullReferenceException 에러가 뜬다.
GameObject curItem = CharacterManager.Instance.Player.equipItem.ItemPrefab;
if (curItem == null)
{
Debug.Log("No item equiped");
return;
}
if (hitObject.name == curItem.name)
{
// 중략
}
코드는 플레이어가 장착하고 있는 아이템의 프리팹 정보를 가져오고, 만약 null이라면 반환하는 예외 코드도 작성했지만 에러가 발생했다.
그 이유는 ItemPrefab 이전에 equipItem이 null이기 때문이다.
ItemData의 데이터를 Player의 itemData에 넣고 있고, ItemData 안에 ItemPrefab이 있는 구조이다. 만약 ItemData 자체가 null이라면 ItemPrefab까지 가기 전에 이미 null이 되기 때문에 에러가 뜨는 것이다.
if (CharacterManager.Instance.Player.equipItem == null)
{
Debug.Log("No item equiped");
return;
}
GameObject curItem = CharacterManager.Instance.Player.equipItem.ItemPrefab;
if (hitObject.name == curItem.name)
{
// 중략
}
따라서 검사하는 코드에서는 equipItem까지만 확인하고 null 여부를 판단한다. 만약 null이라면 return을 반환하여 다음으로 진행되지 않고, null이 아니라면 다음 코드로 넘어가서 이때 curItem에 ItemPrefab 데이터를 할당한다.
그러면 예외 처리도 되고 적절한 때에 필요한 정보를 가져와서 정상적으로 진행할 수 있다.
[ 회고 ]
코드를 작성하다 보면 정말 많이 수도 없이 끝이 없을 정도로 파도 파도 계속 나오는 끈질긴 NullReferenceException 에러를 볼 수 있는데, 이젠 또 너냐? 싶을 정도로 익숙해졌다. 익숙해졌다는 거지 좋다는 말은 아니다..
참조가 길어질수록 복잡해져서 코드를 작성할 때도 헷갈린다. 이번에는 헷갈리진 않았지만 참조 대상이 잘못됐었다. ItemPrefab이 있으려면 equipItem이 있어야 했는데, 이를 고려 못 하고 바로 직접 참조를 해버리니까 equipItem에 데이터가 없어서 null이 뜨면 ItemPrefab까지 도달하지 못했던 것이었다. 앞에서 null 뜨면 어차피 null이니까 결국 null이 되지 않나? 싶었는데, 값이 null인 거랑 의도치 않게 참조 오류가 나는 것은 다르기 때문에 정확히 내가 어디까지 검사를 해야 하는지 영역 구분을 확실히 해야겠다.
'Coding > Unity' 카테고리의 다른 글
[내일배움캠프 42일차 TIL] 파티클 시스템, 애니메이션 이벤트, 사운드 (1) | 2024.06.14 |
---|---|
[내일배움캠프 40일차 TIL] Input System 다이렉트, 임베디드, 액션 에셋, C# 제너레이트, Action Properties (0) | 2024.06.12 |
[내일배움캠프 35일차 TIL] 컴포넌트에 데이터 자동 할당, Can't add script 에러 (0) | 2024.06.04 |
[내일배움캠프 32일차 TIL] 아이템 사용 트러블 슈팅 (0) | 2024.05.30 |
[내일배움캠프 30일차 TIL] 인벤토리 창 트러블 슈팅 (0) | 2024.05.28 |