이벤트 메서드 구독 해제
public void Initialize()
{
QuestManager.Instance.OnClosed += RefreshQuestUI;
}
public void OnDisable()
{
QuestManager.Instance.OnClosed -= RefreshQuestUI;
}
퀘스트 팝업 UI에서 퀘스트를 완료하고 보상을 받을 때, OnClosed 이벤트가 실행된다. Initialize 메서드에서 퀘스트 UI를 갱신하는 RefreshQuestUI 메서드를 이벤트에 등록하고, 퀘스트 UI가 비활성화될 때 해당 메서드를 해제한다.
- 퀘스트 팝업 UI가 생성될 때마다 Initialize 메서드를 호출
- 퀘스트 수락 버튼을 누를 때도 Initialize 메서드를 다시 호출하였는데 이때, 동일한 메서드가 중복 구독하는 경우가 발생
- 이벤트 핸들러는 델리게이트 체인 형태로 구독된 메서드를 관리하며, 중복 구독을 방지하지 않으므로 비활성화될 때 해제되는 메서드는 하나
- RefreshQuestUI 메서드는 퀘스트 팝업 UI에서 참조하는 게임 오브젝트를 다루고 있음
- 퀘스트 팝업 UI 게임 오브젝트가 파괴되며 구독 해제가 호출되지만 하나가 남아있는 경우, 다음 이벤트 호출 시 오류
- RefreshQuestUI에서 이미 파괴된 오브젝트를 참조하고 있는 변수를 호출하며 MissingReferenceException이 발생
해결
- 퀘스트 UI가 파괴되기 전, 중복으로 구독을 모두 해제
- 이벤트 구독하기 전 미리 해제 : 구독된 메서드가 없는 상태에서 해제를 해도 문제 없음
- 이벤트에 맡기지 않고 직접 메서드 실행