Skip to content

Commit 402210e

Browse files
Merge branch 'develop' into fix/console-tests-failing
2 parents 554bf0d + e4108e5 commit 402210e

File tree

8 files changed

+57
-26
lines changed

8 files changed

+57
-26
lines changed

com.unity.netcode.gameobjects/Runtime/Core/SnapshotSystem.cs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ internal struct UpdateCommand
4646
// snapshot internal
4747
internal int TickWritten;
4848
internal int SerializedLength;
49+
internal bool IsDelta; // Is this carrying a ReadDelta(). Should always be true except for spawn-generated updates
4950
}
5051

5152
internal struct UpdateCommandMeta
@@ -329,6 +330,11 @@ internal void NetworkDespawnObject(SnapshotDespawnCommand despawnCommand, ulong
329330
{
330331
m_NetworkManager.SpawnManager.SpawnedObjects.TryGetValue(despawnCommand.NetworkObjectId, out NetworkObject networkObject);
331332

333+
if (networkObject == null)
334+
{
335+
return;
336+
}
337+
332338
m_NetworkManager.SpawnManager.OnDespawnObject(networkObject, true);
333339
//todo: discuss with tools how to report shared bytes
334340
m_NetworkManager.NetworkMetrics.TrackObjectDestroyReceived(srcClientId, networkObject, 8);
@@ -568,7 +574,8 @@ internal void Spawn(SnapshotSpawnCommand command, NetworkObject networkObject, L
568574
updateCommand.BehaviourIndex = childIndex;
569575
updateCommand.VariableIndex = variableIndex;
570576

571-
Store(updateCommand, behaviour.NetworkVariableFields[variableIndex]);
577+
// because this is a spawn, we specify that this isn't a delta update
578+
Store(updateCommand, behaviour.NetworkVariableFields[variableIndex], /* IsDelta = */ false);
572579
}
573580
}
574581
}
@@ -616,9 +623,11 @@ internal void Despawn(SnapshotDespawnCommand command, NetworkObject networkObjec
616623
}
617624

618625
// entry-point for value updates
619-
internal void Store(UpdateCommand command, NetworkVariableBase networkVariable)
626+
internal void Store(UpdateCommand command, NetworkVariableBase networkVariable, bool isDelta = true)
620627
{
621628
command.TickWritten = m_CurrentTick;
629+
command.IsDelta = isDelta;
630+
622631
var commandPosition = -1;
623632

624633
List<ulong> targetClientIds = GetClientList();
@@ -678,7 +687,17 @@ internal void Store(UpdateCommand command, NetworkVariableBase networkVariable)
678687
Debug.Assert(false);
679688
}
680689

681-
networkVariable.WriteDelta(m_Writer);
690+
// we use WriteDelta for updates, but WriteField for spawns. It is important to use the correct one
691+
// for NetworkList. And, in the future, NetworkVariables might care, too.
692+
if (command.IsDelta)
693+
{
694+
networkVariable.WriteDelta(m_Writer);
695+
}
696+
else
697+
{
698+
networkVariable.WriteField(m_Writer);
699+
}
700+
682701
command.SerializedLength = m_Writer.Length;
683702

684703
var allocated = MemoryStorage.Allocate(UpdatesMeta[commandPosition].Index, m_Writer.Length, out bufferPos);
@@ -756,18 +775,21 @@ internal void HandleSnapshot(ulong clientId, SnapshotDataMessage message)
756775
// Find the network variable;
757776
GetBehaviourVariable(updateCommand, out NetworkBehaviour behaviour, out NetworkVariableBase variable, clientId);
758777

