(주말공부)XR 플밍 - (12) 유니티 오류 모음 - 1편 (4/20)

이형원·2025년 4월 20일
0

XR플밍

목록 보기
49/215

앞으로 유니티를 다루면서 많은 오류를 경험하게 될 것이다. 실제로 유니티를 시작한 지 얼마 되지 않아 오류를 상당히 많이 겪기도 했고, 어떤 오류가 생길 수 있는지 정리해 볼 시간을 가지기로 했다.

1. 컴파일 오류


만약 작성한 코드에서 문법 오류 등의 내용을 고치지 않은 채 저장하고 끄게 되면 위와 같은 오류가 뜬다.

또한 이런 컴파일 오류가 발생했을 경우, 해당 컴포넌트를 오브젝트에 넣지 않았더라도 게임 테스트가 불가능해진다.
또 여기에서 매우 주의해야 할 부분이 있는데, 심지어 이 컴파일 오류를 해결하지 않은 채로 프로젝트를 종료하고, 다시 열려고 하면 이와 같은 알람이 뜬다.

여기에서 Enter Safe Mode로 눌러서 들어가게 되면 아래와 같이 게임 화면은 사라지고, 문제가 되는 코드를 삭제하거나, 수정하지 않으면 게임 화면이 아예 활성화가 되지 않는다.

오류를 발생시킨 파일을 삭제해 보았다.


파일이 삭제됨과 동시에 바로 화면이 원래대로 복구된 모습이다.

2. UnassignedReferenceException


게임을 테스트하려고 재생했을 때, 위와 같은 오류가 발생할 수 있다.

이 에러는 '할당되지 않은 참조 목록상 예외 사항 에러'를 의미한다.

에러 사항을 보여주려고 의도적인 실수를 낸 것이나, 이와 같이 참조되어야 할 칸의 내용이 비어있을 경우 발생하는 오류이다. 그러면 해당 부분을 다시 참조를 넣은 다음에 오류가 해결되는지 확인해보자.

참조할 항목을 넣은 다음 재생을 해 보면 정상작동하는 것을 확인할 수 있다.

3. Can't add script component

분명히 겪은 오류인데 막상 다시 오류를 발생시키려고 보니까 오류가 발생을 안해서(?) 결국 검색을 통해서 자료를 찾아보았다.

해당 오류가 발생하는 원인은 크게 두 가지로 나뉜다.

  1. 스크립트명과 스크립트에 구현되어 있는 클래스명이 다를 경우.

이와 같은 경우에 해당 오류가 발생한다고 해 봐서 여러 번 시도해 봤으나...
이게 그냥 확률성인 건지 이름이 일치하지 않아도 잘 작동하는 경우도 있었고 아닌 경우도 있었다.

  1. 컴파일 오류

사실 컴파일 오류가 있으면 ErrorPause로 먼저 뜰 것 같기는 하나, 오류가 없는지 확인해보라는 멘트도 있는 만큼 확인해보는 편이 좋을 것이다.

4. The referenced script (Unknown) on this Behaviour is missing

간혹 게임 테스트를 진행하다 보면 오류는 아니지면 경고가 뜨는 경우가 있다.

이런 게 뜨면 참 골치 아픈 게, 경고 위치가 어디인지를 표시해주지 않는다는 것이다. 결국 일일히 뒤져볼 수밖에 없는데, 이런 오류가 발생하는 이유는 아래와 같다.

  • 오브젝트에 스크립트를 달아놨는데, 해당 스크립트만 지우고 스크립트 컴포넌트는 지우지 않은 경우
  • 스크립트 컴포넌트를 달았는데, 사용하던 스크립트의 이름이 변경되었을 경우

이제 문제를 일으키는 오브젝트를 찾으면, 인스펙터에 이렇게 표시되어 있는 것을 확인할 수 있다.

저 Missing으로 되어 있는 컴포넌트를 제거하면 해당 오류는 해결된다.

언뜻 보면 게임에는 문제를 일으키지 않는 것으로 보이지만, 이와 같이 불필요한 컴포넌트 및 에러가 생기지 않도록 스크립트를 잘 관리하도록 하자.

5. MissingReferenceException

해당 오류를 설명하기 위해 간단하게 오류가 발생하는 상황을 만들어 보았다.


몬스터와 닿으면 플레이어(탱크)가 폭발하도록 설계해놨는데, 탱크가 터지면서 오류메시지가 엄청난 양으로 뜨는 것이 보일 것이다. 해당 오류도 골치 아픈 게 어디서 오류가 나는 건지 오류 위치가 안 뜬다는 특징이 있다.

이와 같은 오류가 발생하는 이유에 관해, 코드 내용은 최소한으로 하고 오류 자체의 원인에 대해 알아보고자 한다.


해당 오류가 발생하는 위치는 MonsterController이며, MonsterController의 Update 구문을 이렇게 짜여 있다.

private void Update()
{
    MonsterIsDead();
    if (playerDetected)		// 여기서 문제가 발생
    {
        Trace();
    }
    else
    {
        if(goBackCoroutine ==  null)
        {
             goBackCoroutine = StartCoroutine(Goback());
        }
    }
}

여기에서 문제가 되는 부분은 주석으로 표시했다시피 if 구문에서 발생한다.
if 구문에는 플레이어가 감지되면 플레이어를 쫓아가도록 명령어가 되어 있고, 따라서 target.Position을 계속 쫓도록 설계되어 있다.
하지만 플레이어가 파괴되었을 때 해당 쫓는 과정이 종료되지 않으면, 없는 플레이어의 위치를 찾으려고 할 것이다. 여기에서 발생하는 오류가 MissingReferenceException이다.

그러면 해당 오류를 고치기 위해선 어떡해야 하는가.
플레이어가 죽었을 때는 쫓지 않도록 설정하면 된다.

수정된 코드

private void Update()
{
    MonsterIsDead();
    if (target != null)	// 타겟이 있을 시에만 캐릭터를 쫓는 과정이 실행되도록 함
    {
        if (playerDetected)
        {
            Trace();
        }
        else
        {
            if(goBackCoroutine ==  null)
            {
                goBackCoroutine = StartCoroutine(Goback());
            }
        }
    }
}

Update 함수가 계속해서 실행되고 있기 때문에 1초에 저렇게 많은 오류량이 뜨게 된다. 이런 오류를 해결하지 않은 채 게임을 출시하게 되면 오류 누적으로 게임이 멈추거나 느려지는 등, 상당한 문제가 발생할 수 있으니 유의하도록 한다.

profile
게임 만들러 코딩 공부중

0개의 댓글