@@ -49,6 +49,7 @@ public class ClientSendInfo
49
49
/// The min degrees to rotate before a send it sent
50
50
/// </summary>
51
51
public float MinDegrees = 1.5f ;
52
+ public bool ExtrapolatePosition = true ;
52
53
private float lerpT ;
53
54
private Vector3 lerpStartPos ;
54
55
private Quaternion lerpStartRot ;
@@ -60,6 +61,7 @@ public class ClientSendInfo
60
61
private Quaternion lastSentRot ;
61
62
62
63
public bool EnableRange ;
64
+ public bool EnableNonProvokedResendChecks ;
63
65
public AnimationCurve DistanceSendrate = AnimationCurve . Constant ( 0 , 500 , 20 ) ;
64
66
private readonly Dictionary < uint , ClientSendInfo > clientSendInfo = new Dictionary < uint , ClientSendInfo > ( ) ;
65
67
@@ -79,6 +81,8 @@ private void OnValidate()
79
81
MinDegrees = 0 ;
80
82
if ( MinMeters < 0 )
81
83
MinMeters = 0 ;
84
+ if ( EnableNonProvokedResendChecks && ! EnableRange )
85
+ EnableNonProvokedResendChecks = false ;
82
86
}
83
87
84
88
private float GetTimeForLerp ( Vector3 pos1 , Vector3 pos2 )
@@ -151,20 +155,27 @@ private void Update()
151
155
lerpT = 1f ;
152
156
}
153
157
154
- if ( isServer || ! EnableRange )
158
+ if ( isServer || ! EnableRange || ! AssumeSyncedSends )
155
159
lerpT += Time . unscaledDeltaTime / FixedSendsPerSecond ;
156
160
else
157
161
{
158
162
Vector3 myPos = NetworkingManager . singleton . ConnectedClients [ NetworkingManager . singleton . LocalClientId ] . PlayerObject . transform . position ;
159
163
lerpT += Time . unscaledDeltaTime / GetTimeForLerp ( transform . position , myPos ) ;
160
164
}
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 ) ;
164
175
}
165
176
}
166
177
167
- if ( isServer ) CheckForMissedSends ( ) ;
178
+ if ( isServer && EnableRange && EnableNonProvokedResendChecks ) CheckForMissedSends ( ) ;
168
179
}
169
180
170
181
private void OnRecieveTransformFromServer ( uint clientId , BitReader reader )
@@ -289,6 +300,16 @@ private void CheckForMissedSends()
289
300
{
290
301
for ( int i = 0 ; i < NetworkingManager . singleton . ConnectedClientsList . Count ; i ++ )
291
302
{
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
+ }
292
313
ClientSendInfo info = clientSendInfo [ NetworkingManager . singleton . ConnectedClientsList [ i ] . ClientId ] ;
293
314
Vector3 receiverPosition = NetworkingManager . singleton . ConnectedClientsList [ i ] . PlayerObject . transform . position ;
294
315
Vector3 senderPosition = NetworkingManager . singleton . ConnectedClients [ OwnerClientId ] . PlayerObject . transform . position ;
0 commit comments