759-
if (variable == null)
760-
{
761-
Debug.LogError($"Could not find NetworkVariable for " +
762-
$"Object {updateCommand.NetworkObjectId} " +
763-
$"Behaviour {updateCommand.BehaviourIndex} " +
764-
$"Variable {updateCommand.VariableIndex}");
765-
}
766-
767-
if (updateCommand.TickWritten > variable.TickRead)
778+
// if the variable is not present anymore (despawned) or if this is an older update, let skip
779+
// we still need to seek over the message, though
780+
if (variable != null && updateCommand.TickWritten > variable.TickRead)
768781
{
769782
variable.TickRead = updateCommand.TickWritten;
770-
variable.ReadDelta(message.ReadBuffer, false); // todo: pass something for keep dirty delta
783+
if (updateCommand.IsDelta)
784+
{
785+
// todo: revisit if we need to pass something for keepDirtyDelta
786+
// since we currently only have server-authoritative changes, this makes no difference
787+
variable.ReadDelta(message.ReadBuffer, /* keepDirtyDelta = */false);
788+
}
789+
else
790+
{
791+
variable.ReadField(message.ReadBuffer);
792+
}
771793

772794
m_NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaReceived(
773795
clientId, behaviour.NetworkObject, variable.Name, behaviour.__getTypeName(), 20); // todo: what length ?

com.unity.netcode.gameobjects/Runtime/NetworkVariable/Collections/NetworkList.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,14 @@ public override void ReadField(FastBufferReader reader)
144144
reader.ReadValueSafe(out T value);
145145
m_List.Add(value);
146146
}
147+
148+
if (OnListChanged != null)
149+
{
150+
OnListChanged(new NetworkListEvent<T>
151+
{
152+
Type = NetworkListEvent<T>.EventType.Full
153+
});
154+
}
147155
}
148156

149157
/// <inheritdoc />

com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariable.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,10 @@ public override void ReadDelta(FastBufferReader reader, bool keepDirtyDelta)
168168
/// <inheritdoc />
169169
public override void ReadField(FastBufferReader reader)
170170
{
171+
T previousValue = m_InternalValue;
171172
Read(reader, out m_InternalValue);
173+
174+
OnValueChanged?.Invoke(previousValue, m_InternalValue);
172175
}
173176

174177
/// <inheritdoc />

com.unity.netcode.gameobjects/Tests/Runtime/HiddenVariableTests.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections;
22
using System.Collections.Generic;
3-
using NUnit.Framework;
43
using UnityEngine;
54
using UnityEngine.TestTools;
65

@@ -27,6 +26,8 @@ public override void OnNetworkSpawn()
2726
MyNetworkList.OnListChanged += ListChanged;
2827
SpawnCount++;
2928

29+
ValueOnClient[NetworkManager.LocalClientId] = MyNetworkVariable.Value;
30+
3031
base.OnNetworkSpawn();
3132
}
3233

@@ -112,6 +113,7 @@ public void VerifyLists()
112113
var curr = gameObject.GetComponent<HiddenVariableObject>().MyNetworkList;
113114

114115
// check that the two lists are identical
116+
115117
Debug.Assert(curr.Count == prev.Count);
116118
for (int index = 0; index < curr.Count; index++)
117119
{
@@ -143,7 +145,6 @@ public IEnumerator RefreshGameObects()
143145
}
144146

145147
[UnityTest]
146-
[Ignore("Snapshot transition")]
147148
public IEnumerator HiddenVariableTest()
148149
{
149150
HiddenVariableObject.SpawnCount = 0;
@@ -172,7 +173,7 @@ public IEnumerator HiddenVariableTest()
172173
Debug.Log("Objects spawned");
173174

174175
// ==== Set the NetworkVariable value to 2
175-
HiddenVariableObject.ExpectedSize = 1;
176+
HiddenVariableObject.ExpectedSize = 1; // list will only contain {2}
176177
HiddenVariableObject.SpawnCount = 0;
177178

178179
m_NetSpawnedObject.GetComponent<HiddenVariableObject>().MyNetworkVariable.Value = 2;
@@ -190,7 +191,7 @@ public IEnumerator HiddenVariableTest()
190191
Debug.Log("Value changed");
191192

192193
// ==== Hide our object to a different client
193-
HiddenVariableObject.ExpectedSize = 2;
194+
HiddenVariableObject.ExpectedSize = 2; // list will contain {2, 3}
194195
m_NetSpawnedObject.NetworkHide(otherClient.ClientId);
195196

196197
// ==== Change the NetworkVariable value
@@ -211,7 +212,7 @@ public IEnumerator HiddenVariableTest()
211212
Debug.Log("Values changed");
212213

213214
// ==== Show our object again to this client
214-
HiddenVariableObject.ExpectedSize = 3;
215+
HiddenVariableObject.ExpectedSize = 2; // list will contain {2, 3} upon spawn, that happens first
215216
m_NetSpawnedObject.NetworkShow(otherClient.ClientId);
216217

217218
// ==== Wait for object to be spawned
@@ -222,6 +223,8 @@ public IEnumerator HiddenVariableTest()
222223
// ==== We need a refresh for the newly re-spawned object
223224
yield return RefreshGameObects();
224225

226+
HiddenVariableObject.ExpectedSize = 3; // list will then contain {2, 3, 4} after Add()
227+
225228
// ==== Change the NetworkVariable value
226229
// we should get all notifications of value changing and no errors or exception
227230
m_NetSpawnedObject.GetComponent<HiddenVariableObject>().MyNetworkVariable.Value = 4;

com.unity.netcode.gameobjects/Tests/Runtime/Metrics/MessagingMetricsTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ public IEnumerator TrackNetworkMessageSentMetricToMultipleClients()
6363
}
6464

