@@ -57,6 +57,11 @@ internal class ClientSendInfo
5757 /// Enables extrapolation
5858 /// </summary>
5959 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 ;
6065
6166 private float lerpT ;
6267 private Vector3 lerpStartPos ;
@@ -67,6 +72,8 @@ internal class ClientSendInfo
6772 private float lastSendTime ;
6873 private Vector3 lastSentPos ;
6974 private Quaternion lastSentRot ;
75+
76+ private float lastRecieveTime ;
7077
7178 /// <summary>
7279 /// Enables range based send rate
@@ -169,20 +176,15 @@ private void Update()
169176 lerpT = 1f ;
170177 }
171178
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 ;
179181
180- if ( ExtrapolatePosition )
182+ if ( ExtrapolatePosition && Time . time - lastRecieveTime < sendDelay * MaxSendsToExtrapolate )
181183 transform . position = Vector3 . LerpUnclamped ( lerpStartPos , lerpEndPos , lerpT ) ;
182184 else
183185 transform . position = Vector3 . Lerp ( lerpStartPos , lerpEndPos , lerpT ) ;
184186
185- if ( ExtrapolatePosition )
187+ if ( ExtrapolatePosition && Time . time - lastRecieveTime < sendDelay * MaxSendsToExtrapolate )
186188 transform . rotation = Quaternion . SlerpUnclamped ( lerpStartRot , lerpEndRot , lerpT ) ;
187189 else
188190 transform . rotation = Quaternion . Slerp ( lerpStartRot , lerpEndRot , lerpT ) ;
@@ -209,6 +211,7 @@ private void ApplyTransform(uint clientId, Stream stream)
209211
210212 if ( InterpolatePosition )
211213 {
214+ lastRecieveTime = Time . time ;
212215 lerpStartPos = transform . position ;
213216 lerpStartRot = transform . rotation ;
214217 lerpEndPos = new Vector3 ( xPos , yPos , zPos ) ;
@@ -245,20 +248,6 @@ private void SubmitTransform(uint clientId, Stream stream)
245248 return ;
246249 }
247250
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-
262251 using ( PooledBitStream writeStream = PooledBitStream . Get ( ) )
263252 {
264253 using ( PooledBitWriter writer = PooledBitWriter . Get ( writeStream ) )
0 commit comments