Skip to content

Commit 0841a44

Browse files
fix: inscene networkobjects get destroyed upon client networkmanager shutting down without connecting (#1809)
1 parent fc59679 commit 0841a44

File tree

4 files changed

+151
-2
lines changed

4 files changed

+151
-2
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1919
- Removed `com.unity.modules.animation`, `com.unity.modules.physics` and `com.unity.modules.physics2d` dependencies from the package (#1812)
2020

2121
### Fixed
22-
22+
- Fixed in-scene NetworkObjects get destroyed if a client fails to connect and shuts down the NetworkManager. (#1809)
2323
- Fixed user never being notified in the editor that a NetworkBehaviour requires a NetworkObject to function properly. (#1808)
2424
- Fixed PlayerObjects and dynamically spawned NetworkObjects not being added to the NetworkClient's OwnedObjects (#1801)
2525
- Fixed issue where NetworkManager would continue starting even if the NetworkTransport selected failed. (#1780)

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ internal void DespawnAndDestroyNetworkObjects()
740740

741741
OnDespawnObject(networkObjects[i], shouldDestroy);
742742
}
743-
else
743+
else if (networkObjects[i].IsSceneObject != null && !networkObjects[i].IsSceneObject.Value)
744744
{
745745
UnityEngine.Object.Destroy(networkObjects[i].gameObject);
746746
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
2+
using System;
3+
using System.Collections;
4+
using System.Linq;
5+
using NUnit.Framework;
6+
using UnityEngine;
7+
using UnityEngine.TestTools;
8+
using UnityEngine.SceneManagement;
9+
using Unity.Netcode;
10+
using Unity.Netcode.TestHelpers.Runtime;
11+
using Object = UnityEngine.Object;
12+
13+
namespace TestProject.RuntimeTests
14+
{
15+
public class SceneObjectsNotDestroyedOnShutdownTest
16+
{
17+
private const string k_TestScene = "InSceneNetworkObject";
18+
private const string k_SceneObjectName = "InSceneObject";
19+
private Scene m_TestScene;
20+
private NetworkManager m_ClientNetworkManager;
21+
private GameObject m_NetworkManagerGameObject;
22+
private WaitForSeconds m_DefaultWaitForTick = new WaitForSeconds(1.0f / 30);
23+
24+
[SetUp]
25+
public void Setup()
26+
{
27+
m_NetworkManagerGameObject = new GameObject();
28+
m_ClientNetworkManager = m_NetworkManagerGameObject.AddComponent<NetworkManager>();
29+
m_ClientNetworkManager.NetworkConfig = new NetworkConfig();
30+
m_ClientNetworkManager.NetworkConfig.NetworkTransport = m_NetworkManagerGameObject.AddComponent<BlankTestingTransport>();
31+
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
32+
SceneManager.LoadSceneAsync(k_TestScene, LoadSceneMode.Additive);
33+
}
34+
35+
private void SceneManager_sceneLoaded(Scene scene, LoadSceneMode loadSceneMode)
36+
{
37+
if (scene.name == k_TestScene)
38+
{
39+
m_TestScene = scene;
40+
}
41+
}
42+
43+
[UnityTest]
44+
public IEnumerator SceneObjectsNotDestroyedOnShutdown()
45+
{
46+
var timeoutHelper = new TimeoutHelper(2);
47+
48+
// Wait for the scene with the in-scene placed NetworkObject to be loaded.
49+
yield return NetcodeIntegrationTest.WaitForConditionOrTimeOut(() => m_TestScene.IsValid() && m_TestScene.isLoaded, timeoutHelper);
50+
Assert.False(timeoutHelper.TimedOut, "Timed out waiting for scene to load!");
51+
52+
var loadedInSceneObject = Object.FindObjectsOfType<NetworkObject>().Where((c) => c.name == k_SceneObjectName).FirstOrDefault();
53+
54+
Assert.IsNotNull(loadedInSceneObject, $"Failed to find {k_SceneObjectName} before starting client!");
55+
56+
// Only start the client
57+
m_ClientNetworkManager.StartClient();
58+
59+
// Wait for a tick
60+
yield return m_DefaultWaitForTick;
61+
62+
// Shutdown the client
63+
m_ClientNetworkManager.Shutdown();
64+
65+
// Wait for a tick
66+
yield return m_DefaultWaitForTick;
67+
68+
// Find the same object
69+
loadedInSceneObject = Object.FindObjectsOfType<NetworkObject>().Where((c) => c.name == k_SceneObjectName).FirstOrDefault();
70+
71+
// Verify it still exists
72+
Assert.IsNotNull(loadedInSceneObject, $"Failed to find {k_SceneObjectName} after starting client!");
73+
}
74+
75+
[TearDown]
76+
public void TearDown()
77+
{
78+
SceneManager.sceneLoaded -= SceneManager_sceneLoaded;
79+
80+
if (m_TestScene.IsValid() && m_TestScene.isLoaded)
81+
{
82+
SceneManager.UnloadSceneAsync(m_TestScene);
83+
}
84+
85+
if (m_NetworkManagerGameObject != null)
86+
{
87+
Object.DestroyImmediate(m_NetworkManagerGameObject);
88+
}
89+
}
90+
91+
internal class BlankTestingTransport : TestingNetworkTransport
92+
{
93+
public override ulong ServerClientId { get; } = 0;
94+
public override void Send(ulong clientId, ArraySegment<byte> payload, NetworkDelivery networkDelivery)
95+
{
96+
}
97+
98+
public override NetworkEvent PollEvent(out ulong clientId, out ArraySegment<byte> payload, out float receiveTime)
99+
{
100+
clientId = 0;
101+
payload = new ArraySegment<byte>();
102+
receiveTime = 0;
103+
return NetworkEvent.Nothing;
104+
}
105+
106+
public override bool StartClient()
107+
{
108+
return true;
109+
}
110+
111+
public override bool StartServer()
112+
{
113+
return true;
114+
}
115+
116+
public override void DisconnectRemoteClient(ulong clientId)
117+
{
118+
}
119+
120+
public override void DisconnectLocalClient()
121+
{
122+
}
123+
124+
public override ulong GetCurrentRtt(ulong clientId)
125+
{
126+
return 0;
127+
}
128+
129+
public override void Shutdown()
130+
{
131+
}
132+
133+
public override void Initialize(NetworkManager networkManager = null)
134+
{
135+
}
136+
}
137+
}
138+
}

testproject/Assets/Tests/Runtime/SceneObjectsNotDestroyedOnShutdownTest.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)