Skip to content

Commit 7f4210f

Browse files
committed
NetworkTransform bugfixes & extrapolation
1 parent ac0dd90 commit 7f4210f

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

MLAPI/MonoBehaviours/Prototyping/NetworkedTransform.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)