6565
[UnityTest]
66-
[Ignore("Snapshot transition")]
6766
public IEnumerator TrackNetworkMessageReceivedMetric()
6867
{
6968
var messageName = Guid.NewGuid();
@@ -73,7 +72,9 @@ public IEnumerator TrackNetworkMessageReceivedMetric()
7372
{
7473
Debug.Log($"Received from {sender}");
7574
});
76-
var waitForMetricValues = new WaitForMetricValues<NetworkMessageEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.NetworkMessageReceived);
75+
var waitForMetricValues = new WaitForMetricValues<NetworkMessageEvent>(FirstClientMetrics.Dispatcher, NetworkMetricTypes.NetworkMessageReceived,
76+
metric => metric.Name == nameof(NamedMessage));
77+
7778
using (var writer = new FastBufferWriter(1300, Allocator.Temp))
7879
{
7980
writer.WriteValueSafe(messageName);
@@ -89,7 +90,6 @@ public IEnumerator TrackNetworkMessageReceivedMetric()
8990
}
9091

9192
[UnityTest]
92-
[Ignore("Snapshot transition")]
9393
public IEnumerator TrackNamedMessageSentMetric()
9494
{
9595
var waitForMetricValues = new WaitForMetricValues<NamedMessageEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.NamedMessageSent);

com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ private NetworkObject SpawnNetworkObject()
4343
}
4444

4545
[UnityTest]
46-
[Ignore("Snapshot transition")]
4746
public IEnumerator TrackOwnershipChangeSentMetric()
4847
{
4948
var networkObject = SpawnNetworkObject();
@@ -65,7 +64,6 @@ public IEnumerator TrackOwnershipChangeSentMetric()
6564
}
6665

6766
[UnityTest]
68-
[Ignore("Snapshot transition")]
6967
public IEnumerator TrackOwnershipChangeReceivedMetric()
7068
{
7169
var networkObject = SpawnNetworkObject();

com.unity.netcode.gameobjects/Tests/Runtime/Metrics/ServerLogsMetricTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ internal class ServerLogsMetricTests : SingleClientMetricTestBase
1717
private static readonly int k_ServerLogReceivedMessageOverhead = 2;
1818

1919
[UnityTest]
20-
[Ignore("Snapshot transition")]
2120
public IEnumerator TrackServerLogSentMetric()
2221
{
2322
var waitForSentMetric = new WaitForMetricValues<ServerLogEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.ServerLogSent);
@@ -37,7 +36,6 @@ public IEnumerator TrackServerLogSentMetric()
3736
}
3837

3938
[UnityTest]
40-
[Ignore("Snapshot transition")]
4139
public IEnumerator TrackServerLogReceivedMetric()
4240
{
4341
var waitForReceivedMetric = new WaitForMetricValues<ServerLogEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.ServerLogReceived);

com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectDontDestroyWithOwnerTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ namespace Unity.Netcode.RuntimeTests
1010
public class NetworkObjectDontDestroyWithOwnerTests
1111
{
1212
[UnityTest]
13-
[Ignore("Snapshot transition")]
1413
public IEnumerator DontDestroyWithOwnerTest()
1514
{
1615
// create server and client instances

0 commit comments

Comments
 (0)