11using System . Linq ;
22using System . Runtime . CompilerServices ;
3+ using UnityEngine ;
34
45namespace Unity . Netcode
56{
67 internal struct DestroyObjectMessage : INetworkMessage , INetworkSerializeByMemcpy
78 {
89 private const int k_OptimizeDestroyObjectMessage = 1 ;
9- public int Version => k_OptimizeDestroyObjectMessage ;
10+ private const int k_AllowDestroyGameInPlaced = 2 ;
11+ public int Version => k_AllowDestroyGameInPlaced ;
1012
1113 private const string k_Name = "DestroyObjectMessage" ;
1214
1315 public ulong NetworkObjectId ;
1416
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>
19- public bool DestroyGameObject ;
2017 private byte m_DestroyFlags ;
2118
2219 internal int DeferredDespawnTick ;
@@ -25,32 +22,29 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
2522
2623 internal bool IsDistributedAuthority ;
2724
28- private const byte k_ClientTargetedDestroy = 0x01 ;
29- private const byte k_DeferredDespawn = 0x02 ;
30-
3125 internal bool IsTargetedDestroy
3226 {
33- get => GetFlag ( k_ClientTargetedDestroy ) ;
27+ get => ByteUtility . GetBit ( m_DestroyFlags , 0 ) ;
3428
35- set => SetFlag ( value , k_ClientTargetedDestroy ) ;
29+ set => ByteUtility . SetBit ( ref m_DestroyFlags , 0 , value ) ;
3630 }
3731
3832 private bool IsDeferredDespawn
3933 {
40- get => GetFlag ( k_DeferredDespawn ) ;
34+ get => ByteUtility . GetBit ( m_DestroyFlags , 1 ) ;
4135
42- set => SetFlag ( value , k_DeferredDespawn ) ;
36+ set => ByteUtility . SetBit ( ref m_DestroyFlags , 1 , value ) ;
4337 }
4438
45- private bool GetFlag ( int flag )
39+ /// <summary>
40+ /// Used to communicate whether to destroy the associated game object.
41+ /// Should be false if the object is InScenePlaced and true otherwise
42+ /// </summary>
43+ public bool DestroyGameObject
4644 {
47- return ( m_DestroyFlags & flag ) != 0 ;
48- }
45+ get => ByteUtility . GetBit ( m_DestroyFlags , 2 ) ;
4946
50- private void SetFlag ( bool set , byte flag )
51- {
52- if ( set ) { m_DestroyFlags = ( byte ) ( m_DestroyFlags | flag ) ; }
53- else { m_DestroyFlags = ( byte ) ( m_DestroyFlags & ~ flag ) ; }
47+ set => ByteUtility . SetBit ( ref m_DestroyFlags , 2 , value ) ;
5448 }
5549
5650 public void Serialize ( FastBufferWriter writer , int targetVersion )
@@ -73,6 +67,9 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
7367 {
7468 BytePacker . WriteValueBitPacked ( writer , DeferredDespawnTick ) ;
7569 }
70+ } else if ( targetVersion >= k_AllowDestroyGameInPlaced )
71+ {
72+ writer . WriteByteSafe ( m_DestroyFlags ) ;
7673 }
7774
7875 if ( targetVersion < k_OptimizeDestroyObjectMessage )
@@ -102,11 +99,15 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
10299 {
103100 ByteUnpacker . ReadValueBitPacked ( reader , out DeferredDespawnTick ) ;
104101 }
102+ } else if ( receivedMessageVersion >= k_AllowDestroyGameInPlaced )
103+ {
104+ reader . ReadByteSafe ( out m_DestroyFlags ) ;
105105 }
106106
107107 if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage )
108108 {
109- reader . ReadValueSafe ( out DestroyGameObject ) ;
109+ reader . ReadValueSafe ( out bool destroyGameObject ) ;
110+ DestroyGameObject = destroyGameObject ;
110111 }
111112
112113 if ( networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) )
@@ -169,7 +170,7 @@ public void Handle(ref NetworkContext context)
169170 }
170171
171172 // Otherwise just despawn the NetworkObject right now
172- networkManager . SpawnManager . OnDespawnNonAuthorityObject ( networkObject ) ;
173+ networkManager . SpawnManager . OnDespawnNonAuthorityObject ( networkObject , DestroyGameObject ) ;
173174 networkManager . NetworkMetrics . TrackObjectDestroyReceived ( context . SenderId , networkObject , context . MessageSize ) ;
174175 }
175176
@@ -208,7 +209,7 @@ private void HandleDeferredDespawn(ref NetworkManager networkManager, ref Networ
208209 {
209210 networkObject . DeferredDespawnTick = DeferredDespawnTick ;
210211 var hasCallback = networkObject . OnDeferredDespawnComplete != null ;
211- networkManager . SpawnManager . DeferDespawnNetworkObject ( NetworkObjectId , DeferredDespawnTick , hasCallback ) ;
212+ networkManager . SpawnManager . DeferDespawnNetworkObject ( NetworkObjectId , DeferredDespawnTick , hasCallback , DestroyGameObject ) ;
212213 }
213214 }
214215}
0 commit comments