Skip to content

Commit 977746d

Browse files
fix: nested networktransforms not updating (#3016)
* fix Updating all NetworkTransform instances that belong to a specific NetworkObject as opposed to just the root. Also not updating when not spawned or disabled NetworkTransforms. * test Making test asset adjustments for recent updates in NetworkTransform. * update Adding change log entry. * fix Assure we are trying to remove a valid `NetworkObject`.
1 parent 285e307 commit 977746d

File tree

10 files changed

+124
-77
lines changed

10 files changed

+124
-77
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1414

1515
### Fixed
1616

17+
- Fixed issue where nested `NetworkTransform` components were not getting updated. (#3016)
1718
- Fixed issue by adding null checks in `NetworkVariableBase.CanClientRead` and `NetworkVariableBase.CanClientWrite` methods to ensure safe access to `NetworkBehaviour`. (#3012)
1819
- Fixed issue where `FixedStringSerializer<T>` was using `NetworkVariableSerialization<byte>.AreEqual` to determine if two bytes were equal causes an exception to be thrown due to no byte serializer having been defined. (#3009)
1920
- Fixed Issue where a state with dual triggers, inbound and outbound, could cause a false layer to layer state transition message to be sent to non-authority `NetworkAnimator` instances and cause a warning message to be logged. (#3008)

com.unity.netcode.gameobjects/Runtime/Components/NetworkTransform.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2960,7 +2960,10 @@ private void CleanUpOnDestroyOrDespawn()
29602960
#else
29612961
var forUpdate = true;
29622962
#endif
2963-
NetworkManager?.NetworkTransformRegistration(this, forUpdate, false);
2963+
if (m_CachedNetworkObject != null)
2964+
{
2965+
NetworkManager?.NetworkTransformRegistration(m_CachedNetworkObject, forUpdate, false);
2966+
}
29642967
DeregisterForTickUpdate(this);
29652968
CanCommitToTransform = false;
29662969
}
@@ -3069,7 +3072,7 @@ private void InternalInitialization(bool isOwnershipChange = false)
30693072
if (CanCommitToTransform)
30703073
{
30713074
// Make sure authority doesn't get added to updates (no need to do this on the authority side)
3072-
m_CachedNetworkManager.NetworkTransformRegistration(this, forUpdate, false);
3075+
m_CachedNetworkManager.NetworkTransformRegistration(NetworkObject, forUpdate, false);
30733076
if (UseHalfFloatPrecision)
30743077
{
30753078
m_HalfPositionState = new NetworkDeltaPosition(currentPosition, m_CachedNetworkManager.ServerTime.Tick, math.bool3(SyncPositionX, SyncPositionY, SyncPositionZ));
@@ -3090,7 +3093,7 @@ private void InternalInitialization(bool isOwnershipChange = false)
30903093
else
30913094
{
30923095
// Non-authority needs to be added to updates for interpolation and applying state purposes
3093-
m_CachedNetworkManager.NetworkTransformRegistration(this, forUpdate, true);
3096+
m_CachedNetworkManager.NetworkTransformRegistration(NetworkObject, forUpdate, true);
30943097
// Remove this instance from the tick update
30953098
DeregisterForTickUpdate(this);
30963099
ResetInterpolatedStateToCurrentAuthoritativeState();

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

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#endif
99
using UnityEngine.SceneManagement;
1010
using Debug = UnityEngine.Debug;
11-
using Unity.Netcode.Components;
1211

1312
namespace Unity.Netcode
1413
{
@@ -215,40 +214,40 @@ internal void PromoteSessionOwner(ulong clientId)
215214
}
216215
}
217216

218-
internal Dictionary<ulong, NetworkTransform> NetworkTransformUpdate = new Dictionary<ulong, NetworkTransform>();
217+
internal Dictionary<ulong, NetworkObject> NetworkTransformUpdate = new Dictionary<ulong, NetworkObject>();
219218
#if COM_UNITY_MODULES_PHYSICS
220-
internal Dictionary<ulong, NetworkTransform> NetworkTransformFixedUpdate = new Dictionary<ulong, NetworkTransform>();
219+
internal Dictionary<ulong, NetworkObject> NetworkTransformFixedUpdate = new Dictionary<ulong, NetworkObject>();
221220
#endif
222221

223-
internal void NetworkTransformRegistration(NetworkTransform networkTransform, bool forUpdate = true, bool register = true)
222+
internal void NetworkTransformRegistration(NetworkObject networkObject, bool onUpdate = true, bool register = true)
224223
{
225-
if (forUpdate)
224+
if (onUpdate)
226225
{
227226
if (register)
228227
{
229-
if (!NetworkTransformUpdate.ContainsKey(networkTransform.NetworkObjectId))
228+
if (!NetworkTransformUpdate.ContainsKey(networkObject.NetworkObjectId))
230229
{
231-
NetworkTransformUpdate.Add(networkTransform.NetworkObjectId, networkTransform);
230+
NetworkTransformUpdate.Add(networkObject.NetworkObjectId, networkObject);
232231
}
233232
}
234233
else
235234
{
236-
NetworkTransformUpdate.Remove(networkTransform.NetworkObjectId);
235+
NetworkTransformUpdate.Remove(networkObject.NetworkObjectId);
237236
}
238237
}
239238
#if COM_UNITY_MODULES_PHYSICS
240239
else
241240
{
242241
if (register)
243242
{
244-
if (!NetworkTransformFixedUpdate.ContainsKey(networkTransform.NetworkObjectId))
243+
if (!NetworkTransformFixedUpdate.ContainsKey(networkObject.NetworkObjectId))
245244
{
246-
NetworkTransformFixedUpdate.Add(networkTransform.NetworkObjectId, networkTransform);
245+
NetworkTransformFixedUpdate.Add(networkObject.NetworkObjectId, networkObject);
247246
}
248247
}
249248
else
250249
{
251-
NetworkTransformFixedUpdate.Remove(networkTransform.NetworkObjectId);
250+
NetworkTransformFixedUpdate.Remove(networkObject.NetworkObjectId);
252251
}
253252
}
254253
#endif
@@ -289,11 +288,21 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
289288
#if COM_UNITY_MODULES_PHYSICS
290289
case NetworkUpdateStage.FixedUpdate:
291290
{
292-
foreach (var networkTransformEntry in NetworkTransformFixedUpdate)
291+
foreach (var networkObjectEntry in NetworkTransformFixedUpdate)
293292
{
294-
if (networkTransformEntry.Value.gameObject.activeInHierarchy && networkTransformEntry.Value.IsSpawned)
293+
// if not active or not spawned then skip
294+
if (!networkObjectEntry.Value.gameObject.activeInHierarchy || !networkObjectEntry.Value.IsSpawned)
295295
{
296-
networkTransformEntry.Value.OnFixedUpdate();
296+
continue;
297+
}
298+
299+
foreach (var networkTransformEntry in networkObjectEntry.Value.NetworkTransforms)
300+
{
301+
// only update if enabled
302+
if (networkTransformEntry.enabled)
303+
{
304+
networkTransformEntry.OnFixedUpdate();
305+
}
297306
}
298307
}
299308
}
@@ -308,11 +317,21 @@ public void NetworkUpdate(NetworkUpdateStage updateStage)
308317
case NetworkUpdateStage.PreLateUpdate:
309318
{
310319
// Non-physics based non-authority NetworkTransforms update their states after all other components
311-
foreach (var networkTransformEntry in NetworkTransformUpdate)
320+
foreach (var networkObjectEntry in NetworkTransformUpdate)
312321
{
313-
if (networkTransformEntry.Value.gameObject.activeInHierarchy && networkTransformEntry.Value.IsSpawned)
322+
// if not active or not spawned then skip
323+
if (!networkObjectEntry.Value.gameObject.activeInHierarchy || !networkObjectEntry.Value.IsSpawned)
314324
{
315-
networkTransformEntry.Value.OnUpdate();
325+
continue;
326+
}
327+
328+
foreach (var networkTransformEntry in networkObjectEntry.Value.NetworkTransforms)
329+
{
330+
// only update if enabled
331+
if (networkTransformEntry.enabled)
332+
{
333+
networkTransformEntry.OnUpdate();
334+
}
316335
}
317336
}
318337
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2359,7 +2359,7 @@ internal List<NetworkBehaviour> ChildNetworkBehaviours
23592359
{
23602360
m_ChildNetworkBehaviours.Add(networkBehaviours[i]);
23612361
var type = networkBehaviours[i].GetType();
2362-
if (type.IsInstanceOfType(typeof(NetworkTransform)) || type.IsSubclassOf(typeof(NetworkTransform)))
2362+
if (type == typeof(NetworkTransform) || type.IsInstanceOfType(typeof(NetworkTransform)) || type.IsSubclassOf(typeof(NetworkTransform)))
23632363
{
23642364
if (NetworkTransforms == null)
23652365
{

testproject/Assets/Tests/Manual/NestedNetworkTransforms/AutomatedPlayer-OA.prefab

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ MeshRenderer:
5151
m_ReflectionProbeUsage: 1
5252
m_RayTracingMode: 2
5353
m_RayTraceProcedural: 0
54+
m_RayTracingAccelStructBuildFlagsOverride: 0
55+
m_RayTracingAccelStructBuildFlags: 1
56+
m_SmallMeshCulling: 1
5457
m_RenderingLayerMask: 1
5558
m_RendererPriority: 0
5659
m_Materials:
@@ -96,6 +99,7 @@ MonoBehaviour:
9699
m_Script: {fileID: 11500000, guid: 0d8ad30fca3f9a240bdce16f0166033b, type: 3}
97100
m_Name:
98101
m_EditorClassIdentifier:
102+
AuthorityMode: 1
99103
UseUnreliableDeltas: 0
100104
SyncPositionX: 1
101105
SyncPositionY: 1
@@ -115,7 +119,6 @@ MonoBehaviour:
115119
InLocalSpace: 1
116120
Interpolate: 1
117121
SlerpPosition: 1
118-
IsServerAuthority: 1
119122
DebugTransform: 0
120123
LastUpdatedPosition: {x: 0, y: 0, z: 0}
121124
LastUpdatedScale: {x: 0, y: 0, z: 0}
@@ -295,6 +298,9 @@ MeshRenderer:
295298
m_ReflectionProbeUsage: 1
296299
m_RayTracingMode: 2
297300
m_RayTraceProcedural: 0
301+
m_RayTracingAccelStructBuildFlagsOverride: 0
302+
m_RayTracingAccelStructBuildFlags: 1
303+
m_SmallMeshCulling: 1
298304
m_RenderingLayerMask: 1
299305
m_RendererPriority: 0
300306
m_Materials:
@@ -340,6 +346,7 @@ MonoBehaviour:
340346
m_Script: {fileID: 11500000, guid: 0d8ad30fca3f9a240bdce16f0166033b, type: 3}
341347
m_Name:
342348
m_EditorClassIdentifier:
349+
AuthorityMode: 1
343350
UseUnreliableDeltas: 0
344351
SyncPositionX: 1
345352
SyncPositionY: 1
@@ -359,7 +366,6 @@ MonoBehaviour:
359366
InLocalSpace: 1
360367
Interpolate: 1
361368
SlerpPosition: 1
362-
IsServerAuthority: 1
363369
DebugTransform: 0
364370
LastUpdatedPosition: {x: 0, y: 0, z: 0}
365371
LastUpdatedScale: {x: 0, y: 0, z: 0}
@@ -388,7 +394,7 @@ PrefabInstance:
388394
objectReference: {fileID: 0}
389395
- target: {fileID: 947981134, guid: 96e0a72e30d0c46c8a5c9a750e8f5807, type: 3}
390396
propertyPath: GlobalObjectIdHash
391-
value: 503295152
397+
value: 2714446911
392398
objectReference: {fileID: 0}
393399
- target: {fileID: 3809075828520557319, guid: 96e0a72e30d0c46c8a5c9a750e8f5807,
394400
type: 3}
@@ -557,6 +563,7 @@ MonoBehaviour:
557563
m_Script: {fileID: 11500000, guid: dfb1af1a9249278438d2daa2877ee2ad, type: 3}
558564
m_Name:
559565
m_EditorClassIdentifier:
566+
AuthorityMode: 1
560567
UseUnreliableDeltas: 1
561568
SyncPositionX: 1
562569
SyncPositionY: 1
@@ -576,7 +583,6 @@ MonoBehaviour:
576583
InLocalSpace: 0
577584
Interpolate: 1
578585
SlerpPosition: 0
579-
IsServerAuthority: 1
580586
DebugTransform: 0
581587
LastUpdatedPosition: {x: 0, y: 0, z: 0}
582588
LastUpdatedScale: {x: 0, y: 0, z: 0}

testproject/Assets/Tests/Manual/NestedNetworkTransforms/AutomatedPlayerMover.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,16 @@ private void UpdateDestination()
3636
}
3737
}
3838

39-
public override void OnNetworkSpawn()
39+
protected override void OnNetworkPostSpawn()
4040
{
41-
base.OnNetworkSpawn();
4241
if (CanCommitToTransform)
4342
{
4443
UpdateDestination();
4544
}
45+
base.OnNetworkPostSpawn();
4646
}
4747

48-
public override void OnUpdate()
48+
private void Update()
4949
{
5050
if (!IsSpawned)
5151
{

testproject/Assets/Tests/Manual/NestedNetworkTransforms/ChildMover.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ public bool IsAuthority()
3232
return CanCommitToTransform;
3333
}
3434

35-
private Vector3 m_LastPredictedPosition;
36-
3735
public void PlayerIsMoving(float movementDirection)
3836
{
3937
if (IsSpawned && CanCommitToTransform)
@@ -53,17 +51,17 @@ private Transform GetRootParentTransform(Transform transform)
5351
return transform;
5452
}
5553

56-
public override void OnNetworkSpawn()
54+
protected override void OnNetworkPostSpawn()
5755
{
58-
if ((OnIsServerAuthoritative() && IsServer) || (!OnIsServerAuthoritative() && IsOwner))
56+
if (CanCommitToTransform)
5957
{
6058
m_RootParentTransform = GetRootParentTransform(transform);
6159
if (RandomizeScale)
6260
{
6361
transform.localScale = transform.localScale * Random.Range(0.5f, 1.5f);
6462
}
6563
}
66-
base.OnNetworkSpawn();
64+
base.OnNetworkPostSpawn();
6765
}
6866
}
6967
}

testproject/Assets/Tests/Manual/Scripts/IntegrationNetworkTransform.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ namespace TestProject.ManualTests
1919
{
2020
public class IntegrationNetworkTransform : NetworkTransform
2121
{
22-
23-
public bool IsServerAuthority = true;
24-
2522
public bool DebugTransform;
2623

2724
public Vector3 LastUpdatedPosition;
@@ -54,11 +51,6 @@ protected override void Awake()
5451
#endif
5552
}
5653

57-
protected override bool OnIsServerAuthoritative()
58-
{
59-
return IsServerAuthority;
60-
}
61-
6254
protected override void OnAuthorityPushTransformState(ref NetworkTransformState networkTransformState)
6355
{
6456
base.OnAuthorityPushTransformState(ref networkTransformState);

testproject/Assets/Tests/Runtime/NetworkTransform/NestedNetworkTransformTests.cs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,25 @@
22
using System.Text;
33
using NUnit.Framework;
44
using TestProject.ManualTests;
5+
using Unity.Netcode.Components;
56
using Unity.Netcode.TestHelpers.Runtime;
67
using UnityEngine;
78
using UnityEngine.SceneManagement;
89

910
namespace TestProject.RuntimeTests
1011
{
11-
[TestFixture(Interpolation.Interpolation, Precision.Full, AuthoritativeModel.Server)]
12-
[TestFixture(Interpolation.Interpolation, Precision.Full, AuthoritativeModel.Owner)]
13-
[TestFixture(Interpolation.Interpolation, Precision.Half, AuthoritativeModel.Server)]
14-
[TestFixture(Interpolation.Interpolation, Precision.Half, AuthoritativeModel.Owner)]
15-
[TestFixture(Interpolation.Interpolation, Precision.Compressed, AuthoritativeModel.Server)]
16-
[TestFixture(Interpolation.Interpolation, Precision.Compressed, AuthoritativeModel.Owner)]
17-
[TestFixture(Interpolation.NoInterpolation, Precision.Full, AuthoritativeModel.Server)]
18-
[TestFixture(Interpolation.NoInterpolation, Precision.Full, AuthoritativeModel.Owner)]
19-
[TestFixture(Interpolation.NoInterpolation, Precision.Half, AuthoritativeModel.Server)]
20-
[TestFixture(Interpolation.NoInterpolation, Precision.Half, AuthoritativeModel.Owner)]
21-
[TestFixture(Interpolation.NoInterpolation, Precision.Compressed, AuthoritativeModel.Server)]
22-
[TestFixture(Interpolation.NoInterpolation, Precision.Compressed, AuthoritativeModel.Owner)]
12+
[TestFixture(Interpolation.Interpolation, Precision.Full, NetworkTransform.AuthorityModes.Server)]
13+
[TestFixture(Interpolation.Interpolation, Precision.Full, NetworkTransform.AuthorityModes.Owner)]
14+
[TestFixture(Interpolation.Interpolation, Precision.Half, NetworkTransform.AuthorityModes.Server)]
15+
[TestFixture(Interpolation.Interpolation, Precision.Half, NetworkTransform.AuthorityModes.Owner)]
16+
[TestFixture(Interpolation.Interpolation, Precision.Compressed, NetworkTransform.AuthorityModes.Server)]
17+
[TestFixture(Interpolation.Interpolation, Precision.Compressed, NetworkTransform.AuthorityModes.Owner)]
18+
[TestFixture(Interpolation.NoInterpolation, Precision.Full, NetworkTransform.AuthorityModes.Server)]
19+
[TestFixture(Interpolation.NoInterpolation, Precision.Full, NetworkTransform.AuthorityModes.Owner)]
20+
[TestFixture(Interpolation.NoInterpolation, Precision.Half, NetworkTransform.AuthorityModes.Server)]
21+
[TestFixture(Interpolation.NoInterpolation, Precision.Half, NetworkTransform.AuthorityModes.Owner)]
22+
[TestFixture(Interpolation.NoInterpolation, Precision.Compressed, NetworkTransform.AuthorityModes.Server)]
23+
[TestFixture(Interpolation.NoInterpolation, Precision.Compressed, NetworkTransform.AuthorityModes.Owner)]
2324
public class NestedNetworkTransformTests : IntegrationTestWithApproximation
2425
{
2526
private const string k_TestScene = "NestedNetworkTransformTestScene";
@@ -39,7 +40,7 @@ public class NestedNetworkTransformTests : IntegrationTestWithApproximation
3940
private Object m_PlayerPrefabResource;
4041
private Interpolation m_Interpolation;
4142
private Precision m_Precision;
42-
private AuthoritativeModel m_Authority;
43+
private NetworkTransform.AuthorityModes m_Authority;
4344

4445
public enum Interpolation
4546
{
@@ -61,7 +62,7 @@ public enum AuthoritativeModel
6162
}
6263

6364

64-
public NestedNetworkTransformTests(Interpolation interpolation, Precision precision, AuthoritativeModel authoritativeModel)
65+
public NestedNetworkTransformTests(Interpolation interpolation, Precision precision, NetworkTransform.AuthorityModes authoritativeModel)
6566
{
6667
m_Interpolation = interpolation;
6768
m_Precision = precision;
@@ -134,7 +135,7 @@ private void ConfigureNetworkTransform(IntegrationNetworkTransform networkTransf
134135
networkTransform.UseQuaternionSynchronization = true;
135136
networkTransform.UseHalfFloatPrecision = m_Precision == Precision.Half || m_Precision == Precision.Compressed;
136137
networkTransform.UseQuaternionCompression = m_Precision == Precision.Compressed;
137-
networkTransform.IsServerAuthority = m_Authority == AuthoritativeModel.Server;
138+
networkTransform.AuthorityMode = m_Authority;
138139
}
139140

140141

@@ -189,7 +190,7 @@ private bool ValidateNetworkTransforms()
189190
m_ValidationErrors.Clear();
190191
foreach (var connectedClient in m_ServerNetworkManager.ConnectedClientsIds)
191192
{
192-
var authorityId = m_Authority == AuthoritativeModel.Server ? m_ServerNetworkManager.LocalClientId : connectedClient;
193+
var authorityId = m_Authority == NetworkTransform.AuthorityModes.Server ? m_ServerNetworkManager.LocalClientId : connectedClient;
193194
var playerToValidate = m_PlayerNetworkObjects[authorityId][connectedClient];
194195
var playerNetworkTransforms = playerToValidate.GetComponentsInChildren<IntegrationNetworkTransform>();
195196
foreach (var playerRelative in m_PlayerNetworkObjects)

0 commit comments

Comments
 (0)