mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
interp while ahead; slow down while behind
This commit is contained in:
parent
5441ed85d2
commit
c7fe9a939f
@ -214,6 +214,7 @@ protected override void Update()
|
||||
|
||||
Vector3 lastSetPosition = Vector3.zero;
|
||||
Vector3 interpolatedPosition = Vector3.zero;
|
||||
Vector3 lastValidVelocity = Vector3.zero;
|
||||
protected override void ApplySnapshot(NTSnapshot interpolated)
|
||||
{
|
||||
interpolatedPosition = interpolated.position;
|
||||
@ -274,21 +275,44 @@ protected override void ApplySnapshot(NTSnapshot interpolated)
|
||||
|
||||
// would the new position be ahead of us, or behind us?
|
||||
Vector3 velocity = predictedRigidbody.velocity; // this is where we are going
|
||||
|
||||
// we slow down velocity while server state is behind us.
|
||||
// if it slows down to zero then the 'isAhead' check won't work since it compares velocity.
|
||||
// solution: always store the last valid velocity, and use that if needed.
|
||||
if (velocity == Vector3.zero)
|
||||
{
|
||||
velocity = lastValidVelocity;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastValidVelocity = velocity;
|
||||
}
|
||||
|
||||
Vector3 targetDelta = targetPosition - currentPosition; // this is where we would go
|
||||
float dot = Vector3.Dot(velocity, targetDelta);
|
||||
bool ahead = dot > 0;
|
||||
// if (!ahead) return;
|
||||
// visualize 'ahead'
|
||||
bool ahead = dot > 0; // true if the new position is ahead of us
|
||||
// visualize 'ahead' for easier debugging
|
||||
if (debugColors)
|
||||
{
|
||||
rend.material.color = ahead ? blendingAheadColor : blendingBehindColor;
|
||||
}
|
||||
|
||||
// assign position and rotation together. faster than accessing manually.
|
||||
// TODO reuse ApplySnapshot for consistency?
|
||||
//tf.SetPositionAndRotation(newPosition, newRotation);
|
||||
//predictedRigidbody.MovePosition(newPosition); // smooth
|
||||
//predictedRigidbody.MoveRotation(newRotation); // smooth
|
||||
// do the best possible smoothing depending on ahead / behind
|
||||
// if ahead: interpolate towards remote state more and more
|
||||
if (ahead)
|
||||
{
|
||||
// TODO reuse ApplySnapshot for consistency?
|
||||
// tf.SetPositionAndRotation(newPosition, newRotation);
|
||||
predictedRigidbody.MovePosition(newPosition); // smooth
|
||||
predictedRigidbody.MoveRotation(newRotation); // smooth
|
||||
}
|
||||
// if behind: only slow down. never move backwards, as that would
|
||||
// cause a highly noticable jitter effect!
|
||||
else
|
||||
{
|
||||
Vector3 newVelocity = Vector3.MoveTowards(velocity, Vector3.zero, positionStep);
|
||||
predictedRigidbody.velocity = newVelocity;
|
||||
}
|
||||
}
|
||||
// directly apply server snapshots while following
|
||||
else if (state == ForecastState.FOLLOWING)
|
||||
|
@ -189,7 +189,7 @@ MonoBehaviour:
|
||||
showOverlay: 0
|
||||
overlayColor: {r: 0, g: 0, b: 0, a: 0.5}
|
||||
predictedRigidbody: {fileID: -177125271246800426}
|
||||
blendingRttMultiplier: 5
|
||||
blendingRttMultiplier: 2
|
||||
blendingCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
|
@ -326,7 +326,7 @@ MonoBehaviour:
|
||||
showOverlay: 0
|
||||
overlayColor: {r: 0, g: 0, b: 0, a: 0.5}
|
||||
predictedRigidbody: {fileID: 1848203816128897140}
|
||||
blendingRttMultiplier: 5
|
||||
blendingRttMultiplier: 2
|
||||
blendingCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
|
Loading…
Reference in New Issue
Block a user