
이번 포스팅에서는 UnassignedReferenceException(눌 참조)에 대해서 알아보겠습니다. Null은 참조타입들을 초기화하지 않을 시에 값이 없음을 말합니다.
값타입인 int, float, bool는 초기화를 하지 않을시 각각 0, 0.0f, false가 들어가지만 참조 타입은 Null이 들어갑니다.
참조타입에는 클래스(GameObject, MonoBehavior, Component), 델리게이트(메소드 참조), 배열(인덱스 참조), string 등이 있습니다.
1. 원인

위에서 언급한 참조타입 데이터를 초기화 하지 않아서 Null 상태일 때 값을 호출해서 연산이나 메소드 실행 등의 행동을 하려는 경우에 발생합니다.
2. 해결
Null상태인 참조타입 데이터에 값을 넣어줍니다.
2.1 스크립트에서 넣기

Null이었던 abc에 하이어라키 상에서 Box라고 이름지은 오브젝트를 찾아서 넣습니다. abc를 참조하는 SetActive보다 먼저 넣어주어야 값이 먼저 들어가면서 오류가 발생하지 않습니다.

하단 노란색 박스에 Abc의 값으로 Box 오브젝트가 정상적으로 들어가있어서 오류가 발생하지 않고 그것을 참조해서 SetActive(false)를 실행하기 때문에 상단 노란색박스의 v체크가 풀린 것을 볼 수 있습니다.
2.2 인스펙터에서 넣기

[SerializedField]혹은 Public으로 선언한 변수들은 인스펙터창에서 노란박스 위치에 있는 스크립트 컴퍼넌트에 노출됩니다. 이 곳에 각종 변수를 포함하여 데이터들을 직접 넣을 수 있습니다. 텍스트 타입으로 입력이 가능한 string이나 배열, int등은 값을 직접 입력하면 되지만 GameObject같은 경우 미리 만들어둔 오브젝트를 드래그로 끌어와서 값을 넣을 수 있습니다.

해당 오브젝트를 스크립트의 GameObject 타입 abc에 직접 드래그로 끌어와서 값을 넣을 수 있습니다. 간편하지만 주의해야할 점으로는 데이터를 스크립트와 인스펙터 양쪽에서 관리하게 되면 데이터를 불러오는 타이밍의 차이가 있습니다.
인스펙터를 우선해서 값을 넣고, 그 후 Start()에서 값을 넣고 이후 Update()의 값을 넣게 됩니다.
인스펙터에서 int값을 5를 주고, Start()에서 10, Update()에서 15를 주게 된다면 순차적으로 진행하지만 매우 빠르기 때문이 15만 보이게 됩니다. 하지만 Start()나 Awake() 등에서 해당 int값으로 무언가 조건문을 실행한다면 정상적으로 작동하게 됩니다.
NullReferenceException은 Null값을 참조하려고 할 때 발생합니다.
유니티에선 스크립트 실행시 인스펙터에서 값을 한번 참조하는 과정을 거칩니다.
그래서 인스펙터에 값이 없다면 Null 값이 들어가서 NullReferenceException이 나와야 하지만 저 과정을 먼저 거치기에 스크립트나 인스펙터에서 값을 할당하지 않았다는 오류인 UnassignedReferenceException가 먼저 나오게 됩니다.
그리고 스크립트나 인스펙터에서 = null; 로 직접 null을 넣어주게 되면 NullReferenceException이 나오게 됩니다.
결론은 둘 다 Null인데 참조하려고 할 때 나타나는 오류이며 그 과정중에 Null을 직접 할당했다면 NullReferenceException, 할당하지 않아서 자동으로 Null이 들어간 경우 UnassignedReferenceException이 나오게 됩니다.