Skip to content

Commit 47680f5

Browse files
committed
Some fixes for object instantiated in the server without handler
1 parent 3f34e83 commit 47680f5

5 files changed

Lines changed: 41 additions & 28 deletions

File tree

com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ internal void HandleConnectionApproval(ulong ownerClientId, NetworkManager.Conne
797797
// Server-side spawning (only if there is a prefab hash or player prefab provided)
798798
if (!NetworkManager.DistributedAuthorityMode && response.CreatePlayerObject && (response.PlayerPrefabHash.HasValue || NetworkManager.NetworkConfig.PlayerPrefab != null))
799799
{
800-
var instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(0,Allocator.Temp)));
800+
var instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(16,Allocator.Temp, int.MaxValue)));
801801
var playerObject = response.PlayerPrefabHash.HasValue ? NetworkManager.SpawnManager.GetNetworkObjectToSpawn(response.PlayerPrefabHash.Value, ownerClientId, ref instantiationPayloadWriter, response.Position ?? null, response.Rotation ?? null)
802802
: NetworkManager.SpawnManager.GetNetworkObjectToSpawn(NetworkManager.NetworkConfig.PlayerPrefab.GetComponent<NetworkObject>().GlobalObjectIdHash, ownerClientId, ref instantiationPayloadWriter, response.Position ?? null, response.Rotation ?? null);
803803

@@ -951,7 +951,7 @@ internal void CreateAndSpawnPlayer(ulong ownerId)
951951
if (playerPrefab != null)
952952
{
953953
var globalObjectIdHash = playerPrefab.GetComponent<NetworkObject>().GlobalObjectIdHash;
954-
var instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(0, Allocator.Temp)));
954+
var instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(16, Allocator.Temp, int.MaxValue)));
955955
var networkObject = NetworkManager.SpawnManager.GetNetworkObjectToSpawn(globalObjectIdHash, ownerId, ref instantiationPayloadWriter, playerPrefab.transform.position, playerPrefab.transform.rotation);
956956
networkObject.IsSceneObject = false;
957957
networkObject.SpawnAsPlayerObject(ownerId, networkObject.DestroyWithScene);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,6 +1819,8 @@ internal void SpawnInternal(bool destroyWithScene, ulong ownerClientId, bool pla
18191819
}
18201820
}
18211821

1822+
NetworkManager.PrefabHandler.InjectInstantiationPayload(this);
1823+
18221824
NetworkManager.SpawnManager.SpawnNetworkObjectLocally(this, NetworkManager.SpawnManager.GetNetworkObjectId(), IsSceneObject.HasValue && IsSceneObject.Value, playerObject, ownerClientId, destroyWithScene);
18231825

18241826
if ((NetworkManager.DistributedAuthorityMode && NetworkManager.DAHost) || (!NetworkManager.DistributedAuthorityMode && NetworkManager.IsServer))

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

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,30 @@ public bool RemoveHandler(uint globalObjectIdHash)
226226
/// <returns>true or false</returns>
227227
internal bool ContainsHandler(uint networkPrefabHash) => m_PrefabAssetToPrefabHandler.ContainsKey(networkPrefabHash) || m_PrefabInstanceToPrefabAsset.ContainsKey(networkPrefabHash);
228228

