메인 씬에서 스테이지 씬으로 이동했다가 다시 메인 씬으로 돌아오면
MissingReferenceException: The object of type 'Button' 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.
위 오류가 발생했다.
MissingReferenceException은 말 그대로 참조한 객체를 잃었을 때 발생하는 건데
현재 접근하려는 오브젝트가 파괴됐는데 접근하려 해서 발생하는 것이다.
DataManager라는 스크립트에는 Action onQuest를 가지고 있는 Quest 클래스가 있었는데 해당 Action을 메인 씬에 있는 QuestUI가 구독을 하고 퀘스트 상태가 변경되면 호출하도록 구현해 뒀다.
여기서 문제는 QuestUI는 씬이 변경되면 파괴되는 오브젝트였는데, 씬을 스테이지 씬으로 이동했다가 다시 메인 씬으로 돌아와서 onQuest를 호출하면 이전 씬에서 파괴될 때 구독을 해제하지 않아서 델리게이트 체인에 남아있던 함수가 호출되면서 이전 메인 씬에서 파괴된 오브젝트들을 참조해서 발생한 문제였다.
이걸 해결하기 위해서
OnDestroy에 구독을 해제하는 함수를 작성했지만 제대로 끊어지지 않아서
계속해서 오류가 발생했다.
OnDisable에 구독을 해제하는 함수를 작성했지만 제대로 끊어지지 않아서
계속해서 오류가 발생했다.
Action을 null로 만들어서 Action을 초기화 했더니 오류가 해결됐다.
하지만..
팀원이 새로운 오류를 발견했다.
게임이 종료될 때 DataManager가 먼저 파괴되면서 OnDisable이 호출될 때 파괴된 DataManager를 참조하면서 NullReferenceException 오류가 발생했다.
발견한 팀원이 Action을 초기화 해주는 시점을 씬이 전환될 때로 변경해서 오류를 해결했습니다.