Skip to content
Open
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
1 change: 1 addition & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Fixed

- Fixed AnticipatedNetworkTransform not respecting the InLocalSpace flag (#3995)

### Security

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,18 @@ public void AnticipateMove(Vector3 newPosition)
{
return;
}
transform.position = newPosition;

if (InLocalSpace)
{
transform.localPosition = newPosition;
}
else
{
transform.position = newPosition;
}

m_AnticipatedTransform.Position = newPosition;

if (CanCommitToTransform)
{
m_AuthoritativeTransform.Position = newPosition;
Expand All @@ -187,7 +197,15 @@ public void AnticipateRotate(Quaternion newRotation)
{
return;
}
transform.rotation = newRotation;

if (InLocalSpace)
{
transform.localRotation = newRotation;
}
else
{
transform.rotation = newRotation;
}
m_AnticipatedTransform.Rotation = newRotation;
if (CanCommitToTransform)
{
Expand Down Expand Up @@ -240,7 +258,14 @@ public void AnticipateState(TransformState newState)
return;
}
var transform_ = transform;
transform_.SetPositionAndRotation(newState.Position, newState.Rotation);
if (InLocalSpace)
{
transform_.SetLocalPositionAndRotation(newState.Position, newState.Rotation);
}
else
{
transform_.SetPositionAndRotation(newState.Position, newState.Rotation);
}
transform_.localScale = newState.Scale;
m_AnticipatedTransform = newState;
if (CanCommitToTransform)
Expand Down Expand Up @@ -277,7 +302,17 @@ private void ProcessSmoothing()
m_PreviousAnticipatedTransform = m_AnticipatedTransform;
if (!CanCommitToTransform)
{
transform_.SetPositionAndRotation(m_AnticipatedTransform.Position, m_AnticipatedTransform.Rotation);
if (InLocalSpace)
{
transform_.SetLocalPositionAndRotation(m_AnticipatedTransform.Position,
m_AnticipatedTransform.Rotation);
}
else
{
transform_.SetPositionAndRotation(m_AnticipatedTransform.Position,
m_AnticipatedTransform.Rotation);
}

transform_.localScale = m_AnticipatedTransform.Scale;
}
}
Expand Down Expand Up @@ -320,12 +355,25 @@ public void SetupForRender()
if (Transform.CanCommitToTransform)
{
var transform_ = Transform.transform;
Transform.m_AuthoritativeTransform = new TransformState
if (Transform.InLocalSpace)
{
Position = transform_.position,
Rotation = transform_.rotation,
Scale = transform_.localScale
};
Transform.m_AuthoritativeTransform = new TransformState
{
Position = transform_.localPosition,
Rotation = transform_.localRotation,
Scale = transform_.localScale
};
}
else
{
Transform.m_AuthoritativeTransform = new TransformState
{
Position = transform_.position,
Rotation = transform_.rotation,
Scale = transform_.localScale
};
}

if (Transform.m_CurrentSmoothTime >= Transform.m_SmoothDuration)
{
// If we've had a call to Smooth() we'll continue interpolating.
Expand All @@ -334,7 +382,17 @@ public void SetupForRender()
Transform.m_AnticipatedTransform = Transform.m_AuthoritativeTransform;
}

transform_.SetPositionAndRotation(Transform.m_AnticipatedTransform.Position, Transform.m_AnticipatedTransform.Rotation);
if (Transform.InLocalSpace)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think it's worth having a function for SetPositionAndRotation that does this logic internally. We're using it a lot in this file, having a function will mean any future developers in this file won't have to remember about InLocalSpace.

{
transform_.SetLocalPositionAndRotation(Transform.m_AnticipatedTransform.Position,
Transform.m_AnticipatedTransform.Rotation);
}
else
{
transform_.SetPositionAndRotation(Transform.m_AnticipatedTransform.Position,
Transform.m_AnticipatedTransform.Rotation);
}

transform_.localScale = Transform.m_AnticipatedTransform.Scale;
}
}
Expand All @@ -344,7 +402,17 @@ public void SetupForUpdate()
if (Transform.CanCommitToTransform)
{
var transform_ = Transform.transform;
transform_.SetPositionAndRotation(Transform.m_AuthoritativeTransform.Position, Transform.m_AuthoritativeTransform.Rotation);
if (Transform.InLocalSpace)
{
transform_.SetLocalPositionAndRotation(Transform.m_AuthoritativeTransform.Position,
Transform.m_AuthoritativeTransform.Rotation);
}
else
{
transform_.SetPositionAndRotation(Transform.m_AuthoritativeTransform.Position,
Transform.m_AuthoritativeTransform.Rotation);
}

transform_.localScale = Transform.m_AuthoritativeTransform.Scale;
}
}
Expand All @@ -367,12 +435,25 @@ public void ResetAnticipation()
private void ResetAnticipatedState()
{
var transform_ = transform;
m_AuthoritativeTransform = new TransformState
if (InLocalSpace)
{
m_AuthoritativeTransform = new TransformState
{
Position = transform_.localPosition,
Rotation = transform_.localRotation,
Scale = transform_.localScale
};
}
else
{
Position = transform_.position,
Rotation = transform_.rotation,
Scale = transform_.localScale
};
m_AuthoritativeTransform = new TransformState
{
Position = transform_.position,
Rotation = transform_.rotation,
Scale = transform_.localScale
};
}

