Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 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 @@ -22,6 +22,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Fixed

- Fixed AnticipatedNetworkTransform not respecting the InLocalSpace flag (#3995)
- Issue where a NullReferenceException was thrown when a non-authority failed to spawn a NetworkObject. (#4067)
- Issue when FastBufferReader is attempting to read a string and all or a portion of the character count has already been read by user script, it could read a character length that results in a negative byte length which could result in an editor crash. (#4052)
- Issue where NetworkRigidbodyBase was not applying rotation correctly when using Rigidbody2D. (#4012)
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