@@ -77,7 +77,7 @@ public override void OnNetworkSpawn()
77
77
DoInitialSpawnIfPossible ( ) ;
78
78
79
79
SessionManager < SessionPlayerData > . Instance . OnSessionStarted ( ) ;
80
- m_LifeStateChangedEventMessageSubscriber . Subscribe ( OnLifeStateChangedEventMessage ) ;
80
+ m_Subscription = m_LifeStateChangedEventMessageSubscriber . Subscribe ( OnLifeStateChangedEventMessage ) ;
81
81
}
82
82
}
83
83
@@ -105,10 +105,17 @@ void OnClientDisconnect(ulong clientId)
105
105
if ( clientId != NetworkManager . LocalClientId )
106
106
{
107
107
// If a client disconnects, check for game over in case all other players are already down
108
- CheckForGameOver ( ) ;
108
+ StartCoroutine ( WaitToCheckForGameOver ( ) ) ;
109
109
}
110
110
}
111
111
112
+ IEnumerator WaitToCheckForGameOver ( )
113
+ {
114
+ // Wait until next frame so that the client's player character has despawned
115
+ yield return null ;
116
+ CheckForGameOver ( ) ;
117
+ }
118
+
112
119
public void OnClientSceneChanged ( SceneEvent sceneEvent )
113
120
{
114
121
if ( sceneEvent . SceneEventType != SceneEventType . LoadComplete ) return ;
@@ -140,25 +147,12 @@ public override void OnNetworkDespawn()
140
147
{
141
148
if ( m_NetPortal != null )
142
149
{
150
+ NetworkManager . OnClientDisconnectCallback -= OnClientDisconnect ;
143
151
NetworkManager . SceneManager . OnSceneEvent -= OnClientSceneChanged ;
144
152
}
145
153
m_Subscription ? . Dispose ( ) ;
146
154
}
147
155
148
- /// <summary>
149
- /// Helper method for OnDestroy that gets the NetworkLifeState.OnValueChanged event for a NetworkObjectId, or null if it doesn't exist.
150
- /// </summary>
151
- private NetworkVariable < LifeState > . OnValueChangedDelegate GetLifeStateEvent ( ulong id )
152
- {
153
- //this is all a little paranoid, because during shutdown it's not always obvious what state is still valid.
154
- if ( NetworkManager != null && NetworkManager . SpawnManager != null && NetworkManager . SpawnManager . SpawnedObjects . TryGetValue ( id , out NetworkObject netObj ) && netObj != null )
155
- {
156
- var netState = netObj . GetComponent < NetworkCharacterState > ( ) ;
157
- return netState != null ? netState . NetworkLifeState . LifeState . OnValueChanged : null ;
158
- }
159
- return null ;
160
- }
161
-
162
156
private void SpawnPlayer ( ulong clientId , bool lateJoin )
163
157
{
164
158
Transform spawnPoint = null ;
@@ -259,7 +253,7 @@ void CheckForGameOver()
259
253
// Check the life state of all players in the scene
260
254
foreach ( var serverCharacter in PlayerServerCharacter . GetPlayerServerCharacters ( ) )
261
255
{
262
- // if any player is alive just retun
256
+ // if any player is alive just return
263
257
if ( serverCharacter . NetState && serverCharacter . NetState . LifeState == LifeState . Alive )
264
258
{
265
259
return ;
0 commit comments