Skip to content

Commit 43e8ff4

Browse files
committed
Review Changes
1) Moved the payload deserialization into the AddSceneObject, for deferred instantiation compatibility 2) Changed the new interface to be a direct single extended implementation, instead a complement of the handler 3) Some renames to better match what the feature does for developers
1 parent a103e49 commit 43e8ff4

5 files changed

Lines changed: 39 additions & 43 deletions

File tree

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

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2981,8 +2981,8 @@ public void Serialize(FastBufferWriter writer)
29812981

29822982
if (HasInstantiationPayload)
29832983
{
2984-
if (NetworkManager.Singleton.PrefabHandler.TryGetPayloadSynchronizer(Hash, out INetworkInstantiationPayloadSynchronizer synchronizer))
2985-
synchronizer.OnSynchronize(ref bufferSerializer);
2984+
if (NetworkManager.Singleton.PrefabHandler.TryGetPrefabInstanceHandlerWithData(Hash, out INetworkPrefabInstanceHandlerWithData synchronizer))
2985+
synchronizer.OnSynchronizeInstantiationData(ref bufferSerializer);
29862986
}
29872987

29882988
OwnerObject.SynchronizeNetworkBehaviours(ref bufferSerializer, TargetClientId);
@@ -3041,15 +3041,6 @@ public void Deserialize(FastBufferReader reader)
30413041
// The NetworkSceneHandle is the server-side relative
30423042
// scene handle that the NetworkObject resides in.
30433043
reader.ReadValue(out NetworkSceneHandle);
3044-
3045-
if (HasInstantiationPayload)
3046-
{
3047-
if (NetworkManager.Singleton.PrefabHandler.TryGetPayloadSynchronizer(Hash, out INetworkInstantiationPayloadSynchronizer synchronizer))
3048-
{
3049-
var instantiationPayloadBufferReader = new BufferSerializer<BufferSerializerReader>(new BufferSerializerReader(reader));
3050-
synchronizer.OnSynchronize(ref instantiationPayloadBufferReader);
3051-
}
3052-
}
30533044
}
30543045
}
30553046

