Skip to content

Commit 459c041

Browse files
authored
feat!: OnNetworkSpawn / OnNetworkDespawn (#865)
* feat!: rename NetworkStart to OnNetworkSpawn, add OnNetworkDespawn * test: spawn/despawn function tests * fix: set target framerate for test * refactor: format * refactor: Use object instead of gameobject qualifier * refactor: use waituntil instead of for loop in enumerator * refactor: remove unecessary error logs in multiinstance tests. * fix: Fix random movement * test: remove no longer necessary target framerate code from tests * fix: destroy network instance helpers in test
1 parent 376ed36 commit 459c041

26 files changed

+283
-68
lines changed

com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ private void Awake()
188188
m_Transform = transform;
189189
}
190190

191-
public override void NetworkStart()
191+
public override void OnNetworkSpawn()
192192
{
193193
void SetupVar<T>(NetworkVariable<T> v, T initialValue, ref T oldVal)
194194
{

com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,6 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId)
295295
/// </summary>
296296
public ulong OwnerClientId => NetworkObject.OwnerClientId;
297297

298-
internal bool NetworkStartInvoked = false;
299-
internal bool InternalNetworkStartInvoked = false;
300-
301298
/// <summary>
302299
/// Stores the network tick at the NetworkBehaviourUpdate time
303300
/// This allows sending NetworkVariables not more often than once per network tick, regardless of the update rate
@@ -307,22 +304,32 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId)
307304
/// <summary>
308305
/// Gets called when message handlers are ready to be registered and the network is setup
309306
/// </summary>
310-
public virtual void NetworkStart() { }
307+
public virtual void OnNetworkSpawn() { }
311308

312309
/// <summary>
313-
/// Gets called when message handlers are ready to be registered and the network is setup. Provides a Payload if it was provided
310+
/// Gets called when the <see cref="NetworkObject"/> gets spawned, message handlers are ready to be registered and the network is setup. Provides a Payload if it was provided
314311
/// </summary>
315312
/// <param name="stream">The stream containing the spawn payload</param>
316-
public virtual void NetworkStart(Stream stream)
313+
public virtual void OnNetworkSpawn(Stream stream)
317314
{
318-
NetworkStart();
315+
OnNetworkSpawn();
319316
}
320317

321-
internal void InternalNetworkStart()
318+
/// <summary>
319+
/// Gets called when the <see cref="NetworkObject"/> gets de-spawned. Is called both on the server and clients.
320+
/// </summary>
321+
public virtual void OnNetworkDespawn() { }
322+
323+
internal void InternalOnNetworkSpawn()
322324
{
323325
InitializeVariables();
324326
}
325327

328+
internal void InternalOnNetworkDespawn()
329+
{
330+
331+
}
332+
326333
/// <summary>
327334
/// Gets called when the local client gains ownership of this object
328335
/// </summary>

com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,7 @@ internal void OnClientDisconnectFromServer(ulong clientId)
14781478
if (PrefabHandler.ContainsHandler(ConnectedClients[clientId].PlayerObject.GlobalObjectIdHash))
14791479
{
14801480
PrefabHandler.HandleNetworkPrefabDestroy(ConnectedClients[clientId].PlayerObject);
1481-
SpawnManager.OnDestroyObject(ConnectedClients[clientId].PlayerObject.NetworkObjectId, false);
1481+
SpawnManager.OnDespawnObject(ConnectedClients[clientId].PlayerObject.NetworkObjectId, false);
14821482
}
14831483
else
14841484
{
@@ -1496,7 +1496,7 @@ internal void OnClientDisconnectFromServer(ulong clientId)
14961496
if (PrefabHandler.ContainsHandler(ConnectedClients[clientId].OwnedObjects[i].GlobalObjectIdHash))
14971497
{
14981498
PrefabHandler.HandleNetworkPrefabDestroy(ConnectedClients[clientId].OwnedObjects[i]);
1499-
SpawnManager.OnDestroyObject(ConnectedClients[clientId].OwnedObjects[i].NetworkObjectId, false);
1499+
SpawnManager.OnDespawnObject(ConnectedClients[clientId].OwnedObjects[i].NetworkObjectId, false);
15001500
}
15011501
else
15021502
{

com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ private void OnDestroy()
397397
{
398398
if (NetworkManager != null && NetworkManager.SpawnManager != null && NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(NetworkObjectId))
399399
{
400-
NetworkManager.SpawnManager.OnDestroyObject(NetworkObjectId, false);
400+
NetworkManager.SpawnManager.OnDespawnObject(NetworkObjectId, false);
401401
}
402402
}
403403

@@ -504,33 +504,21 @@ internal void InvokeBehaviourOnGainedOwnership()
504504
}
505505
}
506506

