Skip to content

Commit 2578615

Browse files
Merge branch 'experimental/v3-x-x/hybrid_spawn_integration_tests' into local/merging-kitty-tests-poc-merge
2 parents 9bd899c + d07687d commit 2578615

27 files changed

Lines changed: 240 additions & 105 deletions

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 14 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,13 +1354,19 @@ private bool CanStart(StartType type)
13541354
/// The world instance assigned to this NetworkManager instance.
13551355
/// </summary>
13561356
public NetcodeWorld NetcodeWorld { get; internal set; }
1357-
private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType)
1357+
1358+
internal void InitializeNetcodeWorld()
13581359
{
1360+
if (NetcodeWorld != null)
1361+
{
1362+
return;
1363+
}
1364+
13591365
if (this == Singleton)
13601366
{
13611367
if (NetCode.Netcode.IsActive)
13621368
{
1363-
NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point.");
1369+
NetworkLog.LogInfo($"[{nameof(InitializeNetcodeWorld)}] Netcode is not active but has an instance at this point.");
13641370
}
13651371
/// !! Important !!
13661372
/// Clear out any pre-existing configuration in the event this applicatioin instance has already been connected to a session.
@@ -1371,42 +1377,6 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType
13711377
/// Worlds are created here: <see cref="UnifiedBootStrap.Initialize"/>
13721378
UnifiedBootstrap.CurrentNetworkManagerForInitialization = this;
13731379
DefaultWorldInitialization.Initialize("Default World", false);
1374-
1375-
// This should not be needed at this point, but this is here in the event something changes.
1376-
if (NetworkConfig.Prefabs.HasPendingGhostPrefabs)
1377-
{
1378-
NetworkLog.LogWarning($"[{nameof(WaitForHybridPrefabRegistration)}] !!!!! (Ghosts are still pending registration) !!!!!");
1379-
var waitTime = new WaitForSeconds(0.016f);
1380-
while (NetworkConfig.Prefabs.HasPendingGhostPrefabs)
1381-
{
1382-
NetworkConfig.Prefabs.RegisterGhostPrefabs(this);
1383-
yield return waitTime;
1384-
}
1385-
}
1386-
1387-
if (LogLevel <= LogLevel.Developer)
1388-
{
1389-
NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] All hybrid prefabs have been registered!");
1390-
NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Finalizing NetworkManager start...");
1391-
}
1392-
switch (startType)
1393-
{
1394-
case StartType.Server:
1395-
{
1396-
InternalStartServer();
1397-
break;
1398-
}
1399-
case StartType.Host:
1400-
{
1401-
InternalStartHost();
1402-
break;
1403-
}
1404-
case StartType.Client:
1405-
{
1406-
InternalStartClient();
1407-
break;
1408-
}
1409-
}
14101380
}
14111381

14121382
private bool UnifiedIsConfiguredCorrectly()
@@ -1470,8 +1440,8 @@ public bool StartServer()
14701440
{
14711441
Debug.Log("Creating world: Default world");
14721442
}
1473-
StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server));
1474-
return true;
1443+
InitializeNetcodeWorld();
1444+
return InternalStartServer();
14751445
}
14761446
else
14771447
{
@@ -1555,9 +1525,8 @@ public bool StartClient()
15551525
{
15561526
Debug.Log("Creating world: Default world");
15571527
}
1558-
StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client));
1559-
// TODO-UNIFIED: Need a way to signal everything completed.
1560-
return true;
1528+
InitializeNetcodeWorld();
1529+
return InternalStartClient();
15611530
}
15621531
else
15631532
{
@@ -1640,9 +1609,8 @@ public bool StartHost()
16401609
{
16411610
Debug.Log("Creating world: Default world");
16421611
}
1643-
StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host));
1644-
// TODO-UNIFIED: Need a way to signal everything completed.
1645-
return true;
1612+
InitializeNetcodeWorld();
1613+
return InternalStartHost();
16461614
}
16471615
else
16481616
{

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,12 @@ public void SpawnAsPlayerObject(ulong clientId, bool destroyWithScene = false)
20722072
/// <param name="destroy">(true) the <see cref="GameObject"/> will be destroyed (false) the <see cref="GameObject"/> will persist after being despawned</param>
20732073
public void Despawn(bool destroy = true)
20742074
{
2075+
#if UNIFIED_NETCODE
2076+
if (HasGhost && destroy == false)
2077+
{
2078+
throw new NotSupportedException("Despawn without destroy is not supported for hybrid objects.");
2079+
}
2080+
#endif
20752081
if (!IsSpawned)
20762082
{
20772083
if (NetworkManager.LogLevel <= LogLevel.Error)

com.unity.netcode.gameobjects/Runtime/Messaging/DeferredMessageManager.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ protected virtual void PurgeTrigger(IDeferredNetworkMessageManager.TriggerType t
125125
triggerInfo.TriggerData.Dispose();
126126
}
127127

128+
public bool HasAnyOfTrigger(IDeferredNetworkMessageManager.TriggerType trigger)
129+
{
130+
if (m_Triggers.TryGetValue(trigger, out var triggers))
131+
{
132+
return triggers.Count != 0;
133+
}
134+
135+
return false;
136+
}
137+
128138
public virtual void ProcessTriggers(IDeferredNetworkMessageManager.TriggerType trigger, ulong key)
129139
{
130140
if (m_Triggers.TryGetValue(trigger, out var triggers))
@@ -143,6 +153,11 @@ public virtual void ProcessTriggers(IDeferredNetworkMessageManager.TriggerType t
143153
triggerInfo.TriggerData.Dispose();
144154
}
145155
}
156+
157+
if (trigger != IDeferredNetworkMessageManager.TriggerType.OnOtherTriggerFinishedProcessing)
158+
{
159+
ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnOtherTriggerFinishedProcessing, (ulong)trigger);
160+
}
146161
}
147162

148163
/// <summary>

com.unity.netcode.gameobjects/Runtime/Messaging/IDeferredNetworkMessageManager.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ internal enum TriggerType
1111
#if UNIFIED_NETCODE
1212
OnGhostSpawned,
1313
#endif
14+
OnOtherTriggerFinishedProcessing,
1415
}
1516

