@@ -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