507-
internal void ResetNetworkStartInvoked()
507+
internal void InvokeBehaviourNetworkSpawn(Stream stream)
508508
{
509-
if (ChildNetworkBehaviours != null)
509+
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
510510
{
511-
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
512-
{
513-
ChildNetworkBehaviours[i].NetworkStartInvoked = false;
514-
}
511+
ChildNetworkBehaviours[i].InternalOnNetworkSpawn();
512+
ChildNetworkBehaviours[i].OnNetworkSpawn(stream);
515513
}
516514
}
517515

518-
internal void InvokeBehaviourNetworkSpawn(Stream stream)
516+
internal void InvokeBehaviourNetworkDespawn()
519517
{
520518
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
521519
{
522-
//We check if we are it's NetworkObject owner incase a NetworkObject exists as a child of our NetworkObject
523-
if (!ChildNetworkBehaviours[i].NetworkStartInvoked)
524-
{
525-
if (!ChildNetworkBehaviours[i].InternalNetworkStartInvoked)
526-
{
527-
ChildNetworkBehaviours[i].InternalNetworkStart();
528-
ChildNetworkBehaviours[i].InternalNetworkStartInvoked = true;
529-
}
530-
531-
ChildNetworkBehaviours[i].NetworkStart(stream);
532-
ChildNetworkBehaviours[i].NetworkStartInvoked = true;
533-
}
520+
ChildNetworkBehaviours[i].InternalOnNetworkDespawn();
521+
ChildNetworkBehaviours[i].OnNetworkDespawn();
534522
}
535523
}
536524

@@ -698,7 +686,7 @@ internal void SerializeSceneObject(NetworkWriter writer, ulong targetClientId)
698686
// If our current buffer position is greater than our positionBeforeNetworkVariableData then we wrote NetworkVariable data
699687
// Part 1: This will include the total NetworkVariable data size, if there was NetworkVariable data written, to the stream
700688
// in order to be able to skip past this entry on the deserialization side in the event this NetworkObject fails to be
701-
// constructed (See Part 2 below in the DeserializeSceneObject method)
689+
// constructed (See Part 2 below in the DeserializeSceneObject method)
702690
if (buffer.Position > positionBeforeNetworkVariableData)
703691
{
704692
// Store our current stream buffer position

com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public void HandleDestroyObject(ulong clientId, Stream stream)
187187
using (var reader = PooledNetworkReader.Get(stream))
188188
{
189189
ulong networkId = reader.ReadUInt64Packed();
190-
NetworkManager.SpawnManager.OnDestroyObject(networkId, true);
190+
NetworkManager.SpawnManager.OnDespawnObject(networkId, true);
191191
}
192192
}
193193

com.unity.multiplayer.mlapi/Runtime/NetworkVariable/NetworkVariable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public void ReadField(Stream stream)
210210
/// <inheritdoc />
211211
public void WriteField(Stream stream)
212212
{
213-
using (var writer = PooledNetworkWriter.Get(stream))
213+
using (var writer = PooledNetworkWriter.Get(stream))
214214
{
215215
writer.WriteObjectPacked(m_InternalValue); //BOX
216216
}

com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,6 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo
332332
}
333333
}
334334

335-
networkObject.ResetNetworkStartInvoked();
336-
337335
if (readPayload)
338336
{
339337
using (var payloadBuffer = PooledNetworkBuffer.Get())
@@ -452,7 +450,7 @@ internal void DespawnObject(NetworkObject networkObject, bool destroyObject = fa
452450
throw new NotServerException("Only server can despawn objects");
453451
}
454452

455-
OnDestroyObject(networkObject.NetworkObjectId, destroyObject);
453+
OnDespawnObject(networkObject.NetworkObjectId, destroyObject);
456454
}
457455

