@@ -5,7 +5,8 @@ namespace Unity.Netcode
55{
66 internal struct DestroyObjectMessage : INetworkMessage , INetworkSerializeByMemcpy
77 {
8- public int Version => 0 ;
8+ private const int k_OptimizeDestroyObjectMessage = 1 ;
9+ public int Version => k_OptimizeDestroyObjectMessage ;
910
1011 private const string k_Name = "DestroyObjectMessage" ;
1112
@@ -19,19 +20,21 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
1920
2021 internal bool IsDistributedAuthority ;
2122
22- internal const byte ClientTargetedDestroy = 0x01 ;
23+ private const byte k_ClientTargetedDestroy = 0x01 ;
24+ private const byte k_DeferredDespawn = 0x02 ;
2325
2426 internal bool IsTargetedDestroy
2527 {
26- get
27- {
28- return GetFlag ( ClientTargetedDestroy ) ;
29- }
28+ get => GetFlag ( k_ClientTargetedDestroy ) ;
3029
31- set
32- {
33- SetFlag ( value , ClientTargetedDestroy ) ;
34- }
30+ set => SetFlag ( value , k_ClientTargetedDestroy ) ;
31+ }
32+
33+ internal bool IsDeferredDespawn
34+ {
35+ get => GetFlag ( k_DeferredDespawn ) ;
36+
37+ set => SetFlag ( value , k_DeferredDespawn ) ;
3538 }
3639
3740 private bool GetFlag ( int flag )
@@ -47,7 +50,11 @@ private void SetFlag(bool set, byte flag)
4750
4851 public void Serialize ( FastBufferWriter writer , int targetVersion )
4952 {
53+ // Set deferred despawn flag
54+ IsDeferredDespawn = DeferredDespawnTick > 0 ;
55+
5056 BytePacker . WriteValueBitPacked ( writer , NetworkObjectId ) ;
57+
5158 if ( IsDistributedAuthority )
5259 {
5360 writer . WriteByteSafe ( m_DestroyFlags ) ;
@@ -56,9 +63,17 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
5663 {
5764 BytePacker . WriteValueBitPacked ( writer , TargetClientId ) ;
5865 }
59- BytePacker . WriteValueBitPacked ( writer , DeferredDespawnTick ) ;
66+
67+ if ( targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn )
68+ {
69+ BytePacker . WriteValueBitPacked ( writer , DeferredDespawnTick ) ;
70+ }
71+ }
72+
73+ if ( targetVersion < k_OptimizeDestroyObjectMessage )
74+ {
75+ writer . WriteValueSafe ( DestroyGameObject ) ;
6076 }
61- writer . WriteValueSafe ( DestroyGameObject ) ;
6277 }
6378
6479 public bool Deserialize ( FastBufferReader reader , ref NetworkContext context , int receivedMessageVersion )
@@ -77,18 +92,27 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
7792 {
7893 ByteUnpacker . ReadValueBitPacked ( reader , out TargetClientId ) ;
7994 }
80- ByteUnpacker . ReadValueBitPacked ( reader , out DeferredDespawnTick ) ;
95+
96+ if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn )
97+ {
98+ ByteUnpacker . ReadValueBitPacked ( reader , out DeferredDespawnTick ) ;
99+ }
81100 }
82101
83- reader . ReadValueSafe ( out DestroyGameObject ) ;
102+ if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage )
103+ {
104+ reader . ReadValueSafe ( out DestroyGameObject ) ;
105+ }
84106
85- if ( ! networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) )
107+ if ( networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) )
86108 {
87- // Client-Server mode we always defer where in distributed authority mode we only defer if it is not a targeted destroy
88- if ( ! networkManager . DistributedAuthorityMode || ( networkManager . DistributedAuthorityMode && ! IsTargetedDestroy ) )
89- {
90- networkManager . DeferredMessageManager . DeferMessage ( IDeferredNetworkMessageManager . TriggerType . OnSpawn , NetworkObjectId , reader , ref context , k_Name ) ;
91- }
109+ return true ;
110+ }
111+
112+ // Client-Server mode we always defer where in distributed authority mode we only defer if it is not a targeted destroy
113+ if ( ! networkManager . DistributedAuthorityMode || ( networkManager . DistributedAuthorityMode && ! IsTargetedDestroy ) )
114+ {
115+ networkManager . DeferredMessageManager . DeferMessage ( IDeferredNetworkMessageManager . TriggerType . OnSpawn , NetworkObjectId , reader , ref context , k_Name ) ;
92116 }
93117 return true ;
94118 }
0 commit comments