씬 문제가 발생하던 이유
- NetworkSceneManager 를 사용하지 않고 씬을 넘길경우, 이전씬에서 생성한 NetworkObject 들이 디스폰되지 않아서 이후 같은 씬을 불러오면 디스폰되지 않은 오브젝트들이 남아있음
- 씬을 넘기고 즉시 서버 연결을 종료할경우, 클라이언트측에서 씬 로드가 끝나기 전에 연결이 끊기면서 문제가 발생할 가능성이 높음
- Addictive 형태로 로드하였기 때문에 씬의 언로드와 로드가 순차적으로 이루어져야하는데, 양측 모두가 로드, 언로드가 끝났음을 알기 힘듬
- 하나의 메서드에서 처리를 시도하면 먼저 시작한 처리만 작동함
//이 두 메서드를 이런식으로 호출하면 LoadScene만 처리됨
NetworkManager.Singleton.SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
NetworkManager.Singleton.SceneManager.UnloadScene(currentScene);
문제 해결 과정
- NetworkManager에서 Shutdown 메서드를 실행하면, 생성한 NetworkObject들이 모두 디스폰됨
- 로비 씬을 굳이 NetworkSceneManager를 통해 이동할 필요는 없다고 생각됨
- 결과창을 UI형태로 만든 상태, 해당 UI를 띄운 상태로 Exit 버튼을 누르면 로비로 나가도록 설계
- 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;
}
씬을 유지한 상태로 연결을 먼저 끊으면 네트워크 오브젝트로 인한 문제도 발생하지 않고, 클라이언트의 씬 로드를 기다려줄 필요가 없음을 너무 뒤늦게 생각해낸것 같습니다.
'내일배움캠프 > 프로젝트' 카테고리의 다른 글
팀 프로젝트 - 로비 개선 (0) | 2024.12.27 |
---|---|
팀 프로젝트 - 게임 오버 메커니즘 (0) | 2024.12.24 |
팀 프로젝트 - 퍼즐 정보 관련 인터페이스화 (0) | 2024.12.23 |
팀 프로젝트 - 퍼즐 관련 멀티플레이 연결 (1) | 2024.12.19 |
팀 프로젝트 - 유령 배치, Navmesh 동적 생성 (0) | 2024.12.17 |