Skip to content

Commit a819265

Browse files
committed
Catch any exceptions in PrefabHandler.Instantiate
1 parent b3ed5c4 commit a819265

File tree

3 files changed

+59
-12
lines changed

3 files changed

+59
-12
lines changed

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,15 @@ internal NetworkObject HandleNetworkPrefabSpawn(uint networkPrefabAssetHash, ulo
287287
{
288288
if (m_PrefabAssetToPrefabHandlerWithData.TryGetValue(networkPrefabAssetHash, out var prefabInstanceHandler))
289289
{
290-
networkObjectInstance = prefabInstanceHandler.Instantiate(ownerClientId, position, rotation, instantiationData);
290+
try
291+
{
292+
networkObjectInstance = prefabInstanceHandler.Instantiate(ownerClientId, position, rotation, instantiationData);
293+
}
294+
catch(Exception ex)
295+
{
296+
Debug.LogException(ex);
297+
return null;
298+
}
291299
}
292300
else
293301
{
@@ -297,7 +305,15 @@ internal NetworkObject HandleNetworkPrefabSpawn(uint networkPrefabAssetHash, ulo
297305
}
298306
else if (m_PrefabAssetToPrefabHandler.TryGetValue(networkPrefabAssetHash, out var prefabInstanceHandler))
299307
{
300-
networkObjectInstance = prefabInstanceHandler.Instantiate(ownerClientId, position, rotation);
308+
try
309+
{
310+
networkObjectInstance = prefabInstanceHandler.Instantiate(ownerClientId, position, rotation);
311+
}
312+
catch(Exception ex)
313+
{
314+
Debug.LogException(ex);
315+
return null;
316+
}
301317
}
302318

303319
// Now we must make sure this alternate PrefabAsset spawned in place of the prefab asset with the networkPrefabAssetHash (GlobalObjectIdHash)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Unity.Netcode.RuntimeTests
1111
/// <summary>
1212
/// Tests calling destroy on spawned / unspawned <see cref="NetworkObject"/>s. Expected behavior:
1313
/// - Server or client destroy on unspawned => Object gets destroyed, no exceptions
14-
/// - Server destroy spawned => Object gets destroyed and despawned/destroyed on all clients. Server does not run <see cref="NetworkPrefaInstanceHandler.HandleNetworkPrefabDestroy"/>. Client runs it.
14+
/// - Server destroy spawned => Object gets destroyed and despawned/destroyed on all clients. Server does not run <see cref="NetworkPrefabInstanceHandler.HandleNetworkPrefabDestroy"/>. Client runs it.
1515
/// - Client destroy spawned => throw exception.
1616
/// </summary>
1717

com.unity.netcode.gameobjects/Tests/Runtime/Prefabs/NetworkPrefabHandlerTests.cs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using NUnit.Framework;
55
using Unity.Netcode.TestHelpers.Runtime;
66
using UnityEngine;
7+
using UnityEngine.TestTools;
78

89
namespace Unity.Netcode.RuntimeTests
910
{
@@ -93,11 +94,11 @@ public void NetworkConfigInvalidNetworkPrefabTest()
9394
private const string k_PrefabObjectName = "NetworkPrefabHandlerTestObject";
9495

9596
[Test]
96-
public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
97+
public void NetworkPrefabHandlerClass([Values] NetworkTopologyTypes topologyType)
9798
{
9899
var networkConfig = new NetworkConfig()
99100
{
100-
NetworkTopology = distributedAuthority ? NetworkTopologyTypes.DistributedAuthority : NetworkTopologyTypes.ClientServer,
101+
NetworkTopology = topologyType,
101102
};
102103

103104
Assert.IsTrue(NetworkManagerHelper.StartNetworkManager(out _, networkConfig: networkConfig));
@@ -107,13 +108,13 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
107108
NetworkObject baseObject = NetworkManagerHelper.InstantiatedNetworkObjects[baseObjectID];
108109

109110
var networkPrefabHandler = new NetworkPrefabHandler();
110-
var networkPrefaInstanceHandler = new NetworkPrefaInstanceHandler(baseObject);
111+
var networkPrefabInstanceHandler = new NetworkPrefabInstanceHandler(baseObject);
111112

112113
var prefabPosition = new Vector3(1.0f, 5.0f, 3.0f);
113114
var prefabRotation = new Quaternion(1.0f, 0.5f, 0.4f, 0.1f);
114115

115116
//Register via GameObject
116-
var gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject.gameObject, networkPrefaInstanceHandler);
117+
var gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject.gameObject, networkPrefabInstanceHandler);
117118

118119
//Test result of registering via GameObject reference
119120
Assert.True(gameObjectRegistered);
@@ -134,7 +135,7 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
134135
networkPrefabHandler.RemoveHandler(baseObject); //Remove our handler
135136

136137
//Register via NetworkObject
137-
gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject, networkPrefaInstanceHandler);
138+
gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject, networkPrefabInstanceHandler);
138139

139140
//Test result of registering via NetworkObject reference
140141
Assert.True(gameObjectRegistered);
@@ -159,7 +160,7 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
159160
networkPrefabHandler.RemoveHandler(baseObject); //Remove our handler
160161

161162
//Register via GlobalObjectIdHash
162-
gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject.GlobalObjectIdHash, networkPrefaInstanceHandler);
163+
gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject.GlobalObjectIdHash, networkPrefabInstanceHandler);
163164

