diff --git a/Assets/Scripts/ConnectionManagement/ConnectionManager.cs b/Assets/Scripts/ConnectionManagement/ConnectionManager.cs
index d1e98e7b0..813618b54 100644
--- a/Assets/Scripts/ConnectionManagement/ConnectionManager.cs
+++ b/Assets/Scripts/ConnectionManagement/ConnectionManager.cs
@@ -93,8 +93,7 @@ void Start()
m_CurrentState = m_Offline;
- NetworkManager.OnClientConnectedCallback += OnClientConnectedCallback;
- NetworkManager.OnClientDisconnectCallback += OnClientDisconnectCallback;
+ NetworkManager.OnConnectionEvent += OnConnectionEvent;
NetworkManager.OnServerStarted += OnServerStarted;
NetworkManager.ConnectionApprovalCallback += ApprovalCheck;
NetworkManager.OnTransportFailure += OnTransportFailure;
@@ -103,8 +102,7 @@ void Start()
void OnDestroy()
{
- NetworkManager.OnClientConnectedCallback -= OnClientConnectedCallback;
- NetworkManager.OnClientDisconnectCallback -= OnClientDisconnectCallback;
+ NetworkManager.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.OnServerStarted -= OnServerStarted;
NetworkManager.ConnectionApprovalCallback -= ApprovalCheck;
NetworkManager.OnTransportFailure -= OnTransportFailure;
@@ -123,14 +121,17 @@ internal void ChangeState(ConnectionState nextState)
m_CurrentState.Enter();
}
- void OnClientDisconnectCallback(ulong clientId)
+ void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
- m_CurrentState.OnClientDisconnect(clientId);
- }
-
- void OnClientConnectedCallback(ulong clientId)
- {
- m_CurrentState.OnClientConnected(clientId);
+ switch (connectionEventData.EventType)
+ {
+ case ConnectionEvent.ClientConnected:
+ m_CurrentState.OnClientConnected(connectionEventData.ClientId);
+ break;
+ case ConnectionEvent.ClientDisconnected:
+ m_CurrentState.OnClientDisconnect(connectionEventData.ClientId);
+ break;
+ }
}
void OnServerStarted()
diff --git a/Assets/Scripts/Gameplay/GameState/ServerBossRoomState.cs b/Assets/Scripts/Gameplay/GameState/ServerBossRoomState.cs
index 3eb16ad6d..ca0610fd1 100644
--- a/Assets/Scripts/Gameplay/GameState/ServerBossRoomState.cs
+++ b/Assets/Scripts/Gameplay/GameState/ServerBossRoomState.cs
@@ -79,7 +79,7 @@ void OnNetworkSpawn()
m_PersistentGameState.Reset();
m_LifeStateChangedEventMessageSubscriber.Subscribe(OnLifeStateChangedEventMessage);
- NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnect;
+ NetworkManager.Singleton.OnConnectionEvent += OnConnectionEvent;
NetworkManager.Singleton.SceneManager.OnLoadEventCompleted += OnLoadEventCompleted;
NetworkManager.Singleton.SceneManager.OnSynchronizeComplete += OnSynchronizeComplete;
@@ -93,7 +93,7 @@ void OnNetworkDespawn()
m_LifeStateChangedEventMessageSubscriber.Unsubscribe(OnLifeStateChangedEventMessage);
}
- NetworkManager.Singleton.OnClientDisconnectCallback -= OnClientDisconnect;
+ NetworkManager.Singleton.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.Singleton.SceneManager.OnLoadEventCompleted -= OnLoadEventCompleted;
NetworkManager.Singleton.SceneManager.OnSynchronizeComplete -= OnSynchronizeComplete;
}
@@ -138,12 +138,15 @@ void OnLoadEventCompleted(string sceneName, LoadSceneMode loadSceneMode, List
public float LocalProgress
{
- get => IsSpawned && ProgressTrackers.ContainsKey(NetworkManager.LocalClientId) ?
- ProgressTrackers[NetworkManager.LocalClientId].Progress.Value : m_LocalProgress;
+ get => IsSpawned && ProgressTrackers.ContainsKey(NetworkManager.LocalClientId) ? ProgressTrackers[NetworkManager.LocalClientId].Progress.Value : m_LocalProgress;
private set
{
if (IsSpawned && ProgressTrackers.ContainsKey(NetworkManager.LocalClientId) && ProgressTrackers[NetworkManager.LocalClientId].IsSpawned)
@@ -69,18 +68,17 @@ public override void OnNetworkSpawn()
{
if (IsServer)
{
- NetworkManager.OnClientConnectedCallback += AddTracker;
- NetworkManager.OnClientDisconnectCallback += RemoveTracker;
- AddTracker(NetworkManager.LocalClientId);
+ NetworkManager.OnConnectionEvent += OnConnectionEvent;
}
}
+
public override void OnNetworkDespawn()
{
if (IsServer)
{
- NetworkManager.OnClientConnectedCallback -= AddTracker;
- NetworkManager.OnClientDisconnectCallback -= RemoveTracker;
+ NetworkManager.OnConnectionEvent -= OnConnectionEvent;
}
+
ProgressTrackers.Clear();
onTrackersUpdated?.Invoke();
}
@@ -120,9 +118,30 @@ void ClientUpdateTrackersRpc()
}
}
}
+
onTrackersUpdated?.Invoke();
}
+ void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
+ {
+ if (IsServer)
+ {
+ switch (connectionEventData.EventType)
+ {
+ case ConnectionEvent.ClientConnected:
+ {
+ AddTracker(connectionEventData.ClientId);
+ break;
+ }
+ case ConnectionEvent.ClientDisconnected:
+ {
+ RemoveTracker(connectionEventData.ClientId);
+ break;
+ }
+ }
+ }
+ }
+
void AddTracker(ulong clientId)
{
if (IsServer)
@@ -141,9 +160,7 @@ void RemoveTracker(ulong clientId)
{
if (ProgressTrackers.ContainsKey(clientId))
{
- var tracker = ProgressTrackers[clientId];
ProgressTrackers.Remove(clientId);
- tracker.NetworkObject.Despawn();
ClientUpdateTrackersRpc();
}
}
diff --git a/Packages/com.unity.multiplayer.samples.coop/Utilities/SceneManagement/ServerAdditiveSceneLoader.cs b/Packages/com.unity.multiplayer.samples.coop/Utilities/SceneManagement/ServerAdditiveSceneLoader.cs
index b955b13eb..13559c884 100644
--- a/Packages/com.unity.multiplayer.samples.coop/Utilities/SceneManagement/ServerAdditiveSceneLoader.cs
+++ b/Packages/com.unity.multiplayer.samples.coop/Utilities/SceneManagement/ServerAdditiveSceneLoader.cs
@@ -54,7 +54,7 @@ public override void OnNetworkSpawn()
{
// Adding this to remove all pending references to a specific client when they disconnect, since objects
// that are destroyed do not generate OnTriggerExit events.
- NetworkManager.OnClientDisconnectCallback += RemovePlayer;
+ NetworkManager.OnConnectionEvent += OnConnectionEvent;
NetworkManager.SceneManager.OnSceneEvent += OnSceneEvent;
m_PlayersInTrigger = new List();
@@ -65,7 +65,7 @@ public override void OnNetworkDespawn()
{
if (IsServer)
{
- NetworkManager.OnClientDisconnectCallback -= RemovePlayer;
+ NetworkManager.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.SceneManager.OnSceneEvent -= OnSceneEvent;
}
}
@@ -136,11 +136,14 @@ void FixedUpdate()
}
}
- void RemovePlayer(ulong clientId)
+ void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
- // remove all references to this clientId. There could be multiple references if a single client owns
- // multiple NetworkObjects with the m_PlayerTag, or if this script's GameObject has overlapping colliders
- while (m_PlayersInTrigger.Remove(clientId)) { }
+ if (connectionEventData.EventType == ConnectionEvent.ClientDisconnected)
+ {
+ // remove all references to this clientId. There could be multiple references if a single client owns
+ // multiple NetworkObjects with the m_PlayerTag, or if this script's GameObject has overlapping colliders
+ while (m_PlayersInTrigger.Remove(connectionEventData.ClientId)) { }
+ }
}
IEnumerator WaitToUnloadCoroutine()