@@ -49,6 +49,7 @@ public class ClientSendInfo
4949 /// The min degrees to rotate before a send it sent
5050 /// </summary>
5151 public float MinDegrees = 1.5f ;
52+ public bool ExtrapolatePosition = true ;
5253 private float lerpT ;
5354 private Vector3 lerpStartPos ;
5455 private Quaternion lerpStartRot ;
@@ -60,6 +61,7 @@ public class ClientSendInfo
6061 private Quaternion lastSentRot ;
6162
6263 public bool EnableRange ;
64+ public bool EnableNonProvokedResendChecks ;
6365 public AnimationCurve DistanceSendrate = AnimationCurve . Constant ( 0 , 500 , 20 ) ;
6466 private readonly Dictionary < uint , ClientSendInfo > clientSendInfo = new Dictionary < uint , ClientSendInfo > ( ) ;
6567
@@ -79,6 +81,8 @@ private void OnValidate()
7981 MinDegrees = 0 ;
8082 if ( MinMeters < 0 )
8183 MinMeters = 0 ;
84+ if ( EnableNonProvokedResendChecks && ! EnableRange )
85+ EnableNonProvokedResendChecks = false ;
8286 }
8387
8488 private float GetTimeForLerp ( Vector3 pos1 , Vector3 pos2 )
@@ -151,20 +155,27 @@ private void Update()
151155 lerpT = 1f ;
152156 }
153157
154- if ( isServer || ! EnableRange )
158+ if ( isServer || ! EnableRange || ! AssumeSyncedSends )
155159 lerpT += Time . unscaledDeltaTime / FixedSendsPerSecond ;
156160 else
157161 {
158162 Vector3 myPos = NetworkingManager . singleton . ConnectedClients [ NetworkingManager . singleton . LocalClientId ] . PlayerObject . transform . position ;
159163 lerpT += Time . unscaledDeltaTime / GetTimeForLerp ( transform . position , myPos ) ;
160164 }
161-
162- transform . position = Vector3 . Lerp ( lerpStartPos , lerpEndPos , lerpT ) ;
163- transform . rotation = Quaternion . Slerp ( lerpStartRot , lerpEndRot , lerpT ) ;
165+
166+ if ( ExtrapolatePosition )
167+ transform . position = Vector3 . LerpUnclamped ( lerpStartPos , lerpEndPos , lerpT ) ;
168+ else
169+ transform . position = Vector3 . Lerp ( lerpStartPos , lerpEndPos , lerpT ) ;
170+
171+ if ( ExtrapolatePosition )
172+ transform . rotation = Quaternion . SlerpUnclamped ( lerpStartRot , lerpEndRot , lerpT ) ;
173+ else
174+ transform . rotation = Quaternion . Slerp ( lerpStartRot , lerpEndRot , lerpT ) ;
164175 }
165176 }
166177
167- if ( isServer ) CheckForMissedSends ( ) ;
178+ if ( isServer && EnableRange && EnableNonProvokedResendChecks ) CheckForMissedSends ( ) ;
168179 }
169180
170181 private void OnRecieveTransformFromServer ( uint clientId , BitReader reader )
@@ -289,6 +300,16 @@ private void CheckForMissedSends()
289300 {
290301 for ( int i = 0 ; i < NetworkingManager . singleton . ConnectedClientsList . Count ; i ++ )
291302 {
303+ if ( ! clientSendInfo . ContainsKey ( NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId ) )
304+ {
305+ clientSendInfo . Add ( NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId , new ClientSendInfo ( )
306+ {
307+ clientId = NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId ,
308+ lastMissedPosition = null ,
309+ lastMissedRotation = null ,
310+ lastSent = 0
311+ } ) ;
312+ }
292313 ClientSendInfo info = clientSendInfo [ NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId ] ;
293314 Vector3 receiverPosition = NetworkingManager . singleton . ConnectedClientsList [ i ] . PlayerObject . transform . position ;
294315 Vector3 senderPosition = NetworkingManager . singleton . ConnectedClients [ OwnerClientId ] . PlayerObject . transform . position ;
0 commit comments