diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 2d6b6f153a..0132d24e16 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -9,7 +9,7 @@ namespace Unity.Netcode.Prototyping [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] public class NetworkTransform : NetworkBehaviour { - internal class NetworkState : INetworkSerializable + internal struct NetworkState : INetworkSerializable { internal const int InLocalSpaceBit = 0; internal const int PositionXBit = 1; @@ -161,13 +161,8 @@ public void NetworkSerialize(NetworkSerializer serializer) // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - internal bool UpdateNetworkState(NetworkState networkState) + internal bool UpdateNetworkState(ref NetworkState networkState) { - if (networkState == null) - { - return false; - } - var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; @@ -376,11 +371,6 @@ private void Awake() ReplNetworkState.OnValueChanged += OnNetworkStateChanged; } - public override void OnNetworkSpawn() - { - PrevNetworkState = null; - } - private void OnDestroy() { ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; @@ -395,12 +385,12 @@ private void FixedUpdate() if (IsServer) { - ReplNetworkState.SetDirty(UpdateNetworkState(ReplNetworkState.Value)); + ReplNetworkState.SetDirty(UpdateNetworkState(ref ReplNetworkState.ValueRef)); } // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes - else if (UpdateNetworkState(PrevNetworkState)) + else if (UpdateNetworkState(ref PrevNetworkState)) { ApplyNetworkState(ReplNetworkState.Value); } diff --git a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariable.cs b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariable.cs index b1f303292e..57f082da62 100644 --- a/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariable.cs +++ b/com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariable.cs @@ -66,6 +66,14 @@ public NetworkVariable(T value) [SerializeField] private T m_InternalValue; + /// + /// The temporary accessor to enable struct element access until [MTT-1020] complete + /// + public ref T ValueRef + { + get => ref m_InternalValue; + } + /// /// The value of the NetworkVariable container /// diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs index ecb8db4cda..1cae896568 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs @@ -66,7 +66,7 @@ public void TestSyncAxes( networkTransform.transform.eulerAngles = new Vector3(30, 45, 90); networkTransform.transform.localScale = new Vector3(1.1f, 0.5f, 2.5f); - bool isDirty = networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value); + bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); networkTransform.ReplNetworkState.SetDirty(isDirty); Assert.IsTrue(isDirty); } @@ -75,7 +75,7 @@ public void TestSyncAxes( { networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - bool isDirty = networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value); + bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); Assert.IsFalse(isDirty); } @@ -92,7 +92,7 @@ public void TestSyncAxes( position.x++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncPositionY { @@ -101,7 +101,7 @@ public void TestSyncAxes( position.y++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncPositionZ { @@ -110,7 +110,7 @@ public void TestSyncAxes( position.z++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncRotAngleX @@ -120,7 +120,7 @@ public void TestSyncAxes( rotAngles.x++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncRotAngleY { @@ -129,7 +129,7 @@ public void TestSyncAxes( rotAngles.y++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncRotAngleZ { @@ -138,7 +138,7 @@ public void TestSyncAxes( rotAngles.z++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncScaleX @@ -148,7 +148,7 @@ public void TestSyncAxes( scale.x++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncScaleY { @@ -157,7 +157,7 @@ public void TestSyncAxes( scale.y++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // SyncScaleZ { @@ -166,7 +166,7 @@ public void TestSyncAxes( scale.z++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } } @@ -227,7 +227,7 @@ public void TestThresholds( networkTransform.transform.eulerAngles = new Vector3(30, 45, 90); networkTransform.transform.localScale = new Vector3(1.1f, 0.5f, 2.5f); - bool isDirty = networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value); + bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); networkTransform.ReplNetworkState.SetDirty(isDirty); Assert.IsTrue(isDirty); } @@ -236,7 +236,7 @@ public void TestThresholds( { networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - bool isDirty = networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value); + bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); Assert.IsFalse(isDirty); } @@ -253,42 +253,42 @@ public void TestThresholds( { position.x += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); position.x += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // PositionY { position.y += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); position.y += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // PositionZ { position.z += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); position.z += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } } @@ -301,42 +301,42 @@ public void TestThresholds( { rotAngles.x += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); rotAngles.x += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // RotAngleY { rotAngles.y += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); rotAngles.y += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // RotAngleZ { rotAngles.z += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); rotAngles.z += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } } @@ -349,42 +349,42 @@ public void TestThresholds( { scale.x += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); scale.x += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // ScaleY { scale.y += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); scale.y += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } // ScaleZ { scale.z += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); scale.z += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(networkTransform.ReplNetworkState.Value)); + Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); } } }