m_AnticipatedTransform = m_AuthoritativeTransform;
m_PreviousAnticipatedTransform = m_AnticipatedTransform;

Expand Down Expand Up @@ -439,7 +520,7 @@ public override void OnNetworkSpawn()
return;
}
m_OutstandingAuthorityChange = true;
ApplyAuthoritativeState();
//ApplyAuthoritativeState();
ResetAnticipatedState();

m_AnticipatedObject = new AnticipatedObject { Transform = this };
Expand Down Expand Up @@ -491,7 +572,15 @@ public void Smooth(TransformState from, TransformState to, float durationSeconds
{
m_AnticipatedTransform = to;
m_PreviousAnticipatedTransform = m_AnticipatedTransform;
transform_.SetPositionAndRotation(to.Position, to.Rotation);
if (InLocalSpace)
{
transform_.SetLocalPositionAndRotation(to.Position, to.Rotation);
}
else
{
transform_.SetPositionAndRotation(to.Position, to.Rotation);
}

transform_.localScale = to.Scale;
m_SmoothDuration = 0;
m_CurrentSmoothTime = 0;
Expand All @@ -502,7 +591,15 @@ public void Smooth(TransformState from, TransformState to, float durationSeconds

if (!CanCommitToTransform)
{
transform_.SetPositionAndRotation(from.Position, from.Rotation);
if (InLocalSpace)
{
transform_.SetLocalPositionAndRotation(from.Position, from.Rotation);
}
else
{
transform_.SetPositionAndRotation(from.Position, from.Rotation);
}

transform_.localScale = from.Scale;
}

Expand Down Expand Up @@ -543,22 +640,48 @@ protected override void OnTransformUpdated()
var previousAnticipatedTransform = m_AnticipatedTransform;

// Update authority state to catch any possible interpolation data
m_AuthoritativeTransform.Position = transform_.position;
m_AuthoritativeTransform.Rotation = transform_.rotation;
m_AuthoritativeTransform.Scale = transform_.localScale;
if (InLocalSpace)
{
m_AuthoritativeTransform.Position = transform_.localPosition;
m_AuthoritativeTransform.Rotation = transform_.localRotation;
m_AuthoritativeTransform.Scale = transform_.localScale;
}
else
{
m_AuthoritativeTransform.Position = transform_.position;
m_AuthoritativeTransform.Rotation = transform_.rotation;
m_AuthoritativeTransform.Scale = transform_.localScale;
}

if (!m_OutstandingAuthorityChange)
{
// Keep the anticipated value unchanged, we have no updates from the server at all.
transform_.SetPositionAndRotation(previousAnticipatedTransform.Position, previousAnticipatedTransform.Rotation);
if (InLocalSpace)
{
transform_.SetLocalPositionAndRotation(previousAnticipatedTransform.Position, previousAnticipatedTransform.Rotation);
}
else
{
transform_.SetPositionAndRotation(previousAnticipatedTransform.Position, previousAnticipatedTransform.Rotation);
}
transform_.localScale = previousAnticipatedTransform.Scale;
return;
}

if (StaleDataHandling == StaleDataHandling.Ignore && m_LastAnticipaionCounter > m_LastAuthorityUpdateCounter)
{
// Keep the anticipated value unchanged because it is more recent than the authoritative one.
transform_.SetPositionAndRotation(previousAnticipatedTransform.Position, previousAnticipatedTransform.Rotation);
if (InLocalSpace)
{
transform_.SetLocalPositionAndRotation(previousAnticipatedTransform.Position,
previousAnticipatedTransform.Rotation);
}
else
{
transform_.SetPositionAndRotation(previousAnticipatedTransform.Position,
previousAnticipatedTransform.Rotation);
}

transform_.localScale = previousAnticipatedTransform.Scale;
return;
}
Expand Down
Loading