@@ -7,12 +7,12 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
77 {
88 private const int k_OptimizeDestroyObjectMessage = 1 ;
99 private const int k_AllowDestroyGameInPlaced = 2 ;
10+
1011 public int Version => k_AllowDestroyGameInPlaced ;
1112
1213 private const string k_Name = "DestroyObjectMessage" ;
1314
1415 public ulong NetworkObjectId ;
15-
1616 private byte m_DestroyFlags ;
1717
1818 internal int DeferredDespawnTick ;
@@ -21,55 +21,64 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
2121
2222 internal bool IsDistributedAuthority ;
2323
24- internal bool IsTargetedDestroy
25- {
26- get => ByteUtility . GetBit ( m_DestroyFlags , 0 ) ;
27-
28- set => ByteUtility . SetBit ( ref m_DestroyFlags , 0 , value ) ;
29- }
30-
31- private bool IsDeferredDespawn
32- {
33- get => ByteUtility . GetBit ( m_DestroyFlags , 1 ) ;
24+ private const byte k_IsTargetedDestroy = 0x01 ;
25+ private const byte k_IsDeferredDespawn = 0x02 ;
26+ private const byte k_DestroyGameObject = 0x04 ;
3427
35- set => ByteUtility . SetBit ( ref m_DestroyFlags , 1 , value ) ;
36- }
28+ internal bool IsTargetedDestroy ; // Get bit [(bitField & (1 << bitPosition)) != 0;] with bitPosition= 0
29+ // set (byte)((bitField & ~(1 << bitPosition)) | (ToByte(value) << bitPosition))
30+ private bool m_IsDeferredDespawn ; // 1
3731
3832 /// <summary>
3933 /// Used to communicate whether to destroy the associated game object.
4034 /// Should be false if the object is InScenePlaced and true otherwise
4135 /// </summary>
42- public bool DestroyGameObject
36+ public bool DestroyGameObject ; // 2
37+
38+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
39+ internal uint GetBitsetRepresentation ( )
4340 {
44- get => ByteUtility . GetBit ( m_DestroyFlags , 2 ) ;
41+ uint bitset = 0 ;
42+ if ( IsTargetedDestroy ) { bitset |= k_IsTargetedDestroy ; }
43+ if ( m_IsDeferredDespawn ) { bitset |= k_IsDeferredDespawn ; }
44+ if ( DestroyGameObject ) { bitset |= k_DestroyGameObject ; }
45+ return bitset ;
46+ }
4547
46- set => ByteUtility . SetBit ( ref m_DestroyFlags , 2 , value ) ;
48+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
49+ internal void SetStateFromBitset ( uint bitset )
50+ {
51+ IsTargetedDestroy = ( bitset & k_IsTargetedDestroy ) != 0 ;
52+ m_IsDeferredDespawn = ( bitset & k_IsDeferredDespawn ) != 0 ;
53+ DestroyGameObject = ( bitset & k_DestroyGameObject ) != 0 ;
4754 }
4855
4956 public void Serialize ( FastBufferWriter writer , int targetVersion )
5057 {
5158 // Set deferred despawn flag
52- IsDeferredDespawn = DeferredDespawnTick > 0 ;
59+ m_IsDeferredDespawn = DeferredDespawnTick > 0 ;
60+
61+ uint getBitsetRepresentation = GetBitsetRepresentation ( ) ;
5362
5463 BytePacker . WriteValueBitPacked ( writer , NetworkObjectId ) ;
5564
5665 if ( IsDistributedAuthority )
5766 {
58- writer . WriteByteSafe ( m_DestroyFlags ) ;
67+ writer . WriteValueSafe ( getBitsetRepresentation ) ;
5968
6069 if ( IsTargetedDestroy )
6170 {
6271 BytePacker . WriteValueBitPacked ( writer , TargetClientId ) ;
6372 }
6473
65- if ( targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn )
74+ if ( targetVersion < k_OptimizeDestroyObjectMessage || m_IsDeferredDespawn )
6675 {
6776 BytePacker . WriteValueBitPacked ( writer , DeferredDespawnTick ) ;
6877 }
6978 }
7079 else if ( targetVersion >= k_AllowDestroyGameInPlaced )
7180 {
72- writer . WriteByteSafe ( m_DestroyFlags ) ;
81+ writer . WriteValueSafe ( getBitsetRepresentation ) ;
7382 }
7483
7584 if ( targetVersion < k_OptimizeDestroyObjectMessage )
@@ -90,19 +99,22 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
9099 if ( networkManager . DistributedAuthorityMode )
91100 {
92101 reader . ReadByteSafe ( out m_DestroyFlags ) ;
102+ SetStateFromBitset ( m_DestroyFlags ) ;
103+
93104 if ( IsTargetedDestroy )
94105 {
95106 ByteUnpacker . ReadValueBitPacked ( reader , out TargetClientId ) ;
96107 }
97108
98- if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn )
109+ if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage || m_IsDeferredDespawn )
99110 {
100111 ByteUnpacker . ReadValueBitPacked ( reader , out DeferredDespawnTick ) ;
101112 }
102113 }
103114 else if ( receivedMessageVersion >= k_AllowDestroyGameInPlaced )
104115 {
105116 reader . ReadByteSafe ( out m_DestroyFlags ) ;
117+ SetStateFromBitset ( m_DestroyFlags ) ;
106118 }
107119
108120 if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage )
0 commit comments