164165
//Test result of registering via GlobalObjectIdHash reference
165166
Assert.True(gameObjectRegistered);
@@ -183,7 +184,21 @@ public void NetworkPrefabHandlerClass([Values] bool distributedAuthority)
183184
networkPrefabHandler.HandleNetworkPrefabDestroy(spawnedObject); //Destroy our prefab instance
184185
networkPrefabHandler.RemoveHandler(baseObject); //Remove our handler
185186

186-
Assert.False(networkPrefaInstanceHandler.StillHasInstances());
187+
// Register a handler that throws an exception
188+
var networkPrefabExceptionThrower = new NetworkPrefabExceptionThrower();
189+
gameObjectRegistered = networkPrefabHandler.AddHandler(baseObject, networkPrefabExceptionThrower);
190+
//Test result of registering exception handler
191+
Assert.True(gameObjectRegistered);
192+
193+
LogAssert.Expect(LogType.Exception, "Exception: exception while instantiating");
194+
spawnedObject = networkPrefabHandler.HandleNetworkPrefabSpawn(baseObject.GlobalObjectIdHash, 0, prefabPosition, prefabRotation);
195+
196+
// No object should have been spawned, but test should have continued
197+
Assert.Null(spawnedObject);
198+
199+
networkPrefabHandler.RemoveHandler(baseObject); //Remove our handler
200+
201+
Assert.False(networkPrefabInstanceHandler.StillHasInstances());
187202
}
188203

189204
[SetUp]
@@ -216,7 +231,7 @@ public void TearDown()
216231
/// <summary>
217232
/// The Prefab instance handler to use for this test
218233
/// </summary>
219-
internal class NetworkPrefaInstanceHandler : INetworkPrefabInstanceHandler
234+
internal class NetworkPrefabInstanceHandler : INetworkPrefabInstanceHandler
220235
{
221236
private NetworkObject m_NetworkObject;
222237

@@ -243,10 +258,26 @@ public bool StillHasInstances()
243258
return (m_Instances.Count > 0);
244259
}
245260

246-
public NetworkPrefaInstanceHandler(NetworkObject networkObject)
261+
public NetworkPrefabInstanceHandler(NetworkObject networkObject)
247262
{
248263
m_NetworkObject = networkObject;
249264
m_Instances = new List<NetworkObject>();
250265
}
251266
}
267+
268+
/// <summary>
269+
/// Causes an exception during client connection
270+
/// </summary>
271+
internal class NetworkPrefabExceptionThrower : INetworkPrefabInstanceHandler
272+
{
273+
public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation)
274+
{
275+
throw new Exception("exception while instantiating");
276+
}
277+
278+
public void Destroy(NetworkObject networkObject)
279+
{
280+
UnityEngine.Object.Destroy(networkObject.gameObject);
281+
}
282+
}
252283
}

0 commit comments

Comments
 (0)