Skip to content

Commit ce64fcd

Browse files
committed
fix: PreviousValue was not set in NetworkList event local to the server (#2067)
1 parent a061d0a commit ce64fcd

File tree

2 files changed

+26
-66
lines changed

2 files changed

+26
-66
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,13 +436,15 @@ public T this[int index]
436436
get => m_List[index];
437437
set
438438
{
439+
var previousValue = m_List[index];
439440
m_List[index] = value;
440441

441442
var listEvent = new NetworkListEvent<T>()
442443
{
443444
Type = NetworkListEvent<T>.EventType.Value,
444445
Index = index,
445-
Value = value
446+
Value = value,
447+
PreviousValue = previousValue
446448
};
447449

448450
HandleAddListEvent(listEvent);

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

Lines changed: 23 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,36 @@ public class NetworkListChangedTestComponent : NetworkBehaviour
1515

1616
public class ListChangedObject : NetworkBehaviour
1717
{
18-
public static List<ListChangedObject> ClientTargetedNetworkObjects = new List<ListChangedObject>();
19-
public static ulong ClientIdToTarget;
20-
21-
public static NetworkObject GetNetworkObjectById(ulong networkObjectId)
22-
{
23-
foreach (var entry in ClientTargetedNetworkObjects)
24-
{
25-
if (entry.NetworkObjectId == networkObjectId)
26-
{
27-
return entry.NetworkObject;
28-
}
29-
}
30-
return null;
31-
}
18+
public int ExpectedPreviousValue = 0;
19+
public int ExpectedValue = 0;
20+
public bool AddDone = false;
3221

3322
public NetworkList<int> MyNetworkList = new NetworkList<int>();
3423

3524
public override void OnNetworkSpawn()
3625
{
3726
MyNetworkList.OnListChanged += Changed;
38-
39-
if (NetworkManager.LocalClientId == ClientIdToTarget)
40-
{
41-
ClientTargetedNetworkObjects.Add(this);
42-
}
4327
base.OnNetworkSpawn();
4428
}
4529

46-
public override void OnNetworkDespawn()
30+
public void Changed(NetworkListEvent<int> listEvent)
4731
{
48-
if (ClientTargetedNetworkObjects.Contains(this))
32+
if (listEvent.Type == NetworkListEvent<int>.EventType.Value)
4933
{
50-
ClientTargetedNetworkObjects.Remove(this);
51-
}
52-
base.OnNetworkDespawn();
53-
}
34+
if (listEvent.PreviousValue != ExpectedPreviousValue)
35+
{
36+
Debug.Log($"Expected previous value mismatch {listEvent.PreviousValue} versus {ExpectedPreviousValue}");
37+
Debug.Assert(listEvent.PreviousValue == ExpectedPreviousValue);
38+
}
5439

55-
public void Changed(NetworkListEvent<int> listEvent)
56-
{
57-
Debug.Log($"listEvent.Type is {listEvent.Type}");
40+
if (listEvent.Value != ExpectedValue)
41+
{
42+
Debug.Log($"Expected value mismatch {listEvent.Value} versus {ExpectedValue}");
43+
Debug.Assert(listEvent.Value == ExpectedValue);
44+
}
45+
46+
AddDone = true;
47+
}
5848
}
5949
}
6050

@@ -66,62 +56,30 @@ public class NetworkListChangedTests : NetcodeIntegrationTest
6656
private GameObject m_PrefabToSpawn;
6757

6858
private NetworkObject m_NetSpawnedObject1;
69-
private NetworkObject m_NetSpawnedObject2;
70-
private NetworkObject m_NetSpawnedObject3;
71-
private NetworkObject m_Object1OnClient0;
72-
private NetworkObject m_Object2OnClient0;
73-
private NetworkObject m_Object3OnClient0;
74-
75-
protected override void OnCreatePlayerPrefab()
76-
{
77-
var networkTransform = m_PlayerPrefab.AddComponent<NetworkListChangedTestComponent>();
78-
}
7959

8060
protected override void OnServerAndClientsCreated()
8161
{
8262
m_PrefabToSpawn = CreateNetworkObjectPrefab("ListChangedObject");
8363
m_PrefabToSpawn.AddComponent<ListChangedObject>();
8464
}
8565

86-
private bool RefreshNetworkObjects()
87-
{
88-
m_Object1OnClient0 = ListChangedObject.GetNetworkObjectById(m_NetSpawnedObject1.NetworkObjectId);
89-
m_Object2OnClient0 = ListChangedObject.GetNetworkObjectById(m_NetSpawnedObject2.NetworkObjectId);
90-
m_Object3OnClient0 = ListChangedObject.GetNetworkObjectById(m_NetSpawnedObject3.NetworkObjectId);
91-
if (m_Object1OnClient0 == null || m_Object2OnClient0 == null || m_Object3OnClient0 == null)
92-
{
93-
return false;
94-
}
95-
Assert.True(m_Object1OnClient0.NetworkManagerOwner == m_ClientNetworkManagers[0]);
96-
Assert.True(m_Object2OnClient0.NetworkManagerOwner == m_ClientNetworkManagers[0]);
97-
Assert.True(m_Object3OnClient0.NetworkManagerOwner == m_ClientNetworkManagers[0]);
98-
return true;
99-
}
100-
101-
10266
[UnityTest]
10367
public IEnumerator NetworkListChangedTest()
10468
{
10569
m_ClientId0 = m_ClientNetworkManagers[0].LocalClientId;
106-
ListChangedObject.ClientTargetedNetworkObjects.Clear();
107-
ListChangedObject.ClientIdToTarget = m_ClientId0;
10870

10971
// create 3 objects
11072
var spawnedObject1 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager);
111-
var spawnedObject2 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager);
112-
var spawnedObject3 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager);
11373
m_NetSpawnedObject1 = spawnedObject1.GetComponent<NetworkObject>();
114-
m_NetSpawnedObject2 = spawnedObject2.GetComponent<NetworkObject>();
115-
m_NetSpawnedObject3 = spawnedObject3.GetComponent<NetworkObject>();
116-
117-
// get the NetworkObject on a client instance
118-
yield return WaitForConditionOrTimeOut(RefreshNetworkObjects);
119-
AssertOnTimeout($"Could not refresh all NetworkObjects!");
12074

12175
m_NetSpawnedObject1.GetComponent<ListChangedObject>().MyNetworkList.Add(42);
76+
m_NetSpawnedObject1.GetComponent<ListChangedObject>().ExpectedPreviousValue = 42;
77+
m_NetSpawnedObject1.GetComponent<ListChangedObject>().ExpectedValue = 44;
12278
m_NetSpawnedObject1.GetComponent<ListChangedObject>().MyNetworkList[0] = 44;
12379

124-
// todo
80+
Debug.Assert(m_NetSpawnedObject1.GetComponent<ListChangedObject>().AddDone);
81+
82+
return null;
12583
}
12684
}
12785
}

0 commit comments

Comments
 (0)