229+
/// <summary>
230+
/// Injects instantiation payload on the networkObject
231+
/// </summary>
232+
/// <param name="networkObject">Injection target</param>
233+
internal void InjectInstantiationPayload(NetworkObject networkObject)
234+
{
235+
if (m_PrefabAssetToPrefabHandler.TryGetValue(networkObject.GlobalObjectIdHash, out var prefabInstanceHandler))
236+
{
237+
if (prefabInstanceHandler is INetworkInstantiationPayloadSynchronizer synchronizer)
238+
{
239+
var fastBufferWriter = new FastBufferWriter(16, Collections.Allocator.Temp, int.MaxValue);
240+
var instantiationPayloadBufferWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(fastBufferWriter));
241+
synchronizer.OnSynchronize(ref instantiationPayloadBufferWriter);
242+
if (fastBufferWriter.Length > 0)
243+
{
244+
unsafe
245+
{
246+
networkObject.InstantiationPayload = new FastBufferReader(fastBufferWriter.GetUnsafePtr(), Collections.Allocator.Persistent, fastBufferWriter.Length);
247+
}
248+
}
249+
}
250+
}
251+
}
252+
229253
/// <summary>
230254
/// Returns the source NetworkPrefab's <see cref="NetworkObject.GlobalObjectIdHash"/>
231255
/// </summary>
@@ -255,35 +279,22 @@ internal uint GetSourceGlobalObjectIdHash(uint networkPrefabHash)
255279
/// <param name="position"></param>
256280
/// <param name="rotation"></param>
257281
/// <returns></returns>
258-
internal NetworkObject HandleNetworkPrefabSpawn<T>(uint networkPrefabAssetHash, ulong ownerClientId, ref BufferSerializer<T> preInstanceDataSerializer, Vector3 position, Quaternion rotation) where T : IReaderWriter
282+
internal NetworkObject HandleNetworkPrefabSpawn<T>(uint networkPrefabAssetHash, ulong ownerClientId, ref BufferSerializer<T> InstantiationPayloadSerializer, Vector3 position, Quaternion rotation) where T : IReaderWriter
259283
{
260284
if (m_PrefabAssetToPrefabHandler.TryGetValue(networkPrefabAssetHash, out var prefabInstanceHandler))
261285
{
262-
if (prefabInstanceHandler is INetworkInstantiationPayloadSynchronizer synchronizer)
286+
if (InstantiationPayloadSerializer.IsReader)
263287
{
264-
synchronizer.OnSynchronize(ref preInstanceDataSerializer);
265-
}
266-
267-
var networkObjectInstance = prefabInstanceHandler.Instantiate(ownerClientId, position, rotation);
268-
269-
if (networkObjectInstance != null)
270-
{
271-
if (preInstanceDataSerializer.IsReader)
272-
{
273-
networkObjectInstance.InstantiationPayload = preInstanceDataSerializer.GetFastBufferReader();
274-
}
275-
else
288+
FastBufferReader instantiationPayloadReader = InstantiationPayloadSerializer.GetFastBufferReader();
289+
bool ShouldSychronize = instantiationPayloadReader.IsInitialized && instantiationPayloadReader.Length > 0;
290+
if (ShouldSychronize && prefabInstanceHandler is INetworkInstantiationPayloadSynchronizer synchronizer)
276291
{
277-
var writer = preInstanceDataSerializer.GetFastBufferWriter();
278-
if (writer.Length > 0)
279-
{
280-
unsafe
281-
{
282-
networkObjectInstance.InstantiationPayload = new FastBufferReader(writer.GetUnsafePtr(), Collections.Allocator.Persistent, writer.Length);
283-
}
284-
}
292+
synchronizer.OnSynchronize(ref InstantiationPayloadSerializer);
285293
}
286294
}
295+
296+
var networkObjectInstance = prefabInstanceHandler.Instantiate(ownerClientId, position, rotation);
297+
287298
//Now we must make sure this alternate PrefabAsset spawned in place of the prefab asset with the networkPrefabAssetHash (GlobalObjectIdHash)
288299
//is registered and linked to the networkPrefabAssetHash so during the HandleNetworkPrefabDestroy process we can identify the alternate prefab asset.
289300
if (networkObjectInstance != null && !m_PrefabInstanceToPrefabAsset.ContainsKey(networkObjectInstance.GlobalObjectIdHash))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ internal NetworkObject InstantiateAndSpawnNoParameterChecks(NetworkObject networ
748748
// - Distributed authority mode always spawns the override if one exists.
749749
if (forceOverride || NetworkManager.IsClient || NetworkManager.DistributedAuthorityMode || NetworkManager.PrefabHandler.ContainsHandler(networkPrefab.GlobalObjectIdHash))
750750
{
751-
var intantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(20, Collections.Allocator.Temp)));
751+
var intantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(16, Collections.Allocator.Temp, int.MaxValue)));
752752
networkObject = GetNetworkObjectToSpawn(networkPrefab.GlobalObjectIdHash, ownerClientId, ref intantiationPayloadWriter, position, rotation);
753753
}
754754
else // Under this case, server instantiate the prefab passed in.

com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
110110
//Test result of registering via GameObject reference
111111
Assert.True(gameObjectRegistered);
112112

113-
var instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(0, Collections.Allocator.Temp)));
113+
var instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(16, Collections.Allocator.Temp, int.MaxValue)));
114114
var spawnedObject = networkPrefabHandler.HandleNetworkPrefabSpawn(baseObject.GlobalObjectIdHash, 0, ref instantiationPayloadWriter, prefabPosition, prefabRotation);
115115

116116
//Test that something was instantiated
@@ -136,7 +136,7 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
136136
prefabPosition = new Vector3(2.0f, 1.0f, 5.0f);
137137
prefabRotation = new Quaternion(4.0f, 1.5f, 5.4f, 5.1f);
138138

139-
instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(0, Collections.Allocator.Temp)));
139+
instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(16, Collections.Allocator.Temp, int.MaxValue)));
140140
spawnedObject = networkPrefabHandler.HandleNetworkPrefabSpawn(baseObject.GlobalObjectIdHash, 0, ref instantiationPayloadWriter, prefabPosition, prefabRotation);
141141

142142
//Test that something was instantiated
@@ -162,7 +162,7 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
162162
prefabPosition = new Vector3(6.0f, 4.0f, 1.0f);
163163
prefabRotation = new Quaternion(3f, 2f, 4f, 1f);
164164

165-
instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(0, Collections.Allocator.Temp)));
165+
instantiationPayloadWriter = new BufferSerializer<BufferSerializerWriter>(new BufferSerializerWriter(new FastBufferWriter(16, Collections.Allocator.Temp, int.MaxValue)));
166166
spawnedObject = networkPrefabHandler.HandleNetworkPrefabSpawn(baseObject.GlobalObjectIdHash, 0, ref instantiationPayloadWriter, prefabPosition, prefabRotation);
167167

168168
//Test that something was instantiated

0 commit comments

Comments
 (0)