@@ -3236,6 +3227,18 @@ internal SceneObject GetMessageSceneObject(ulong targetClientId = NetworkManager
32363227
/// <returns>The deserialized NetworkObject or null if deserialization failed</returns>
32373228
internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBufferReader reader, NetworkManager networkManager, bool invokedByMessage = false)
32383229
{
3230+
var bufferSerializer = new BufferSerializer<BufferSerializerReader>(new BufferSerializerReader(reader));
3231+
3232+
//Synchronize the instantiation payload if needed
3233+
if (sceneObject.HasInstantiationPayload)
3234+
{
3235+
if (NetworkManager.Singleton.PrefabHandler.TryGetPrefabInstanceHandlerWithData(sceneObject.Hash, out INetworkPrefabInstanceHandlerWithData handler))
3236+
{
3237+
var instantiationPayloadBufferReader = new BufferSerializer<BufferSerializerReader>(new BufferSerializerReader(reader));
3238+
handler.OnSynchronizeInstantiationData(ref instantiationPayloadBufferReader);
3239+
}
3240+
}
3241+
32393242
//Attempt to create a local NetworkObject
32403243
var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(sceneObject);
32413244

@@ -3270,7 +3273,6 @@ internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBuf
32703273
networkObject.InvokeBehaviourNetworkPreSpawn();
32713274

32723275
// Synchronize NetworkBehaviours
3273-
var bufferSerializer = new BufferSerializer<BufferSerializerReader>(new BufferSerializerReader(reader));
32743276
networkObject.SynchronizeNetworkBehaviours(ref bufferSerializer, networkManager.LocalClientId);
32753277

32763278
// If we are an in-scene placed NetworkObject and we originally had a parent but when synchronized we are

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

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace Unity.Netcode
2+
{
3+
/// <summary>
4+
/// Specialized version of <see cref="INetworkPrefabInstanceHandler"/> that supports synchronizing
5+
/// custom data prior to the instantiation of a <see cref="NetworkObject"/>.
6+
/// </summary>
7+
public interface INetworkPrefabInstanceHandlerWithData : INetworkPrefabInstanceHandler
8+
{
9+
/// <summary>
10+
/// Allows synchronizing custom instantiation data before the object is instantiated. <br/>
11+
/// Called before <see cref="INetworkPrefabInstanceHandler.Instantiate"/>.
12+
/// </summary>
13+
/// <param name="serializer">The serializer used to synchronize the custom instantiation data.</param>
14+
void OnSynchronizeInstantiationData<T>(ref BufferSerializer<T> serializer) where T : IReaderWriter;
15+
}
16+
}

com.unity.netcode.gameobjects/Runtime/Spawning/INetworkInstantiationPayloadSynchronizer.cs.meta renamed to com.unity.netcode.gameobjects/Runtime/Spawning/INetworkPrefabInstanceHandlerWithData.cs.meta

File renamed without changes.

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public interface INetworkPrefabInstanceHandler
2222
/// via the <see cref="GameObject.SetActive(bool)"/> method.
2323
///
2424
/// If you need to pass custom data at instantiation time (e.g., selecting a variant, setting initialization parameters, or choosing a pre-instantiated object),
25-
/// implement <see cref="INetworkInstantiationPayloadSynchronizer"/> alongside this interface to receive the data before instantiation.
25+
/// implement <see cref="INetworkPrefabInstanceHandlerWithData"/> alongside this interface to receive the data before instantiation.
2626
/// </summary>
2727
/// <param name="ownerClientId">the owner for the <see cref="NetworkObject"/> to be instantiated</param>
2828
/// <param name="position">the initial/default position for the <see cref="NetworkObject"/> to be instantiated</param>
@@ -227,29 +227,29 @@ public bool RemoveHandler(uint globalObjectIdHash)
227227
internal bool ContainsHandler(uint networkPrefabHash) => m_PrefabAssetToPrefabHandler.ContainsKey(networkPrefabHash) || m_PrefabInstanceToPrefabAsset.ContainsKey(networkPrefabHash);
228228

229229
/// <summary>
230-
/// Check to see if a <see cref="NetworkObject.GlobalObjectIdHash"/> is registered to an <see cref="INetworkInstantiationPayloadSynchronizer"/> implementation
230+
/// Check to see if a <see cref="NetworkObject.GlobalObjectIdHash"/> is registered to an <see cref="INetworkPrefabInstanceHandlerWithData"/> implementation
231231
/// </summary>
232232
/// <param name="objectHash"></param>
233233
/// <returns></returns>
234-
internal bool HasPayloadSynchronizer(uint objectHash) => TryGetPayloadSynchronizer(objectHash, out _);
234+
internal bool HasPayloadSynchronizer(uint objectHash) => TryGetPrefabInstanceHandlerWithData(objectHash, out _);
235235

236236
/// <summary>
237-
/// Returns the <see cref="INetworkInstantiationPayloadSynchronizer"/> implementation for a given <see cref="NetworkObject.GlobalObjectIdHash"/>
237+
/// Returns the <see cref="INetworkPrefabInstanceHandlerWithData"/> implementation for a given <see cref="NetworkObject.GlobalObjectIdHash"/>
238238
/// </summary>
239239
/// <param name="objectHash"></param>
240-
/// <param name="synchronizer"></param>
240+
/// <param name="handler"></param>
241241
/// <returns></returns>
242-
internal bool TryGetPayloadSynchronizer(uint objectHash, out INetworkInstantiationPayloadSynchronizer synchronizer)
242+
internal bool TryGetPrefabInstanceHandlerWithData(uint objectHash, out INetworkPrefabInstanceHandlerWithData handler)
243243
{
244244
if (m_PrefabAssetToPrefabHandler.TryGetValue(objectHash, out var prefabInstanceHandler))
245245
{
246-
if (prefabInstanceHandler is INetworkInstantiationPayloadSynchronizer payloadSynchronizer)
246+
if (prefabInstanceHandler is INetworkPrefabInstanceHandlerWithData payloadSynchronizer)
247247
{
248-
synchronizer = payloadSynchronizer;
248+
handler = payloadSynchronizer;
249249
return true;
250250
}
251251
}
252-
synchronizer = null;
252+
handler = null;
253253
return false;
254254
}
255255

0 commit comments

Comments
 (0)