문제원인
게임이 오버되고 재시작하여 플레이어 오브젝트를 파괴하고 재생성을 했다.
이후 장애물과 부딪혔더니 플레이어의 스크립트에 충돌과 관련된 기능을 담당하는 코루틴 부분에서 오류가 발생했다.
오브젝트가 파괴되면 원래 실행중인 코루틴은 자동으로 종료가 된다.
또한 PlayerHitCorutine은 실행될때마다 새롭게 할당을 하기 때문에 이해가 가지않았다.
오브젝트가 파괴되었어도 새롭게 생성후 다시 코루틴 변수 할당을 해주는데 해당 오류가 뜬 원인이 무엇일까.
해결방안
해당 문제의 원인을 마이크로소프트의 프로그래밍 가이드에서 알수 있었다.
이벤트를 구독하고 있는 개체를 삭제하기 전에 이번트 구독을 취소하는 것을 명시하고있다.
즉, 플레이어 오브젝트를 제거하기전에, 해당 오브젝트에 연결된 이벤트들의 구독을 취소하라는 의미이다.
이벤트 구독을 취소하기전까지 멀티캐스트 대리자가 해당 이벤트를 참조하고있는데, 이것이 참조되어있다면, 가비지가
수집되기 전까지 구독자 개체가 삭제되지 않는것이다.
따라서, 가비지 수집전에 오브젝트가 제거 되었다면, 해당 오브젝트에 구독자 개체가 삭제되지않을 가능성이 존재한다.
내 경우에는 오브젝트 충돌시 PlayerHitEvent을 실행하도록 코드를 구성하였다.
또한, 플레이어 컨트롤러 스크립트에서 PlayerHitEvent에 PlayerHit 함수를 구독시켜,
PlayerHitEvent 호출시 PalyerHitCorutine이 실행되도록 했었는데,
오브젝트 파괴후에 구독 연결이 풀리지않았던 것이다.
오브젝트 파괴시 해당 이벤트 구독을 취소하는 것으로 문제를 해결했다.
3줄 요약
1. 플레이어 파괴후 재생성 후에 장애물과 부딪혔더니, 플레이어 오브젝트가 파괴되어 코루틴을 실행할 수 없다는
오류가 발생함.
2. 마이크로소프트 메뉴얼을 찾아본 결과, 오브젝트가 파괴되어도 이벤트 구독이 해제되지 않을 수 있다는 사실을
알게됨.
3. 오브젝트 파괴시 이벤트 구독을 해제하도록 코드를 수정하여 문제를 해결함.
'Unity > 2D' 카테고리의 다른 글
유니티 Input system 특정 입력 무시하는 방법 (0) | 2024.12.06 |
---|---|
유니티 2D 콜라이더 합치기 (0) | 2024.08.17 |
유니티 2D RuleTile 규칙 유의사항 (0) | 2024.08.15 |
파괴하는 도중에 오브젝트 생성 오류 (0) | 2024.07.03 |
Unity Photon Pun2 연결하는 방법 (0) | 2024.01.15 |