458456
// Makes scene objects ready to be reused
@@ -490,7 +488,7 @@ internal void ServerDestroySpawnedSceneObjects()
490488
if (NetworkManager.PrefabHandler != null && NetworkManager.PrefabHandler.ContainsHandler(sobj))
491489
{
492490
NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(sobj);
493-
OnDestroyObject(sobj.NetworkObjectId, false);
491+
OnDespawnObject(sobj.NetworkObjectId, false);
494492
}
495493
else
496494
{
@@ -514,7 +512,7 @@ internal void DestroyNonSceneObjects()
514512
{
515513
NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(networkObjects[i]);
516514

517-
OnDestroyObject(networkObjects[i].NetworkObjectId, false);
515+
OnDespawnObject(networkObjects[i].NetworkObjectId, false);
518516
}
519517
else
520518
{
@@ -538,7 +536,7 @@ internal void DestroySceneObjects()
538536
if (NetworkManager.PrefabHandler.ContainsHandler(networkObjects[i]))
539537
{
540538
NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(networkObjects[i]);
541-
OnDestroyObject(networkObjects[i].NetworkObjectId, false);
539+
OnDespawnObject(networkObjects[i].NetworkObjectId, false);
542540
}
543541
else
544542
{
@@ -599,21 +597,21 @@ internal void ClientCollectSoftSyncSceneObjectSweep(NetworkObject[] networkObjec
599597
}
600598
}
601599

602-
internal void OnDestroyObject(ulong networkId, bool destroyGameObject)
600+
internal void OnDespawnObject(ulong networkId, bool destroyGameObject)
603601
{
604602
if (NetworkManager == null)
605603
{
606604
return;
607605
}
608606

609607
//Removal of spawned object
610-
if (!SpawnedObjects.TryGetValue(networkId, out NetworkObject sobj))
608+
if (!SpawnedObjects.TryGetValue(networkId, out NetworkObject networkObject))
611609
{
612610
Debug.LogWarning($"Trying to destroy object {networkId} but it doesn't seem to exist anymore!");
613611
return;
614612
}
615613

616-
if (!sobj.IsOwnedByServer && !sobj.IsPlayerObject && NetworkManager.Singleton.ConnectedClients.TryGetValue(sobj.OwnerClientId, out NetworkClient networkClient))
614+
if (!networkObject.IsOwnedByServer && !networkObject.IsPlayerObject && NetworkManager.Singleton.ConnectedClients.TryGetValue(networkObject.OwnerClientId, out NetworkClient networkClient))
617615
{
618616
//Someone owns it.
619617
for (int i = networkClient.OwnedObjects.Count - 1; i > -1; i--)
@@ -625,7 +623,8 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject)
625623
}
626624
}
627625

628-
sobj.IsSpawned = false;
626+
networkObject.IsSpawned = false;
627+
networkObject.InvokeBehaviourNetworkDespawn();
629628

630629
if (NetworkManager != null && NetworkManager.IsServer)
631630
{
@@ -641,7 +640,7 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject)
641640
var rpcQueueContainer = NetworkManager.RpcQueueContainer;
642641
if (rpcQueueContainer != null)
643642
{
644-
if (sobj != null)
643+
if (networkObject != null)
645644
{
646645
// As long as we have any remaining clients, then notify of the object being destroy.
647646
if (NetworkManager.ConnectedClientsList.Count > 0)
@@ -668,14 +667,14 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject)
668667
}
669668
}
670669

671-
var gobj = sobj.gameObject;
670+
var gobj = networkObject.gameObject;
672671

673672
if (destroyGameObject && gobj != null)
674673
{
675-
if (NetworkManager.PrefabHandler.ContainsHandler(sobj))
674+
if (NetworkManager.PrefabHandler.ContainsHandler(networkObject))
676675
{
677-
NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(sobj);
678-
OnDestroyObject(networkId, false);
676+
NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(networkObject);
677+
OnDespawnObject(networkId, false);
679678
}
680679
else
681680
{
@@ -688,7 +687,7 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject)
688687
// of the function
689688
if (SpawnedObjects.Remove(networkId))
690689
{
691-
SpawnedObjectsList.Remove(sobj);
690+
SpawnedObjectsList.Remove(networkObject);
692691
}
693692
}
694693
}

com.unity.multiplayer.mlapi/Tests/Runtime/MultiInstance/RPCTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public IEnumerator TestRPCs()
6565
// Start the instances
6666
if (!MultiInstanceHelpers.Start(true, server, clients))
6767
{
68-
Debug.LogError("Failed to start instances");
6968
Assert.Fail("Failed to start instances");
7069
}
7170

com.unity.multiplayer.mlapi/Tests/Runtime/NetworkObject.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)