Skip to content

refactor!: introduce NetVar.ValueRef & convert NetTrans.NetState to struct #1061

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 4 additions & 14 deletions com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Unity.Netcode.Prototyping
[AddComponentMenu("Netcode/" + nameof(NetworkTransform))]
public class NetworkTransform : NetworkBehaviour
{
internal class NetworkState : INetworkSerializable
internal struct NetworkState : INetworkSerializable
Copy link
Contributor Author

@0xFA11 0xFA11 Aug 17, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted to see what it'd mean to convert from class to struct (turns out, it's not too bad :P)

{
internal const int InLocalSpaceBit = 0;
internal const int PositionXBit = 1;
Expand Down Expand Up @@ -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<NetworkState>`'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;
Expand Down Expand Up @@ -376,11 +371,6 @@ private void Awake()
ReplNetworkState.OnValueChanged += OnNetworkStateChanged;
}

public override void OnNetworkSpawn()
{
PrevNetworkState = null;
}

private void OnDestroy()
{
ReplNetworkState.OnValueChanged -= OnNetworkStateChanged;
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,14 @@ public NetworkVariable(T value)
[SerializeField]
private T m_InternalValue;

/// <summary>
/// The temporary accessor to enable struct element access until [MTT-1020] complete
/// </summary>
public ref T ValueRef
{
get => ref m_InternalValue;
}
Comment on lines +69 to +75
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this part is introduced by PR #1051 originally, it's here too.
I'm not sure about the ultimate API, @mattwalsh-unity might chime in here as he wants to drive this change/shift around the codebase.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is commented temporary, granted, but I'm not familiar with the linked issue. Can you elaborate on why marking the netvar dirty is not needed here ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely sure what is the new design direction but I can tell you why NetworkTransform's State still works: we manually mark NetVar to be dirty later in code. So, we don't rely on a get/set prop marking NetVar dirty, we mark the NetVar dirty somewhere else.


/// <summary>
/// The value of the NetworkVariable container
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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);
}

Expand All @@ -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
{
Expand All @@ -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
{
Expand All @@ -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
Expand All @@ -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
{
Expand All @@ -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
{
Expand All @@ -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
Expand All @@ -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
{
Expand All @@ -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
{
Expand All @@ -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));
}
}

Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
}

Expand All @@ -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));
}
}

Expand All @@ -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));
}
}

Expand All @@ -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));
}
}
}
Expand Down