Skip to content

Commit 45a3715

Browse files
test
Adding a test to validate spawning a NetworkObject during OnNetworkSpawn, OnNetworkPostSpawn, and OnNetworkSessionSynchronized when using a distributed authority network topology.
1 parent f6f6658 commit 45a3715

File tree

2 files changed

+149
-0
lines changed

2 files changed

+149
-0
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using NUnit.Framework;
5+
using Unity.Netcode.TestHelpers.Runtime;
6+
using UnityEngine;
7+
using UnityEngine.TestTools;
8+
9+
namespace Unity.Netcode.RuntimeTests
10+
{
11+
[TestFixture(NetworkBehaviourSpawnTimes.OnNetworkSpawn, SceneManagement.Enabled)]
12+
[TestFixture(NetworkBehaviourSpawnTimes.OnNetworkPostSpawn, SceneManagement.Enabled)]
13+
[TestFixture(NetworkBehaviourSpawnTimes.OnSynchronized, SceneManagement.Enabled)]
14+
[TestFixture(NetworkBehaviourSpawnTimes.OnNetworkSpawn, SceneManagement.Disabled)]
15+
[TestFixture(NetworkBehaviourSpawnTimes.OnNetworkPostSpawn, SceneManagement.Disabled)]
16+
[TestFixture(NetworkBehaviourSpawnTimes.OnSynchronized, SceneManagement.Disabled)]
17+
internal class SpawnDuringSynchronizationTests : NetcodeIntegrationTest
18+
{
19+
protected override int NumberOfClients => 2;
20+
21+
private List<NetworkManager> m_AllNetworkManagers = new List<NetworkManager>();
22+
private StringBuilder m_ErrorLog = new StringBuilder();
23+
24+
private NetworkBehaviourSpawnTimes m_SpawnTime;
25+
private bool m_EnableSceneManagement;
26+
internal enum NetworkBehaviourSpawnTimes
27+
{
28+
OnNetworkSpawn,
29+
OnNetworkPostSpawn,
30+
OnSynchronized
31+
}
32+
33+
internal enum SceneManagement
34+
{
35+
Enabled,
36+
Disabled,
37+
}
38+
39+
internal class SpawnTestComponent : NetworkBehaviour
40+
{
41+
public GameObject PrefabToSpawn;
42+
public NetworkObject SpawnedObject { get; private set; }
43+
public NetworkBehaviourSpawnTimes SpawnTime;
44+
45+
private void SpawnObject(NetworkBehaviourSpawnTimes spawnTime)
46+
{
47+
if (IsOwner && SpawnTime == spawnTime)
48+
{
49+
SpawnedObject = NetworkObject.InstantiateAndSpawn(PrefabToSpawn, NetworkManager, OwnerClientId);
50+
}
51+
}
52+
53+
public override void OnNetworkSpawn()
54+
{
55+
SpawnObject(NetworkBehaviourSpawnTimes.OnNetworkSpawn);
56+
base.OnNetworkSpawn();
57+
}
58+
59+
protected override void OnNetworkPostSpawn()
60+
{
61+
SpawnObject(NetworkBehaviourSpawnTimes.OnNetworkPostSpawn);
62+
base.OnNetworkPostSpawn();
63+
}
64+
65+
protected override void OnNetworkSessionSynchronized()
66+
{
67+
SpawnObject(NetworkBehaviourSpawnTimes.OnSynchronized);
68+
base.OnNetworkSessionSynchronized();
69+
}
70+
}
71+
72+
73+
public SpawnDuringSynchronizationTests(NetworkBehaviourSpawnTimes spawnTime, SceneManagement sceneManagement) : base(NetworkTopologyTypes.DistributedAuthority, HostOrServer.DAHost)
74+
{
75+
m_SpawnTime = spawnTime;
76+
m_EnableSceneManagement = sceneManagement == SceneManagement.Enabled;
77+
}
78+
79+
protected override void OnCreatePlayerPrefab()
80+
{
81+
var spawnTestComponent = m_PlayerPrefab.AddComponent<SpawnTestComponent>();
82+
spawnTestComponent.SpawnTime = m_SpawnTime;
83+
spawnTestComponent.NetworkObject.SetOwnershipStatus(NetworkObject.OwnershipStatus.None);
84+
base.OnCreatePlayerPrefab();
85+
}
86+
87+
protected override void OnServerAndClientsCreated()
88+
{
89+
var spawnTestComponent = m_PlayerPrefab.GetComponent<SpawnTestComponent>();
90+
spawnTestComponent.PrefabToSpawn = CreateNetworkObjectPrefab("ObjToSpawn");
91+
spawnTestComponent.PrefabToSpawn.GetComponent<NetworkObject>().SetOwnershipStatus(NetworkObject.OwnershipStatus.Transferable);
92+
if (!UseCMBService())
93+
{
94+
m_ServerNetworkManager.NetworkConfig.EnableSceneManagement = m_EnableSceneManagement;
95+
}
96+
foreach (var networkManager in m_ClientNetworkManagers)
97+
{
98+
networkManager.NetworkConfig.EnableSceneManagement = m_EnableSceneManagement;
99+
}
100+
base.OnServerAndClientsCreated();
101+
}
102+
103+
private bool AllClientsSpawnedObject()
104+
{
105+
m_ErrorLog.Clear();
106+
var spawnTestComponent = (SpawnTestComponent)null;
107+
foreach (var networkManager in m_AllNetworkManagers)
108+
{
109+
spawnTestComponent = networkManager.LocalClient.PlayerObject.GetComponent<SpawnTestComponent>();
110+
if (spawnTestComponent.SpawnedObject == null || !spawnTestComponent.SpawnedObject.IsSpawned)
111+
{
112+
m_ErrorLog.AppendLine($"{networkManager.name}'s player failed to spawn the network prefab!");
113+
break;
114+
}
115+
foreach (var networkManagerToCheck in m_AllNetworkManagers)
116+
{
117+
if (networkManagerToCheck == networkManager)
118+
{
119+
continue;
120+
}
121+
if (!networkManagerToCheck.SpawnManager.SpawnedObjects.ContainsKey(spawnTestComponent.NetworkObjectId))
122+
{
123+
m_ErrorLog.AppendLine($"{networkManager.name}'s player failed to spawn the network prefab!");
124+
}
125+
}
126+
}
127+
return m_ErrorLog.Length == 0;
128+
}
129+
130+
/// <summary>
131+
/// Validates that a client can spawn network prefabs during OnNetworkSpawn, OnNetworkPostSpawn, and OnNetworkSessionSynchronized.
132+
/// </summary>
133+
[UnityTest]
134+
public IEnumerator SpawnDuringSynchronization()
135+
{
136+
m_AllNetworkManagers.Clear();
137+
m_AllNetworkManagers.AddRange(m_ClientNetworkManagers);
138+
if (!UseCMBService())
139+
{
140+
m_AllNetworkManagers.Add(m_ServerNetworkManager);
141+
}
142+
143+
yield return WaitForConditionOrTimeOut(AllClientsSpawnedObject);
144+
AssertOnTimeout(m_ErrorLog.ToString());
145+
}
146+
}
147+
}

com.unity.netcode.gameobjects/Tests/Runtime/DistributedAuthority/SpawnDuringSynchronizationTests.cs.meta

Lines changed: 2 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)