@@ -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 ) )
0 commit comments