@@ -5,11 +5,17 @@ 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
1213        public  ulong  NetworkObjectId ; 
14+ 
15+         /// <summary> 
16+         /// Used to communicate whether to destroy the associated game object. 
17+         /// Should be false if the object is InScenePlaced and true otherwise 
18+         /// </summary> 
1319        public  bool  DestroyGameObject ; 
1420        private  byte  m_DestroyFlags ; 
1521
@@ -19,19 +25,21 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
1925
2026        internal  bool  IsDistributedAuthority ; 
2127
22-         internal  const  byte  ClientTargetedDestroy  =  0x01 ; 
28+         private  const  byte  k_ClientTargetedDestroy  =  0x01 ; 
29+         private  const  byte  k_DeferredDespawn  =  0x02 ; 
2330
2431        internal  bool  IsTargetedDestroy 
2532        { 
26-             get 
27-             { 
28-                 return  GetFlag ( ClientTargetedDestroy ) ; 
29-             } 
33+             get  =>  GetFlag ( k_ClientTargetedDestroy ) ; 
3034
31-             set 
32-             { 
33-                 SetFlag ( value ,  ClientTargetedDestroy ) ; 
34-             } 
35+             set  =>  SetFlag ( value ,  k_ClientTargetedDestroy ) ; 
36+         } 
37+ 
38+         private  bool  IsDeferredDespawn 
39+         { 
40+             get  =>  GetFlag ( k_DeferredDespawn ) ; 
41+ 
42+             set  =>  SetFlag ( value ,  k_DeferredDespawn ) ; 
3543        } 
3644
3745        private  bool  GetFlag ( int  flag ) 
@@ -47,7 +55,11 @@ private void SetFlag(bool set, byte flag)
4755
4856        public  void  Serialize ( FastBufferWriter  writer ,  int  targetVersion ) 
4957        { 
58+             // Set deferred despawn flag 
59+             IsDeferredDespawn  =  DeferredDespawnTick  >  0 ; 
60+ 
5061            BytePacker . WriteValueBitPacked ( writer ,  NetworkObjectId ) ; 
62+ 
5163            if  ( IsDistributedAuthority ) 
5264            { 
5365                writer . WriteByteSafe ( m_DestroyFlags ) ; 
@@ -56,9 +68,17 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
5668                { 
5769                    BytePacker . WriteValueBitPacked ( writer ,  TargetClientId ) ; 
5870                } 
59-                 BytePacker . WriteValueBitPacked ( writer ,  DeferredDespawnTick ) ; 
71+ 
72+                 if  ( targetVersion  <  k_OptimizeDestroyObjectMessage  ||  IsDeferredDespawn ) 
73+                 { 
74+                     BytePacker . WriteValueBitPacked ( writer ,  DeferredDespawnTick ) ; 
75+                 } 
76+             } 
77+ 
78+             if  ( targetVersion  <  k_OptimizeDestroyObjectMessage ) 
79+             { 
80+                 writer . WriteValueSafe ( DestroyGameObject ) ; 
6081            } 
61-             writer . WriteValueSafe ( DestroyGameObject ) ; 
6282        } 
6383
6484        public  bool  Deserialize ( FastBufferReader  reader ,  ref  NetworkContext  context ,  int  receivedMessageVersion ) 
@@ -77,18 +97,27 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
7797                { 
7898                    ByteUnpacker . ReadValueBitPacked ( reader ,  out  TargetClientId ) ; 
7999                } 
80-                 ByteUnpacker . ReadValueBitPacked ( reader ,  out  DeferredDespawnTick ) ; 
100+ 
101+                 if  ( receivedMessageVersion  <  k_OptimizeDestroyObjectMessage  ||  IsDeferredDespawn ) 
102+                 { 
103+                     ByteUnpacker . ReadValueBitPacked ( reader ,  out  DeferredDespawnTick ) ; 
104+                 } 
81105            } 
82106
83-             reader . ReadValueSafe ( out  DestroyGameObject ) ; 
107+             if  ( receivedMessageVersion  <  k_OptimizeDestroyObjectMessage ) 
108+             { 
109+                 reader . ReadValueSafe ( out  DestroyGameObject ) ; 
110+             } 
84111
85-             if  ( ! networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) ) 
112+             if  ( networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) ) 
86113            { 
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-                 } 
114+                 return  true ; 
115+             } 
116+ 
117+             // Client-Server mode we always defer where in distributed authority mode we only defer if it is not a targeted destroy 
118+             if  ( ! networkManager . DistributedAuthorityMode  ||  ( networkManager . DistributedAuthorityMode  &&  ! IsTargetedDestroy ) ) 
119+             { 
120+                 networkManager . DeferredMessageManager . DeferMessage ( IDeferredNetworkMessageManager . TriggerType . OnSpawn ,  NetworkObjectId ,  reader ,  ref  context ,  k_Name ) ; 
92121            } 
93122            return  true ; 
94123        } 
0 commit comments