유니티 Unity

[유니티(Unity)] MissingReferenceException: the object of type 'GameObject' has been destroyed but you are still trying to access it. your script should either check if it is null or you should not destroy the object 에러 해결 방법

한비 2023. 7. 7. 16:41
반응형

MissingReferenceException

현재 접근하려는 오브젝트가 파괴되었는데 접근하려고 해서 참조할 수 없다는 에러 메시지다. 

 

내 경우 문제가 발생한 배경은 다음과 같다.

Awake에서 Destroy와 DontDestroyOnLoad를 활용해 데이터 저장 프리펩 오브젝트를 씬에 하나만 남겼고, 데이터 저장 시 애니메이션을 출력하기 위해 자식 오브젝트로 UI 오브젝트를 두었다. 데이터 저장 시 자식 오브젝트를 활성화하여 애니메이션을 출력하고, 애니메이션이 끝나면 자식 오브젝트를 비활성화한다. 데이터를 저장할 때마다 위 과정을 반복한다.

 

이를 위해 자식 오브젝트를 처음에는 public 오브젝트로 두고 인스펙터 창에서 연결해두었는데, 씬 전환 후 데이터를 저장하려고 하자 위 오류가 떴다. 파괴된 오브젝트의 참조를 갖고 있어서 문제가 생긴 것 같아, Find를 이용해 데이터 저장 함수 실행 시 현재 존재하는 (파괴되지 않은, 새로 이동한 씬에 있는) 게임 오브젝트를 찾아 참조하는 식으로 변경하였다. 이렇게 하니 SetActive(true)는 정상적으로 작동했는데, 동일한 MissingReferenceException으로 인해 오브젝트를 끄기 위한 코루틴 호출에 실패하는 문제가 생겼다.

 

코루틴을 갖고 있던 GameObject 객체가 파괴된 후 새로 만들어진 객체에서 코루틴을 실행하려고 해서 생긴 문제로 파악되어 코루틴을 public으로 변경하고, 새로 생긴 객체의 스크립트 컴포넌트를 GetComponent로 가져온 후 코루틴을 호출하는 식으로 변경했다. 이렇게 하니 모두 정상적으로 작동하는 것을 확인했다. 

 

Find와 Get문을 사용해서 해결한거라 성능 상의 문제가 걱정되지만... 인스펙터 창에서 연결한 참조로 해결하는 방법을 나중에 찾게 된다면 추가해두겠다. 

dataManager = GameObject.Find("DataManager");
DataAnimation = dataManager.transform.GetChild(0).GetChild(0).gameObject;
DataAnimation.SetActive(true);
dataManager.GetComponent<DataManager>().StartCoroutine(Anim_off());

 

반응형