Skip to content

Commit

Permalink
refactor!: moving scene code out of ServerObjectManager
Browse files Browse the repository at this point in the history
NetworkSceneManager now controls ServerObjectManager directly, rather than ServerObjectManager listening for events.

This change will make it more clear what NetworkSceneManager is doing, and make it easier to create custom scene stuff if required

BREAKING CHANGE: NetworkSceneManager now requires a reference to ServerObjectManager in the inspector
  • Loading branch information
James-Frowen committed Apr 10, 2023
1 parent 6b89619 commit f2b3938
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 35 deletions.
2 changes: 1 addition & 1 deletion Assets/Mirage/Editor/NetworkMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public static GameObject CreateNetworkManager()

var serverObjectManager = go.GetComponent<ServerObjectManager>();
serverObjectManager.Server = networkServer;
serverObjectManager.NetworkSceneManager = nsm;
nsm.ServerObjectManager = serverObjectManager;

var clientObjectManager = go.GetComponent<ClientObjectManager>();
clientObjectManager.Client = networkClient;
Expand Down
12 changes: 8 additions & 4 deletions Assets/Mirage/Runtime/NetworkSceneManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,9 @@ public class NetworkSceneManager : MonoBehaviour

[Header("Setup Settings")]

[FormerlySerializedAs("client")]
public NetworkClient Client;

[FormerlySerializedAs("server")]
public NetworkServer Server;
public ServerObjectManager ServerObjectManager;

[Tooltip("Should server send all additive scenes to new clients when they join?")]
public bool SendAdditiveScenesOnAuthenticate = true;
Expand Down Expand Up @@ -607,6 +605,10 @@ internal void OnServerFinishedSceneLoad(Scene scene, SceneOperation operation)

Server.SendToAll(new SceneReadyMessage());

// clean up and invoke server functions before user events
Server.World.RemoveDestroyedObjects();
ServerObjectManager.SpawnOrActivate();

OnServerFinishedSceneChange?.Invoke(scene, operation);
}

Expand All @@ -624,7 +626,7 @@ protected internal virtual void OnServerPlayerDisconnected(INetworkPlayer discon
}

/// <summary>
/// default ready handler.
/// default ready handler. called on server
/// </summary>
/// <param name="player"></param>
/// <param name="msg"></param>
Expand All @@ -634,6 +636,8 @@ private void HandlePlayerSceneReady(INetworkPlayer player, SceneReadyMessage msg

player.SceneIsReady = true;

// invoke server functions before user events
ServerObjectManager.SpawnVisibleObjects(player, false, (HashSet<NetworkIdentity>)null);
OnPlayerSceneReady.Invoke(player);
}

Expand Down
37 changes: 11 additions & 26 deletions Assets/Mirage/Runtime/ServerObjectManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
using Mirage.RemoteCalls;
using Mirage.Serialization;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Serialization;
using Object = UnityEngine.Object;

namespace Mirage
Expand Down Expand Up @@ -48,11 +46,7 @@ public class ServerObjectManager : MonoBehaviour
/// </summary>
private static HashSet<NetworkIdentity> _setCache = new HashSet<NetworkIdentity>();

[FormerlySerializedAs("server")]
public NetworkServer Server;
[FormerlySerializedAs("networkSceneManager")]
public NetworkSceneManager NetworkSceneManager;

private bool _hasSetup;

[Header("Authentication")]
Expand All @@ -79,12 +73,6 @@ public void Setup()
Server.Started.AddListener(OnServerStarted);
Server.OnStartHost.AddListener(StartedHost);
Server.Stopped.AddListener(OnServerStopped);

if (NetworkSceneManager != null)
{
NetworkSceneManager.OnServerFinishedSceneChange.AddListener(OnFinishedSceneChange);
NetworkSceneManager.OnPlayerSceneReady.AddListener(SpawnVisibleObjects);
}
}

private void Start()
Expand Down Expand Up @@ -120,30 +108,27 @@ private void OnServerStopped()
_nextNetworkId = 1;
}

private void OnFinishedSceneChange(Scene scene, SceneOperation sceneOperation)
internal void SpawnOrActivate()
{
Server.World.RemoveDestroyedObjects();
if (!Server || !Server.Active)
{
logger.LogWarning("SpawnOrActivate called when server was not active");
return;
}

SpawnOrActivate();
}
SpawnSceneObjects();

private void SpawnOrActivate()
{
if (Server && Server.Active)
// host mode?
if (Server.LocalClientActive)
{
SpawnObjects();

// host mode?
if (Server.LocalClientActive)
{
StartHostClientObjects();
}
StartHostClientObjects();
}
}

/// <summary>
/// Loops spawned collection for NetworkIdentities that are not IsClient and calls StartClient().
/// </summary>
// todo can this function be removed? do we only need to run it when host connects?
private void StartHostClientObjects()
{
foreach (var identity in Server.World.SpawnedIdentities)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public override void ExtraSetup()
sceneManager.Client = client;
sceneManager.Server = server;

serverObjectManager.NetworkSceneManager = sceneManager;
sceneManager.ServerObjectManager = serverObjectManager;
clientObjectManager.NetworkSceneManager = sceneManager;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public override void ExtraSetup()
serverSceneManager.Server = server;
clientSceneManager.Client = client;

serverObjectManager.NetworkSceneManager = serverSceneManager;
serverSceneManager.ServerObjectManager = serverObjectManager;
clientObjectManager.NetworkSceneManager = clientSceneManager;

Debug.Assert(SceneManager.sceneCount == 1, "scene count should be 1 at start of NetworkSceneManager Test");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,9 @@ private void ParseForServerMode()
networkSceneManager.Server = server;

serverObjectManager.Server = server;
serverObjectManager.NetworkSceneManager = networkSceneManager;
serverObjectManager.Start();
serverObjectManager.Setup();

networkSceneManager.ServerObjectManager = serverObjectManager;

var spawner = serverGo.GetComponent<CharacterSpawner>();
spawner.ServerObjectManager = serverObjectManager;
Expand Down

0 comments on commit f2b3938

Please sign in to comment.