Skip to content

Commit 5af6482

Browse files
test
Adding integration test to validate that mixed authority NetworkTransform hierarchies are working properly.
1 parent bcc3e71 commit 5af6482

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Unity.Netcode.Components;
5+
using Unity.Netcode.TestHelpers.Runtime;
6+
using UnityEngine;
7+
using UnityEngine.TestTools;
8+
9+
namespace Unity.Netcode.RuntimeTests
10+
{
11+
internal class NetworkTransformMixedAuthorityTests : IntegrationTestWithApproximation
12+
{
13+
private const float k_MotionMagnitude = 5.5f;
14+
private const int k_Iterations = 4;
15+
16+
protected override int NumberOfClients => 2;
17+
18+
private StringBuilder m_ErrorMsg = new StringBuilder();
19+
private List<NetworkManager> m_NetworkManagers = new List<NetworkManager>();
20+
21+
protected override void OnCreatePlayerPrefab()
22+
{
23+
m_PlayerPrefab.AddComponent<NetworkTransform>();
24+
25+
var childGameObject = new GameObject();
26+
childGameObject.transform.parent = m_PlayerPrefab.transform;
27+
var childNetworkTransform = childGameObject.AddComponent<NetworkTransform>();
28+
childNetworkTransform.AuthorityMode = NetworkTransform.AuthorityModes.Owner;
29+
childNetworkTransform.InLocalSpace = true;
30+
31+
base.OnCreatePlayerPrefab();
32+
}
33+
34+
private void MovePlayers()
35+
{
36+
foreach (var networkManager in m_NetworkManagers)
37+
{
38+
var direction = GetRandomVector3(-1.0f, 1.0f);
39+
var playerObject = networkManager.LocalClient.PlayerObject;
40+
var playerObjectId = networkManager.LocalClient.PlayerObject.NetworkObjectId;
41+
// Server authoritative
42+
var serverPlayerClone = m_ServerNetworkManager.SpawnManager.SpawnedObjects[playerObjectId];
43+
serverPlayerClone.transform.position += direction * k_MotionMagnitude;
44+
// Owner authoritative
45+
var childTransform = networkManager.LocalClient.PlayerObject.transform.GetChild(0);
46+
childTransform.localPosition += direction * k_MotionMagnitude;
47+
}
48+
}
49+
50+
private bool AllInstancePositionsMatch()
51+
{
52+
m_ErrorMsg.Clear();
53+
foreach (var networkManager in m_NetworkManagers)
54+
{
55+
var playerObject = networkManager.LocalClient.PlayerObject;
56+
var playerObjectId = networkManager.LocalClient.PlayerObject.NetworkObjectId;
57+
var serverRootPosition = m_ServerNetworkManager.SpawnManager.SpawnedObjects[playerObjectId].transform.position;
58+
var ownerChildPosition = networkManager.LocalClient.PlayerObject.transform.GetChild(0).localPosition;
59+
foreach (var client in m_NetworkManagers)
60+
{
61+
if (client == networkManager)
62+
{
63+
continue;
64+
}
65+
var playerClone = client.SpawnManager.SpawnedObjects[playerObjectId];
66+
var cloneRootPosition = playerClone.transform.position;
67+
var cloneChildPosition = playerClone.transform.GetChild(0).localPosition;
68+
69+
if (!Approximately(serverRootPosition, cloneRootPosition))
70+
{
71+
m_ErrorMsg.AppendLine($"[{playerObject.name}][{playerClone.name}] Root mismatch ({GetVector3Values(serverRootPosition)})({GetVector3Values(cloneRootPosition)})!");
72+
}
73+
74+
if (!Approximately(ownerChildPosition, cloneChildPosition))
75+
{
76+
m_ErrorMsg.AppendLine($"[{playerObject.name}][{playerClone.name}] Child mismatch ({GetVector3Values(ownerChildPosition)})({GetVector3Values(cloneChildPosition)})!");
77+
}
78+
}
79+
}
80+
return m_ErrorMsg.Length == 0;
81+
}
82+
83+
/// <summary>
84+
/// Client-Server Only
85+
/// Validates that mixed authority is working properly
86+
/// Root -- Server Authoritative
87+
/// |--Child -- Owner Authoritative
88+
/// </summary>
89+
[UnityTest]
90+
public IEnumerator MixedAuthorityTest()
91+
{
92+
m_NetworkManagers.Add(m_ServerNetworkManager);
93+
m_NetworkManagers.AddRange(m_ClientNetworkManagers);
94+
95+
for (int i = 0; i < k_Iterations; i++)
96+
{
97+
MovePlayers();
98+
yield return WaitForConditionOrTimeOut(AllInstancePositionsMatch);
99+
AssertOnTimeout($"Transforms failed to synchronize!");
100+
}
101+
}
102+
}
103+
}

com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformMixedAuthorityTests.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)