뒤끝 초보입니다. 로그인ui 에러좀 봐주세요!ㅠㅜ

문의를 남기실 경우 다음 항목을 작성해 주시면 빠른 답변 처리에 도움이 됩니다.

  • 프로젝트명 : 개인 프로젝트
  • 뒤끝SDK 버전 : 5.4.5
  • 에러 코드 :
    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.
    LoginUI.b__23_1 () (at Assets/Scripts/UI/LogIn/LoginUI.cs:239)
    Battlehub.Dispatcher.Dispatcher.Update () (at Assets/Battlehub/Dispatcher/Dispatcher.cs:75)

안녕학세요.
뒤끝 매치 예제 게임 [TheBackendMatch]을 똑같이 사용해서 로그인부터, 로비, 인게임 직전까지 구현하고 있는데요.
로그인씬-> 로비씬으로 전환한 뒤 바로 위의 에러가 뜹니다. 에러가 발생하는 곳은 LogInUI 스크립트의 아래 함수 부분입니다.

void ChangeLobbyScene()
{
if (fadeObject != null)
{
GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby, (bool isDone) =>
{
// 에러가 나는 부분입니다.
Dispatcher.Current.BeginInvoke(() => loadingObject.transform.Rotate(0, 0, -10));
if (isDone)
{
fadeObject.ProcessFadeOut();
}
});
}
else
{
GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby);
}
}
에러관련해서 디버깅 해보니, Dispatcher쪽은 문제가 없었고, loadingObject 로딩오브젝트를 여러번 정상적으로
디버깅 해주다가 갑자기 Null이 됩니다. 해당 오류를 계속 고쳐보다가 아래처럼 바꾸니 에러가 나지 않았습니다.

// loadingObject 의 로테이션 부븐을 빼니 문제가 해결됨.
Dispatcher.Current.BeginInvoke(() =>
{
if (isDone)
{
fadeObject.ProcessFadeOut();
}
});

loadingObject 를 정상적으로 가져오다가 에러가나는 문제여서 처음에는 로딩오브젝트는 정상적으로 인식하는 것 같고,
void Update()
{
loadingObject.transform.Rotate(0, 0, -10);
}
업데이트에서 해당 오브젝트를 똑같이 로테이션 시켰을때도 문제없이 작동했습니다.
loadingObject를 삭제하거나 하는 내용도 없는데 이런 에러가 나서 글 남기게 되었습니다.

GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby, (bool isDone) =>
{
Dispatcher.Current.BeginInvoke(() => loadingObject.transform.Rotate(0, 0, -10));

질문 1. 위의 코드 내용이 “게임매니저에서 로비씬으로 바뀔떄까지 로딩오브젝트를 로테이션 시켜라” 가 맞나요?
질문 2. Dispatcher.Current.BeginInvoke(() => 여기서 로딩오브젝트의 로테이션 부분을 빼도 문제가 없을까요?

긴 글 읽어주셔서 정말 감사합니다.ㅠㅜ

안녕하세요 개발자님.

1.네 맞습니다. 해당 에러가 발생하는 부분은 예제 게임의 설계 미스로 로비씬이 변경되었음에도 코드에서는 로그인씬에서의 LoadingObject를 접근하려고 해서 발생하는 에러입니다.

해당 부분 이용에 불편을 드려 죄송합니다.

현재는 모두 아래 코드와 같이 2번째 인자값 Action을 사용하지 않고 해당 코드가 작동중이니 참고해주시면 감사하겠습니다.

GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby);
  1. 네. 해당 코드는 씬이 전환중이라고 UI로 표시해주는 코드로, 필요가 없으시다면 빼셔도 무관합니다.

헉! 설계 미스는 생각하지 못했네요!ㅠ

혹시 지금 뒤끝 홈페이지에서 [뒤끝매치 예제 게임]을 받으면 개선 버젼으로 받아볼 수 있는건가요?
그리고 제가 예제와 똑같이 만드는 중인데, 개선판에서 수정된 내용들을 따로 볼수있는 방법도 있을까요? (제 프로젝트에도 똑같이 변경해줘야 하기 때문에)

별도의 수정된 버전은 없으며, 예제 게임의 경우 로그인 씬에서는 fadeObject가 null이기에 if문에 의해 해당 함수가 호출됩니다.

GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby);

그러므로 아래 함수를 다음과 같이 바꾸어주면 에러가 발생하지 않으니 참고해주시면 감사하겠습니다.

수정 전

void ChangeLobbyScene()
{
if (fadeObject != null)
{
GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby, (bool isDone) =>
{
// **에러가 나는 부분입니다.**
Dispatcher.Current.BeginInvoke(() => loadingObject.transform.Rotate(0, 0, -10));
if (isDone)
{
fadeObject.ProcessFadeOut();
}
});
}
else
{
GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby);
}
}

수정 후

void ChangeLobbyScene()
{
GameManager.GetInstance().ChangeState(GameManager.GameState.MatchLobby);

}
좋아요 1