@@ -297,37 +297,20 @@ internal bool TryGetHandlerWithData(uint objectHash, out INetworkPrefabInstanceH
297297 /// <typeparam name="T"></typeparam>
298298 /// <param name="objectHash"></param>
299299 /// <param name="serializer"></param>
300- internal void ReadInstantiationData < T > ( uint objectHash , ref BufferSerializer < T > serializer ) where T : IReaderWriter
300+ internal FastBufferReader GetInstantiationDataReader < T > ( uint objectHash , ref BufferSerializer < T > serializer ) where T : IReaderWriter
301301 {
302302 if ( ! serializer . IsReader || ! TryGetHandlerWithData ( objectHash , out INetworkPrefabInstanceHandlerWithData synchronizableHandler ) )
303303 {
304- return ;
304+ return default ;
305305 }
306306
307307 FastBufferReader fastBufferReader = serializer . GetFastBufferReader ( ) ;
308308 // Reads the expected size of the instantiation data
309309 fastBufferReader . ReadValueSafe ( out int dataSize ) ;
310310 int dataStartPos = fastBufferReader . Position ;
311-
312- try
313- {
314- synchronizableHandler . ReadInstantiationData ( ref serializer ) ;
315- }
316- catch ( Exception ex )
317- {
318- // Skips the unread instantiation data bytes
319- fastBufferReader . Seek ( dataStartPos + dataSize ) ;
320- NetworkLog . LogError ( $ "[InstantiationData] Handler failed during synchronization (Read): { ex . Message } ") ;
321- return ;
322- }
323-
324- // Validates if expected number of bytes were read
325- int dataEndPos = fastBufferReader . Position ;
326- if ( dataEndPos != dataStartPos + dataSize )
327- {
328- NetworkLog . LogWarning ( $ "[InstantiationData] Read { dataEndPos - dataStartPos } bytes, expected { dataSize } ") ;
329- fastBufferReader . Seek ( dataStartPos + dataSize ) ;
330- }
311+ var result = new FastBufferReader ( fastBufferReader , Collections . Allocator . Temp , dataSize , dataStartPos ) ;
312+ fastBufferReader . Seek ( dataStartPos + dataSize ) ;
313+ return result ;
331314 }
332315
333316 /// <summary>
@@ -359,23 +342,38 @@ internal uint GetSourceGlobalObjectIdHash(uint networkPrefabHash)
359342 /// <param name="position"></param>
360343 /// <param name="rotation"></param>
361344 /// <returns></returns>
362- internal NetworkObject HandleNetworkPrefabSpawn ( uint networkPrefabAssetHash , ulong ownerClientId , Vector3 position , Quaternion rotation )
345+ internal NetworkObject HandleNetworkPrefabSpawn ( uint networkPrefabAssetHash , ulong ownerClientId , Vector3 position , Quaternion rotation , FastBufferReader instantiationDataReader = default )
346+ {
347+ NetworkObject networkObjectInstance = instantiationDataReader . IsInitialized
348+ ? InstantiateNetworkPrefabWithData ( networkPrefabAssetHash , ownerClientId , position , rotation , instantiationDataReader )
349+ : InstantiateNetworkPrefabDefault ( networkPrefabAssetHash , ownerClientId , position , rotation ) ;
350+ //Now we must make sure this alternate PrefabAsset spawned in place of the prefab asset with the networkPrefabAssetHash (GlobalObjectIdHash)
351+ //is registered and linked to the networkPrefabAssetHash so during the HandleNetworkPrefabDestroy process we can identify the alternate prefab asset.
352+ if ( networkObjectInstance != null )
353+ RegisterPrefabInstance ( networkObjectInstance , networkPrefabAssetHash ) ;
354+ return networkObjectInstance ;
355+ }
356+
357+ private NetworkObject InstantiateNetworkPrefabDefault ( uint networkPrefabAssetHash , ulong ownerClientId , Vector3 position , Quaternion rotation )
363358 {
364359 if ( m_PrefabAssetToPrefabHandler . TryGetValue ( networkPrefabAssetHash , out var prefabInstanceHandler ) )
365- {
366- var networkObjectInstance = prefabInstanceHandler . Instantiate ( ownerClientId , position , rotation ) ;
360+ return prefabInstanceHandler . Instantiate ( ownerClientId , position , rotation ) ;
361+ return null ;
362+ }
367363
368- //Now we must make sure this alternate PrefabAsset spawned in place of the prefab asset with the networkPrefabAssetHash (GlobalObjectIdHash )
369- //is registered and linked to the networkPrefabAssetHash so during the HandleNetworkPrefabDestroy process we can identify the alternate prefab asset.
370- if ( networkObjectInstance != null && ! m_PrefabInstanceToPrefabAsset . ContainsKey ( networkObjectInstance . GlobalObjectIdHash ) )
371- {
372- m_PrefabInstanceToPrefabAsset . Add ( networkObjectInstance . GlobalObjectIdHash , networkPrefabAssetHash ) ;
373- }
364+ private NetworkObject InstantiateNetworkPrefabWithData ( uint networkPrefabAssetHash , ulong ownerClientId , Vector3 position , Quaternion rotation , FastBufferReader instantiationDataReader )
365+ {
366+ if ( m_PrefabAssetToPrefabHandlerWithData . TryGetValue ( networkPrefabAssetHash , out var prefabInstanceHandler ) )
367+ return prefabInstanceHandler . Instantiate ( ownerClientId , position , rotation , instantiationDataReader ) ;
368+ return null ;
369+ }
374370
375- return networkObjectInstance ;
371+ private void RegisterPrefabInstance ( NetworkObject networkObjectInstance , uint networkPrefabAssetHash )
372+ {
373+ if ( networkObjectInstance != null && ! m_PrefabInstanceToPrefabAsset . ContainsKey ( networkObjectInstance . GlobalObjectIdHash ) )
374+ {
375+ m_PrefabInstanceToPrefabAsset . Add ( networkObjectInstance . GlobalObjectIdHash , networkPrefabAssetHash ) ;
376376 }
377-
378- return null ;
379377 }
380378
381379 /// <summary>
0 commit comments