@@ -5,11 +5,17 @@ namespace Unity.Netcode
5
5
{
6
6
internal struct DestroyObjectMessage : INetworkMessage , INetworkSerializeByMemcpy
7
7
{
8
- public int Version => 0 ;
8
+ private const int k_OptimizeDestroyObjectMessage = 1 ;
9
+ public int Version => k_OptimizeDestroyObjectMessage ;
9
10
10
11
private const string k_Name = "DestroyObjectMessage" ;
11
12
12
13
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>
13
19
public bool DestroyGameObject ;
14
20
private byte m_DestroyFlags ;
15
21
@@ -19,19 +25,21 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
19
25
20
26
internal bool IsDistributedAuthority ;
21
27
22
- internal const byte ClientTargetedDestroy = 0x01 ;
28
+ private const byte k_ClientTargetedDestroy = 0x01 ;
29
+ private const byte k_DeferredDespawn = 0x02 ;
23
30
24
31
internal bool IsTargetedDestroy
25
32
{
26
- get
27
- {
28
- return GetFlag ( ClientTargetedDestroy ) ;
29
- }
33
+ get => GetFlag ( k_ClientTargetedDestroy ) ;
30
34
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 ) ;
35
43
}
36
44
37
45
private bool GetFlag ( int flag )
@@ -47,7 +55,11 @@ private void SetFlag(bool set, byte flag)
47
55
48
56
public void Serialize ( FastBufferWriter writer , int targetVersion )
49
57
{
58
+ // Set deferred despawn flag
59
+ IsDeferredDespawn = DeferredDespawnTick > 0 ;
60
+
50
61
BytePacker . WriteValueBitPacked ( writer , NetworkObjectId ) ;
62
+
51
63
if ( IsDistributedAuthority )
52
64
{
53
65
writer . WriteByteSafe ( m_DestroyFlags ) ;
@@ -56,9 +68,17 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
56
68
{
57
69
BytePacker . WriteValueBitPacked ( writer , TargetClientId ) ;
58
70
}
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 ) ;
60
81
}
61
- writer . WriteValueSafe ( DestroyGameObject ) ;
62
82
}
63
83
64
84
public bool Deserialize ( FastBufferReader reader , ref NetworkContext context , int receivedMessageVersion )
@@ -77,18 +97,27 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
77
97
{
78
98
ByteUnpacker . ReadValueBitPacked ( reader , out TargetClientId ) ;
79
99
}
80
- ByteUnpacker . ReadValueBitPacked ( reader , out DeferredDespawnTick ) ;
100
+
101
+ if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn )
102
+ {
103
+ ByteUnpacker . ReadValueBitPacked ( reader , out DeferredDespawnTick ) ;
104
+ }
81
105
}
82
106
83
- reader . ReadValueSafe ( out DestroyGameObject ) ;
107
+ if ( receivedMessageVersion < k_OptimizeDestroyObjectMessage )
108
+ {
109
+ reader . ReadValueSafe ( out DestroyGameObject ) ;
110
+ }
84
111
85
- if ( ! networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) )
112
+ if ( networkManager . SpawnManager . SpawnedObjects . ContainsKey ( NetworkObjectId ) )
86
113
{
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 ) ;
92
121
}
93
122
return true ;
94
123
}
0 commit comments