![[Unity] NullReferenceException: Object reference not set to an instance of an object](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FkJlBX%2FbtsH7BY7nx1%2FAAAAAAAAAAAAAAAAAAAAAKmqDXPnXtZkQgPvIXGLGJOWTY63V8YIMIzrgfKsH2b_%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DremUi%252ByQrz%252FUb60rZiFXP6anW1g%253D)

목차
오류가 뜬 상황
문제점
해결방법
오류정리
오류가 뜬 상황
2D 종스크롤 슈팅 게임 만들기의 오브젝트 풀링을 배우고 적용 중에 오류가 떴다.
오류 내용은 다음과 같았다.
해당 오류는 어떨 땐 시작하자마자, 어떨 땐 몇 초 뒤에...
오류 발생 시점이 너무 랜덤이라 어떤 행동을 했을 때 해당 오류가 발생하는지 알 수 없었다.
문제점
먼저 NullReferenceException: Object reference not set to an instance of an object를 검색해 보니
오브젝트를 래퍼런스하지 않은 변수에 접근하려고하면 해당 오류가 발생한다고 한다.
래퍼런스 변수가 오브젝트를 참조하지 않는 경우 NULL로 처리가 되고 NULL에 접근하려니 오류가 발생하는 것이다.
나의 해결방법
내가 해본 방법은 먼저 변수들이 서로 제대로 할당 되었는지 확인이었다.
NullReferenceException: Object reference not set to an instance of an object
GameManager.SpawnEnemy () (at Assets/Scripts/GameManager.cs:54)
GameManager.Update () (at Assets/Scripts/GameManager.cs:34)
계속해서 위와 같은 오류 문구를 알려주었는데 GameManager.SpawnEnemy ()을 가리키길래 해당 메서드에서 할당이 잘 못 되었다고 생각해 영상을 돌려보며 빼먹은 게 있나 보았지만 문제는 없어 보였다...
enemyLogic.player = player; //적 생성 후에 변수를 넘겨주는 것으로 해결
enemyLogic.objectManager = objectManager;
여기서 할당이 잘 못 되었다 생각하고 player스크립트와 objectManager스크립트도 다시보고 GameManager스크립트에서 변수 할당이 잘 못되었나도 확인했지만 문제는 없었다.
두 번째로 Unity에서 GameManager의 스크립트에 모든 항목이 제대로 할당되었는지 확인이었다.
하지만 역시 다 잘 되어있었고 그 외 다른 스크립트들에도 다 할당이 되어있었다.
결국 해결되지않아 GPT의 힘을 빌렸다.
힘을 빌리니 먼저 NULL이 뜨는 곳을 확인하기 위해 디버그 로그를 추가하는 방법을 이용하였다.
if (player == null)
{
Debug.LogError("Player is not assigned in GameManager.");
return;
}
Player playerLogic = player.GetComponent<Player>();
if (playerLogic == null)
{
Debug.LogError("Player script is not attached to the player GameObject.");
return;
}
scoreText.text = string.Format("{0:n0}", playerLogic.score); // string.format() : 지정된 양식으로 문자열을 변환해주는 함수 // {0:n0} : 3자리씩 , 처리
}
위는 디버그 로그를 추가한 코드의 일부분이다.
앞서 말했듯 해당 오류는 NULL인 오브젝트가 있다는 오류여서 어느 부분에서 NULL인지 알기 위해 위의 코드처럼 디버깅을 해주었다.
디버깅을 해보니 enemy 오브젝트에 Enemy script가 없다는 것이다.
Rigidbody2D rigid = enemy.GetComponent<Rigidbody2D>();
Enemy enemyLogic = enemy.GetComponent<Enemy>();
if (enemyLogic == null)
{
Debug.LogError("Enemy script is not attached to the enemy GameObject.");
return;
}
그래서 enemy 오브젝트들을 보았는데 Enemy 스크립트는 다 달려있고 혹시나 프리팹을 확인해봤는데 player와 GameObject 항목이 None으로 되어있었다. 이게 문제인가 싶었는데 게임 실행 시 코드에 의해 할당을 받는 부분이었다.
여전히 해결방법을 찾지 못해 GPT를 더 활용 해보았는데 갑자기 GPT가 준 코드로 실행을 하니 오류 없이 게임이 실행되었다. 이후 원래 내 코드와 차이점을 알려달라고 해보니
엄... 그저 오타였다... 오타때문에 enemyObjs배열에서 EnemyM이 제대로 할당되지 않았고 이 때문에 오타였던 EnemM은 NULL로 할당되어 해당 오류가 떴었던 것 같다.
앞으로는 오타가 없도록 노력해야겠다..
오류정리
NullReferenceException: Object reference not set to an instance of an object 오류는 변수를 제대로 설정(할당)하지 않아 발생한다!
이를 해결하기위해 if문으로 NULL을 체크하거나 try/catch문으로 NULL을 체크해 NULL이 발생하는 부분을 확인 후 변수를 제대로 설정해 주면 문제를 해결할 수 있다.
참조
1. https://docs.unity3d.com/kr/530/Manual/NullReferenceException.html
'오늘의 오류' 카테고리의 다른 글
오늘의 오류 - NullReferenceException: Object reference not set to an instance of an object (0) | 2024.07.19 |
---|

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!