Skip to content

Commit ae785df

Browse files
fix: scene loading issue when shutting down [MTT-2828] (#610)
* Adding parameter to decide if we load through NetworkSceneManager or SceneManager
1 parent ff04a3c commit ae785df

8 files changed

Lines changed: 29 additions & 19 deletions

File tree

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:4c11f84c175b1dd9496d25f84bd4e0c29ca64c90df9346d1f26578dfef5523f6
3-
size 56409
2+
oid sha256:8396657ee40387e39344857a6fdaf264df857bf1386f7f766e830dfc97b2270e
3+
size 56639

Assets/BossRoom/Scripts/Client/UI/PostGameUI.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using UnityEngine;
22
using TMPro;
3+
using Unity.Multiplayer.Samples.BossRoom.Shared;
4+
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
35
using Unity.Multiplayer.Samples.Utilities;
46
using Unity.Netcode;
57

@@ -34,6 +36,14 @@ public class PostGameUI : MonoBehaviour
3436
[SerializeField]
3537
private Color m_LoseLightColor;
3638

39+
ApplicationController m_ApplicationController;
40+
41+
[Inject]
42+
void InjectDependencies(ApplicationController applicationController)
43+
{
44+
m_ApplicationController = applicationController;
45+
}
46+
3747
void Start()
3848
{
3949
// only hosts can restart the game, other players see a wait message
@@ -75,18 +85,14 @@ void SetPostGameUI(WinState winState)
7585
public void OnPlayAgainClicked()
7686
{
7787
// this should only ever be called by the Host - so just go ahead and switch scenes
78-
SceneLoaderWrapper.Instance.LoadScene("CharSelect");
88+
SceneLoaderWrapper.Instance.LoadScene("CharSelect", useNetworkSceneManager: true);
7989

8090
// FUTURE: could be improved to better support a dedicated server architecture
8191
}
8292

8393
public void OnMainMenuClicked()
8494
{
85-
// Player is leaving this group - leave current network connection first
86-
var gameNetPortal = GameObject.FindGameObjectWithTag("GameNetPortal").GetComponent<GameNetPortal>();
87-
gameNetPortal.RequestDisconnect();
88-
89-
SceneLoaderWrapper.Instance.LoadScene("MainMenu");
95+
m_ApplicationController.LeaveSession(true);
9096
}
9197
}
9298
}

Assets/BossRoom/Scripts/DebugCheats/DebugCheatsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ void TogglePortalsServerRpc(ServerRpcParams serverRpcParams = default)
283283
[ServerRpc(RequireOwnership = false)]
284284
void GoToPostGameServerRpc(ServerRpcParams serverRpcParams = default)
285285
{
286-
SceneLoaderWrapper.Instance.LoadScene("PostGame", LoadSceneMode.Single);
286+
SceneLoaderWrapper.Instance.LoadScene("PostGame", useNetworkSceneManager: true);
287287
LogCheatUsedClientRPC(serverRpcParams.Receive.SenderClientId, "GoToPostGame");
288288
}
289289

Assets/BossRoom/Scripts/Server/Game/State/ServerBossRoomState.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ private IEnumerator CoroGameOver(float wait, bool gameWon)
259259

260260
SetWinState(gameWon ? WinState.Win : WinState.Loss);
261261

262-
SceneLoaderWrapper.Instance.LoadScene("PostGame");
262+
SceneLoaderWrapper.Instance.LoadScene("PostGame", useNetworkSceneManager: true);
263263
}
264264
}
265265
}

Assets/BossRoom/Scripts/Server/Game/State/ServerCharSelectState.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void SaveLobbyResults()
176176
IEnumerator WaitToEndLobby()
177177
{
178178
yield return new WaitForSeconds(3);
179-
SceneLoaderWrapper.Instance.LoadScene("BossRoom");
179+
SceneLoaderWrapper.Instance.LoadScene("BossRoom", useNetworkSceneManager: true);
180180
}
181181

182182
public override void OnNetworkDespawn()

Assets/BossRoom/Scripts/Shared/ApplicationController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public void LeaveSession(bool UserRequested)
126126
gameNetPortal.RequestDisconnect();
127127
}
128128
}
129-
SceneLoaderWrapper.Instance.LoadScene("MainMenu");
129+
SceneLoaderWrapper.Instance.LoadScene("MainMenu", useNetworkSceneManager: false);
130130
}
131131

132132
public void QuitGame()

Assets/BossRoom/Scripts/Shared/Net/ConnectionManagement/ServerGameNetPortal.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ void ServerStartedHandler()
295295

296296
//The "BossRoom" server always advances to CharSelect immediately on start. Different games
297297
//may do this differently.
298-
SceneLoaderWrapper.Instance.LoadScene("CharSelect");
298+
SceneLoaderWrapper.Instance.LoadScene("CharSelect", useNetworkSceneManager: true);
299299
}
300300

301301
}

Packages/com.unity.multiplayer.samples.coop/Utilities/SceneManagement/SceneLoaderWrapper.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,20 +70,24 @@ public void AddOnSceneEventCallback()
7070
/// method also triggers the start of the loading screen.
7171
/// </summary>
7272
/// <param name="sceneName">Name or path of the Scene to load.</param>
73+
/// <param name="useNetworkSceneManager">If true, uses NetworkSceneManager, else uses SceneManager</param>
7374
/// <param name="loadSceneMode">If LoadSceneMode.Single then all current Scenes will be unloaded before loading.</param>
74-
public void LoadScene(string sceneName, LoadSceneMode loadSceneMode = LoadSceneMode.Single)
75+
public void LoadScene(string sceneName, bool useNetworkSceneManager, LoadSceneMode loadSceneMode = LoadSceneMode.Single)
7576
{
76-
if (IsSpawned && IsNetworkSceneManagementEnabled && !NetworkManager.ShutdownInProgress)
77+
if (useNetworkSceneManager)
7778
{
78-
if (NetworkManager.IsServer)
79+
if (IsSpawned && IsNetworkSceneManagementEnabled && !NetworkManager.ShutdownInProgress)
7980
{
80-
// If is active server and NetworkManager uses scene management, load scene using NetworkManager's SceneManager
81-
NetworkManager.SceneManager.LoadScene(sceneName, loadSceneMode);
81+
if (NetworkManager.IsServer)
82+
{
83+
// If is active server and NetworkManager uses scene management, load scene using NetworkManager's SceneManager
84+
NetworkManager.SceneManager.LoadScene(sceneName, loadSceneMode);
85+
}
8286
}
8387
}
8488
else
8589
{
86-
// If offline, load using SceneManager
90+
// Load using SceneManager
8791
var loadOperation = SceneManager.LoadSceneAsync(sceneName, loadSceneMode);
8892
if (loadSceneMode == LoadSceneMode.Single)
8993
{

0 commit comments

Comments
 (0)