내일배움캠프/프로젝트

팀 프로젝트 - 게임 종료후 씬 이동 문제 해결

서보훈 2024. 12. 26. 21:11

씬 문제가 발생하던 이유

  1. NetworkSceneManager 를 사용하지 않고 씬을 넘길경우, 이전씬에서 생성한 NetworkObject 들이 디스폰되지 않아서 이후 같은 씬을 불러오면 디스폰되지 않은 오브젝트들이 남아있음
  2. 씬을 넘기고 즉시 서버 연결을 종료할경우, 클라이언트측에서 씬 로드가 끝나기 전에 연결이 끊기면서 문제가 발생할 가능성이 높음
  3. Addictive 형태로 로드하였기 때문에 씬의 언로드와 로드가 순차적으로 이루어져야하는데, 양측 모두가 로드, 언로드가 끝났음을 알기 힘듬
  4. 하나의 메서드에서 처리를 시도하면 먼저 시작한 처리만 작동함
//이 두 메서드를 이런식으로 호출하면 LoadScene만 처리됨
NetworkManager.Singleton.SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
NetworkManager.Singleton.SceneManager.UnloadScene(currentScene);

 

문제 해결 과정

  1. NetworkManager에서 Shutdown 메서드를 실행하면, 생성한 NetworkObject들이 모두 디스폰됨
  2. 로비 씬을 굳이 NetworkSceneManager를 통해 이동할 필요는 없다고 생각됨
  3. 결과창을 UI형태로 만든 상태, 해당 UI를 띄운 상태로 Exit 버튼을 누르면 로비로 나가도록 설계
  4. PlayScene 을 유지한 상태로 연결을 먼저 끊은 뒤, SceneManager를 통해 개별적으로 씬을 변경하도록 변경
/// <summary>
/// Escape : 승리, Dead : 패배, Error : 연결 끊김
/// </summary>
/// <param name="isClear"></param>
public void Gameover(ResultType resultType)
{
    IsGameover = true;
    NetworkConnectController.Instance.ExitVivoxChennel();
    //NetworkSceneChanger.Instance.NetworkChangeScene("ResultScene");

    LoadingSceneController.Instance.ShowResult(resultType);

    NetworkConnectController.Instance.ShutDownHost();

    Cursor.lockState = CursorLockMode.None;
    Cursor.visible = true;
}

 

씬을 유지한 상태로 연결을 먼저 끊으면 네트워크 오브젝트로 인한 문제도 발생하지 않고, 클라이언트의 씬 로드를 기다려줄 필요가 없음을 너무 뒤늦게 생각해낸것 같습니다.