@@ -57,6 +57,11 @@ internal class ClientSendInfo
57
57
/// Enables extrapolation
58
58
/// </summary>
59
59
public bool ExtrapolatePosition = false ;
60
+ /// <summary>
61
+ /// The maximum amount of expected send rates to extrapolate over when awaiting new packets.
62
+ /// A higher value will result in continued extrapolation after an object has stopped moving
63
+ /// </summary>
64
+ public float MaxSendsToExtrapolate = 5 ;
60
65
61
66
private float lerpT ;
62
67
private Vector3 lerpStartPos ;
@@ -67,6 +72,8 @@ internal class ClientSendInfo
67
72
private float lastSendTime ;
68
73
private Vector3 lastSentPos ;
69
74
private Quaternion lastSentRot ;
75
+
76
+ private float lastRecieveTime ;
70
77
71
78
/// <summary>
72
79
/// Enables range based send rate
@@ -169,20 +176,15 @@ private void Update()
169
176
lerpT = 1f ;
170
177
}
171
178
172
- if ( isServer || ! EnableRange || ! AssumeSyncedSends )
173
- lerpT += Time . unscaledDeltaTime / ( 1f / FixedSendsPerSecond ) ;
174
- else
175
- {
176
- Vector3 myPos = NetworkingManager . singleton . ConnectedClients [ NetworkingManager . singleton . LocalClientId ] . PlayerObject . transform . position ;
177
- lerpT += Time . unscaledDeltaTime / GetTimeForLerp ( transform . position , myPos ) ;
178
- }
179
+ float sendDelay = ( isServer || ! EnableRange || ! AssumeSyncedSends ) ? ( 1f / FixedSendsPerSecond ) : GetTimeForLerp ( transform . position , NetworkingManager . singleton . ConnectedClients [ NetworkingManager . singleton . LocalClientId ] . PlayerObject . transform . position ) ;
180
+ lerpT += Time . time / sendDelay ;
179
181
180
- if ( ExtrapolatePosition )
182
+ if ( ExtrapolatePosition && Time . time - lastRecieveTime < sendDelay * MaxSendsToExtrapolate )
181
183
transform . position = Vector3 . LerpUnclamped ( lerpStartPos , lerpEndPos , lerpT ) ;
182
184
else
183
185
transform . position = Vector3 . Lerp ( lerpStartPos , lerpEndPos , lerpT ) ;
184
186
185
- if ( ExtrapolatePosition )
187
+ if ( ExtrapolatePosition && Time . time - lastRecieveTime < sendDelay * MaxSendsToExtrapolate )
186
188
transform . rotation = Quaternion . SlerpUnclamped ( lerpStartRot , lerpEndRot , lerpT ) ;
187
189
else
188
190
transform . rotation = Quaternion . Slerp ( lerpStartRot , lerpEndRot , lerpT ) ;
@@ -209,6 +211,7 @@ private void ApplyTransform(uint clientId, Stream stream)
209
211
210
212
if ( InterpolatePosition )
211
213
{
214
+ lastRecieveTime = Time . time ;
212
215
lerpStartPos = transform . position ;
213
216
lerpStartRot = transform . rotation ;
214
217
lerpEndPos = new Vector3 ( xPos , yPos , zPos ) ;
@@ -245,20 +248,6 @@ private void SubmitTransform(uint clientId, Stream stream)
245
248
return ;
246
249
}
247
250
248
- if ( InterpolateServer )
249
- {
250
- lerpStartPos = transform . position ;
251
- lerpStartRot = transform . rotation ;
252
- lerpEndPos = new Vector3 ( xPos , yPos , zPos ) ;
253
- lerpEndRot = Quaternion . Euler ( xRot , yRot , zRot ) ;
254
- lerpT = 0 ;
255
- }
256
- else
257
- {
258
- transform . position = new Vector3 ( xPos , yPos , zPos ) ;
259
- transform . rotation = Quaternion . Euler ( new Vector3 ( xRot , yRot , zRot ) ) ;
260
- }
261
-
262
251
using ( PooledBitStream writeStream = PooledBitStream . Get ( ) )
263
252
{
264
253
using ( PooledBitWriter writer = PooledBitWriter . Get ( writeStream ) )
0 commit comments