Skip to content

Commit d07687d

Browse files
committed
Added hybrid spawning to a bunch of existing tests and fixed most of the issues that fell out of that.
1 parent 59f8208 commit d07687d

27 files changed

Lines changed: 239 additions & 106 deletions

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

Lines changed: 13 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,13 +1322,18 @@ private bool CanStart(StartType type)
13221322
public NetcodeWorld NetcodeWorld { get; internal set; }
13231323

13241324
#if UNIFIED_NETCODE
1325-
private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType startType)
1325+
internal void InitializeNetcodeWorld()
13261326
{
1327+
if (NetcodeWorld != null)
1328+
{
1329+
return;
1330+
}
1331+
13271332
if (this == Singleton)
13281333
{
13291334
if (NetCode.Netcode.IsActive)
13301335
{
1331-
NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Netcode is not active but has an instance at this point.");
1336+
NetworkLog.LogInfo($"[{nameof(InitializeNetcodeWorld)}] Netcode is not active but has an instance at this point.");
13321337
}
13331338
/// !! Important !!
13341339
/// Clear out any pre-existing configuration in the event this applicatioin instance has already been connected to a session.
@@ -1339,42 +1344,6 @@ private System.Collections.IEnumerator WaitForHybridPrefabRegistration(StartType
13391344
/// Worlds are created here: <see cref="UnifiedBootStrap.Initialize"/>
13401345
UnifiedBootStrap.CurrentNetworkManagerForInitialization = this;
13411346
DefaultWorldInitialization.Initialize("Default World", false);
1342-
1343-
// This should not be needed at this point, but this is here in the event something changes.
1344-
if (NetworkConfig.Prefabs.HasPendingGhostPrefabs)
1345-
{
1346-
NetworkLog.LogWarning($"[{nameof(WaitForHybridPrefabRegistration)}] !!!!! (Ghosts are still pending registration) !!!!!");
1347-
var waitTime = new WaitForSeconds(0.016f);
1348-
while (NetworkConfig.Prefabs.HasPendingGhostPrefabs)
1349-
{
1350-
NetworkConfig.Prefabs.RegisterGhostPrefabs(this);
1351-
yield return waitTime;
1352-
}
1353-
}
1354-
1355-
if (LogLevel <= LogLevel.Developer)
1356-
{
1357-
NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] All hybrid prefabs have been registered!");
1358-
NetworkLog.LogInfo($"[{nameof(WaitForHybridPrefabRegistration)}] Finalizing NetworkManager start...");
1359-
}
1360-
switch (startType)
1361-
{
1362-
case StartType.Server:
1363-
{
1364-
InternalStartServer();
1365-
break;
1366-
}
1367-
case StartType.Host:
1368-
{
1369-
InternalStartHost();
1370-
break;
1371-
}
1372-
case StartType.Client:
1373-
{
1374-
InternalStartClient();
1375-
break;
1376-
}
1377-
}
13781347
}
13791348

13801349
private bool UnifiedIsConfiguredCorrectly()
@@ -1442,8 +1411,8 @@ public bool StartServer()
14421411
{
14431412
Debug.Log("Creating world: Default world");
14441413
}
1445-
StartCoroutine(WaitForHybridPrefabRegistration(StartType.Server));
1446-
return true;
1414+
InitializeNetcodeWorld();
1415+
return InternalStartServer();
14471416
}
14481417
else
14491418
{
@@ -1529,9 +1498,8 @@ public bool StartClient()
15291498
{
15301499
Debug.Log("Creating world: Default world");
15311500
}
1532-
StartCoroutine(WaitForHybridPrefabRegistration(StartType.Client));
1533-
// TODO-UNIFIED: Need a way to signal everything completed.
1534-
return true;
1501+
InitializeNetcodeWorld();
1502+
return InternalStartClient();
15351503
}
15361504
else
15371505
{
@@ -1616,9 +1584,8 @@ public bool StartHost()
16161584
{
16171585
Debug.Log("Creating world: Default world");
16181586
}
1619-
StartCoroutine(WaitForHybridPrefabRegistration(StartType.Host));
1620-
// TODO-UNIFIED: Need a way to signal everything completed.
1621-
return true;
1587+
InitializeNetcodeWorld();
1588+
return InternalStartHost();
16221589
}
16231590
else
16241591
{

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,6 +2005,12 @@ public void SpawnAsPlayerObject(ulong clientId, bool destroyWithScene = false)
20052005
/// <param name="destroy">(true) the <see cref="GameObject"/> will be destroyed (false) the <see cref="GameObject"/> will persist after being despawned</param>
20062006
public void Despawn(bool destroy = true)
20072007
{
2008+
#if UNIFIED_NETCODE
2009+
if (HasGhost && destroy == false)
2010+
{
2011+
throw new NotSupportedException("Despawn without destroy is not supported for hybrid objects.");
2012+
}
2013+
#endif
20082014
if (!IsSpawned)
20092015
{
20102016
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 & 4 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);
@@ -396,7 +394,6 @@ public void HandleMessage(in NetworkMessageHeader header, FastBufferReader reade
396394
};
397395

398396
var type = m_ReverseTypeMap[header.MessageType];
399-
Debug.Log($"Got message of type {type}");
400397
if (!CanReceive(senderId, type, reader, ref context))
401398
{
402399
return;
@@ -873,7 +870,6 @@ internal unsafe void ProcessSendQueues()
873870

874871
try
875872
{
876-
//Debug.Log($"Sending {queueItem.Writer.Length} bytes: {ByteArrayToString(queueItem.Writer.ToArray(), 0, queueItem.Writer.Length)}");
877873
m_Sender.Send(clientId, queueItem.NetworkDelivery, queueItem.Writer);
878874

879875
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
@@ -39,33 +39,9 @@ protected override IEnumerator OnSetup()
3939
// Creates the hybrid prefab
4040
m_Prefab = CreateHybridPrefab("HybridPrefab", true);
4141
m_Prefab.AddComponent<DoNothingNetworkTransform>();
42-
NetworkSpawnManager.RegisterPendingGhost = RegisterPendingGhost;
4342
return base.OnSetup();
4443
}
45-
46-
protected override IEnumerator OnTearDown()
47-
{
48-
NetworkSpawnManager.RegisterPendingGhost = null;
49-
m_EnableVerboseDebug = false;
50-
return base.OnTearDown();
51-
}
52-
53-
private void RegisterPendingGhost(NetworkObject networkObject, ulong networkObjectId)
54-
{
55-
var ghost = networkObject.GetComponent<GhostAdapter>();
56-
Assert.IsNotNull(ghost, $"[RegisterPendingGhost][NetworkObject-{networkObjectId}] Has no {nameof(GhostAdapter)}!");
57-
foreach (var networkManager in m_NetworkManagers)
58-
{
59-
// If the world matches, then register the instance with this NetworkManager's spawn manager.
60-
if (networkManager.NetcodeWorld == ghost.World)
61-
{
62-
networkManager.SpawnManager.RegisterGhostPendingSpawn(networkObject, networkObjectId);
63-
return;
64-
}
65-
}
66-
Debug.LogError($"Did not find a world for NetworkObject-{networkObjectId}!!");
67-
}
68-
44+
6945
protected override void OnServerAndClientsCreated()
7046
{
7147

0 commit comments

Comments
 (0)