EasyCastleUNITY

길건너 친구들 모작 개발일지10 ( 씬 초기화 테스트, 이벤트와 관련된 Error) 본문

3D 프로젝트 개발 일지(Crossy Road, 한글명: 길건너 친구들)

길건너 친구들 모작 개발일지10 ( 씬 초기화 테스트, 이벤트와 관련된 Error)

EasyCastleT 2023. 10. 5. 22:40

죽으면 다시 원래 위치로 플레이어가 돌아가고, 맵도 바뀌어야 합니다. 

맵은 애초에 생성이 랜덤이고, 플레이어의 위치는 초기시작 위치가 되어야 하기에, 

가장 간단한 방법은 같은 씬을 다시 한번 로드하는 방법입니다. 

 

그래서 이 씬 로드를 테스트 해보았습니다.

시연영상

스페이스바를 누르면 씬이 초기화 되도록 했습니다. 

초기화가 잘 실행됩니다. 

그런데, 움직이는 순간 MissingReferenceException 오류가 발생했습니다. 

 


Error 이유

Error 로그를 잘 읽어보니, Animator와  InputActions가 사라져서 생기는 문제였습니다. 

여러 군데 로그를 찍어보며 확인해보니, 

위에 부분들에서 발생하는 문제였습니다. 

위에 코드에서 performed와 canceled에 이벤트를 등록합니다. 

하지만, 삭제하는 부분이 존재하지 않는데, 여기서 문제가 발생하였습니다. 

 

바로 씬이 다시 로드되며, 예전 씬에서 있던 Animator와 PlayerInput들이 사라졌지만, 

이미 등록된 이벤트들은 여전히 남아있기에, 이 등록된 이벤트들은 이미 사라진 Animator와 PlayerInput에 접근합니다.  

이런 과정에서 MissingRefernceException 오류가 발생하게 됩니다. 

 

그렇기에 씬이 초기화 될때, 기존에 있는 이벤트들을 해제할 필요가 있습니다. 

오류 해결

익명 메서드를 통해 이벤트를 등록했는데, 이벤트를 해제하기 위해, 별도의 이벤트 메서드로 분리했습니다.

만든 이벤트 메서드
이벤트 등록

그리고 유니티 이벤트 내에서 OnDestroy는 Destroy 될때 호출이 되는데,

씬이 초기화 되며, 모든 게임오브젝트들은 Destory됩니다.

그러면서 OnDestory를 호출하기에, 이 메서드 내에서 이벤트를 해제 시킵니다. 

이벤트 해제

이제 다시 시행해보겠습니다.

초기화가 된 것을 로그로 찍어서 초기화한 것을 보여주었습니다. 

이렇게 위에서 발생한 Error가 해결된 것을 볼 수 있습니다. 

 

이렇게 씬 전환 테스트를 마쳤습니다.