1617
/// <summary>
@@ -31,6 +32,8 @@ internal enum TriggerType
3132

3233
public void ProcessTriggers(TriggerType trigger, ulong key);
3334

35+
public bool HasAnyOfTrigger(IDeferredNetworkMessageManager.TriggerType trigger);
36+
3437
/// <summary>
3538
/// Cleans up any trigger that's existed for more than a second.
3639
/// These triggers were probably for situations where a request was received after a despawn rather than before a spawn.

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/SceneEventMessage.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ internal struct SceneEventMessage : INetworkMessage
88

99
public SceneEventData EventData;
1010

11+
private const string k_Name = "SceneEventMessage";
1112

1213
private FastBufferReader m_ReceivedData;
1314

@@ -18,6 +19,15 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
1819

1920
public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int receivedMessageVersion)
2021
{
22+
var networkManager = (NetworkManager)context.SystemOwner;
23+
#if UNIFIED_NETCODE
24+
if (networkManager.DeferredMessageManager.HasAnyOfTrigger(IDeferredNetworkMessageManager.TriggerType
25+
.OnGhostSpawned))
26+
{
27+
networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnOtherTriggerFinishedProcessing, (ulong)IDeferredNetworkMessageManager.TriggerType.OnGhostSpawned, reader, ref context, k_Name);
28+
return false;
29+
}
30+
#endif
2131
m_ReceivedData = reader;
2232
return true;
2333
}

com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,6 @@ internal void HandleIncomingData(ulong clientId, ArraySegment<byte> data, float
228228
{
229229
unsafe
230230
{
231-
232-
//Debug.Log($"Receiving {data.Count} bytes: {ByteArrayToString(data.Array, data.Offset, data.Count)}");
233231
fixed (byte* dataPtr = data.Array)
234232
{
235233
var batchReader = new FastBufferReader(dataPtr + data.Offset, Allocator.None, data.Count);
@@ -872,7 +870,6 @@ internal unsafe void ProcessSendQueues()
872870

873871
try
874872
{
875-
//Debug.Log($"Sending {queueItem.Writer.Length} bytes: {ByteArrayToString(queueItem.Writer.ToArray(), 0, queueItem.Writer.Length)}");
876873
m_Sender.Send(clientId, queueItem.NetworkDelivery, queueItem.Writer);
877874

878875
for (var hookIdx = 0; hookIdx < m_Hooks.Count; ++hookIdx)

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkPrefabHandler.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3+
#if UNIFIED_NETCODE
4+
using Unity.NetCode;
5+
#endif
36
using UnityEngine;
47

58
namespace Unity.Netcode
@@ -418,6 +421,19 @@ public void AddNetworkPrefab(GameObject prefab)
418421
{
419422
m_NetworkManager.DeferredMessageManager.ProcessTriggers(IDeferredNetworkMessageManager.TriggerType.OnAddPrefab, networkObject.GlobalObjectIdHash);
420423
}
424+
425+
#if UNIFIED_NETCODE
426+
if (m_NetworkManager.IsListening)
427+
{
428+
var ghost = prefab.GetComponent<GhostAdapter>();
429+
if (ghost)
430+
{
431+
m_NetworkManager.InitializeNetcodeWorld();
432+
NetCode.Netcode.RegisterPrefabSingleWorld(prefab, m_NetworkManager.IsHost,
433+
m_NetworkManager.NetcodeWorld);
434+
}
435+
}
436+
#endif
421437
}
422438

423439
/// <summary>

com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/UnifiedNetworkTransformTest.cs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,33 +40,9 @@ protected override IEnumerator OnSetup()
4040
// Creates the hybrid prefab
4141
m_Prefab = CreateHybridPrefab("HybridPrefab", true);
4242
m_Prefab.AddComponent<DoNothingNetworkTransform>();
43-
NetworkSpawnManager.RegisterPendingGhost = RegisterPendingGhost;
4443
return base.OnSetup();
4544
}
46-
47-
protected override IEnumerator OnTearDown()
48-
{
49-
NetworkSpawnManager.RegisterPendingGhost = null;
50-
m_EnableVerboseDebug = false;
51-
return base.OnTearDown();
52-
}
53-
54-
private void RegisterPendingGhost(NetworkObject networkObject, ulong networkObjectId)
55-
{
56-
var ghost = networkObject.GetComponent<GhostAdapter>();
57-
Assert.IsNotNull(ghost, $"[RegisterPendingGhost][NetworkObject-{networkObjectId}] Has no {nameof(GhostAdapter)}!");
58-
foreach (var networkManager in m_NetworkManagers)
59-
{
60-
// If the world matches, then register the instance with this NetworkManager's spawn manager.
61-
if (networkManager.NetcodeWorld == ghost.World)
62-
{
63-
networkManager.SpawnManager.RegisterGhostPendingSpawn(networkObject, networkObjectId);
64-
return;
65-
}
66-
}
67-
Debug.LogError($"Did not find a world for NetworkObject-{networkObjectId}!!");
68-
}
69-
45+
7046
protected override void OnServerAndClientsCreated()
7147
{
7248

0 commit comments

Comments
 (0)