오늘 공부를 하면서 정말 Unassigned와 Null 관련 오류로 많은 곤혹을 치룬 하루였다.
Unassigned Reference Exception
먼저 Unassigned의 사례를 보자

UIInventory 스크립트의 inventoryWindow 변수에 값이 할당되지 않았다고 한다. 고로 인스팩터 창에서 할당해주라는 메세지이다.
그러면 할당을 해주면 그만인데...

문제는 인스팩터 창에서 분명히 게임 오브젝트를 넣어줬다는 사실이다.
그러면 대체 왜 이런 에러가 발생한걸까?
그 이유는 황당하게도...

전혀 UI와 상관없는 나무 게임오브젝트에 UI Inventory가 부착되어있던 것이다...
실수로 스크립트를 추가한 것으로 보인다..
만일 이와 같은 실수를 한 거로 의심될 때 많은 게임오브젝트가 있을 때 찾기는 번거로우니
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
// 찾고자 하는 원하는 클래스(스크립트) 명을 <>안에 넣어주세요.
FindObjects<UIInventory>();
}
// 제네릭 메서드를 통해 T 타입의 오브젝트를 찾아 로그에 출력합니다.
void FindObjects<T>() where T : MonoBehaviour
{
// 씬 내의 모든 오브젝트를 탐색하여 T 타입의 오브젝트들을 찾습니다.
T[] scripts = FindObjectsOfType<T>();
if (scripts.Length > 0)
{
foreach (T script in scripts)
{
Debug.Log(typeof(T).Name + " 스크립트를 가진 오브젝트의 이름: " + script.gameObject.name);
}
}
else
{
Debug.Log(typeof(T).Name + " 스크립트를 가진 오브젝트를 찾을 수 없습니다.");
}
}
}
해당 코드를 통해 혹시 나와 같은 실수를 했는지 찾아보는 방법도 있다.
<> 안에 찾고자 하는 스크립트(클래스)명을 넣어주고 빈 게임오브젝트를 만들어 부착시키고 게임씬을 플레이하면 디버깅 로그로 나올 것이다.

위와 같이 실수를 잡아낼 수가 있다. Item_Wood에는 해당 스크립트가 필요가 없다.
Null Reference Exception
이제 Null Reference Exception 에 대한 얘기를 해보자
내가 이번에 마주한 Null Reference Exception 은 아래와 같이 싱글톤으로 만든 변수에 접근하다 발생했다.
CharacterManager.Instance.Player.equipment.EquipNew(selectedItem);
해당 코드 줄에서 에러가 났기에
나는 먼저 아래의 간단한 코드를 통해 selectedItem이 null 값인지 확인했다.
if(selectedItem == null) Debug.Log("비었습니다");
허나 "비었습니다" 라는 문구는 출력되지 않았다.
그렇다면 selectedItem이 null 이 아닌데
대체 무엇이 문제일까...
selectedItem이 null이 아닌 것은 확인 했으니
아래와 같이 코드를 작성하니 원인을 알수가 있었다.
if (CharacterManager.Instance == null) Debug.Log("CharacterManager.Instance가 null입니다.");
else if (CharacterManager.Instance.Player == null) Debug.Log("CharacterManager.Instance.Player가 null입니다.");
else if (CharacterManager.Instance.Player.equipment == null) Debug.Log("Player의 equipment가 null입니다.");
else CharacterManager.Instance.Player.equipment.EquipNew(selectedItem);
이렇게 싱글톤 변수에 대해 하나하나 확인하면서 null 값이 있는 지 확인하였다.
그결과 3번째 줄 "Player의 equipment가 null입니다." 이 출력되었고
Player 스크립트로 이동해본 결과

equipment를 GetComponent 하는 부분이 빠져있었다.. 무엇을 참조하는 지 지정을 안해줬으니 에러가 났던 것이다.
컴포넌트를 참조할 때는 반드시 GetComponent를 통해 갈고리를 걸어줘서 참조할 수 있도록 하는 과정을 잊지 않는 것이 중요해 보인다..
'유니티' 카테고리의 다른 글
유니티 - lerp와 slerp (2) | 2024.06.03 |
---|---|
유니티 - 2D Sprite를 이용한 체력바(게이지바) 구현하기 (0) | 2024.05.30 |
유니티 - 대체 인터페이스를 왜 쓰는걸까? (0) | 2024.05.28 |
유니티 -절차적 Skybox 만들기 (0) | 2024.05.27 |
유니티 - 유니티 패키지가 안열려요!? (1) | 2024.05.27 |