Skip to content

Commit ad68997

Browse files
authored
fix: allowing quick NetworkHide and NetworkShow [MTT-3488] (#1944)
* fix: allowing quick NetworkHide and NetworkShow [MTT-3488] * fix: allowing quick NetworkHide and NetworkShow [MTT-3488] changelog and tests * fix: allowing quick NetworkHide and NetworkShow [MTT-3488] test timing based on ticks
1 parent b8b6dfc commit ad68997

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Additional documentation and release notes are available at [Multiplayer Documen
1010

1111
- Fixed: Hosting again after failing to host now works correctly
1212

13+
- Fixed: NetworkHide followed by NetworkShow on the same frame works correctly (#1940)
14+
1315
## [1.0.0-pre.8] - 2022-04-27
1416

1517
### Changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,10 @@ private void OnDestroy()
352352
if (NetworkManager != null && NetworkManager.SpawnManager != null &&
353353
NetworkManager.SpawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out var networkObject))
354354
{
355-
NetworkManager.SpawnManager.OnDespawnObject(networkObject, false);
355+
if (this == networkObject)
356+
{
357+
NetworkManager.SpawnManager.OnDespawnObject(networkObject, false);
358+
}
356359
}
357360
}
358361

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

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ private IEnumerator CheckVisible(bool target)
7474
int count = 0;
7575
do
7676
{
77-
yield return new WaitForSeconds(0.1f);
77+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 5);
7878
count++;
7979

8080
if (count > 20)
@@ -140,18 +140,18 @@ private IEnumerator RefreshNetworkObjects()
140140
{
141141
var serverClientPlayerResult = new NetcodeIntegrationTestHelpers.ResultWrapper<NetworkObject>();
142142
yield return NetcodeIntegrationTestHelpers.GetNetworkObjectByRepresentation(
143-
x => x.NetworkObjectId == m_NetSpawnedObject1.NetworkObjectId,
143+
x => x.NetworkObjectId == m_NetSpawnedObject1.NetworkObjectId && x.IsSpawned,
144144
m_ClientNetworkManagers[0],
145145
serverClientPlayerResult);
146146
m_Object1OnClient0 = serverClientPlayerResult.Result;
147147
yield return NetcodeIntegrationTestHelpers.GetNetworkObjectByRepresentation(
148-
x => x.NetworkObjectId == m_NetSpawnedObject2.NetworkObjectId,
148+
x => x.NetworkObjectId == m_NetSpawnedObject2.NetworkObjectId && x.IsSpawned,
149149
m_ClientNetworkManagers[0],
150150
serverClientPlayerResult);
151151
m_Object2OnClient0 = serverClientPlayerResult.Result;
152152
serverClientPlayerResult = new NetcodeIntegrationTestHelpers.ResultWrapper<NetworkObject>();
153153
yield return NetcodeIntegrationTestHelpers.GetNetworkObjectByRepresentation(
154-
x => x.NetworkObjectId == m_NetSpawnedObject3.NetworkObjectId,
154+
x => x.NetworkObjectId == m_NetSpawnedObject3.NetworkObjectId && x.IsSpawned,
155155
m_ClientNetworkManagers[0],
156156
serverClientPlayerResult);
157157
m_Object3OnClient0 = serverClientPlayerResult.Result;
@@ -196,11 +196,11 @@ public IEnumerator NetworkShowHideTest()
196196
// hide them on one client
197197
Show(mode == 0, false);
198198

199-
yield return new WaitForSeconds(1.0f);
199+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 5);
200200

201201
m_NetSpawnedObject1.GetComponent<ShowHideObject>().MyNetworkVariable.Value = 3;
202202

203-
yield return new WaitForSeconds(1.0f);
203+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 5);
204204

205205
// verify they got hidden
206206
yield return CheckVisible(false);
@@ -213,5 +213,44 @@ public IEnumerator NetworkShowHideTest()
213213
yield return CheckVisible(true);
214214
}
215215
}
216+
217+
[UnityTest]
218+
public IEnumerator NetworkShowHideQuickTest()
219+
{
220+
m_ClientId0 = m_ClientNetworkManagers[0].LocalClientId;
221+
222+
var spawnedObject1 = UnityEngine.Object.Instantiate(m_PrefabToSpawn);
223+
var spawnedObject2 = UnityEngine.Object.Instantiate(m_PrefabToSpawn);
224+
var spawnedObject3 = UnityEngine.Object.Instantiate(m_PrefabToSpawn);
225+
m_NetSpawnedObject1 = spawnedObject1.GetComponent<NetworkObject>();
226+
m_NetSpawnedObject2 = spawnedObject2.GetComponent<NetworkObject>();
227+
m_NetSpawnedObject3 = spawnedObject3.GetComponent<NetworkObject>();
228+
m_NetSpawnedObject1.NetworkManagerOwner = m_ServerNetworkManager;
229+
m_NetSpawnedObject2.NetworkManagerOwner = m_ServerNetworkManager;
230+
m_NetSpawnedObject3.NetworkManagerOwner = m_ServerNetworkManager;
231+
m_NetSpawnedObject1.Spawn();
232+
m_NetSpawnedObject2.Spawn();
233+
m_NetSpawnedObject3.Spawn();
234+
235+
for (int mode = 0; mode < 2; mode++)
236+
{
237+
// get the NetworkObject on a client instance
238+
yield return RefreshNetworkObjects();
239+
240+
// check object start visible
241+
yield return CheckVisible(true);
242+
243+
// hide and show them on one client, during the same frame
244+
Show(mode == 0, false);
245+
Show(mode == 0, true);
246+
247+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 5);
248+
yield return RefreshNetworkObjects();
249+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 5);
250+
251+
// verify they become visible
252+
yield return CheckVisible(true);
253+
}
254+
}
216255
}
217256
}

0 commit comments

Comments
 (0)