Skip to content

Commit ab93f0b

Browse files
authored
fix: Fixed transform range interpolation (#399)
* refactor: Fixed indents * fix: Fixed range interpolation
1 parent 7dce94a commit ab93f0b

1 file changed

Lines changed: 68 additions & 40 deletions

File tree

com.unity.multiplayer.mlapi/Runtime/Prototyping/NetworkedTransform.cs

Lines changed: 68 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public class NetworkedTransform : NetworkedBehaviour
1717
{
1818
internal class ClientSendInfo
1919
{
20-
public ulong clientId;
2120
public float lastSent;
2221
public Vector3? lastMissedPosition;
2322
public Quaternion? lastMissedRotation;
@@ -154,13 +153,17 @@ private void Awake()
154153

155154
private void Update()
156155
{
157-
if (IsOwner) {
158-
if (NetworkingManager.Singleton.NetworkTime - lastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees)) {
156+
if (IsOwner)
157+
{
158+
if (NetworkingManager.Singleton.NetworkTime - lastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
159+
{
159160
lastSendTime = NetworkingManager.Singleton.NetworkTime;
160161
lastSentPos = transform.position;
161162
lastSentRot = transform.rotation;
162-
using (PooledBitStream stream = PooledBitStream.Get()) {
163-
using (PooledBitWriter writer = PooledBitWriter.Get(stream)) {
163+
using (PooledBitStream stream = PooledBitStream.Get())
164+
{
165+
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
166+
{
164167
writer.WriteSinglePacked(transform.position.x);
165168
writer.WriteSinglePacked(transform.position.y);
166169
writer.WriteSinglePacked(transform.position.z);
@@ -180,8 +183,10 @@ private void Update()
180183
}
181184
else {
182185
//If we are server and interpolation is turned on for server OR we are not server and interpolation is turned on
183-
if ((IsServer && InterpolateServer && InterpolatePosition) || (!IsServer && InterpolatePosition)) {
184-
if (Vector3.Distance(transform.position, lerpEndPos) > SnapDistance) {
186+
if ((IsServer && InterpolateServer && InterpolatePosition) || (!IsServer && InterpolatePosition))
187+
{
188+
if (Vector3.Distance(transform.position, lerpEndPos) > SnapDistance)
189+
{
185190
//Snap, set T to 1 (100% of the lerp)
186191
lerpT = 1f;
187192
}
@@ -210,8 +215,9 @@ private void ApplyTransform(ulong clientId, Stream stream)
210215
{
211216
if (!enabled)
212217
return;
213-
using (PooledBitReader reader = PooledBitReader.Get(stream)) {
214218

219+
using (PooledBitReader reader = PooledBitReader.Get(stream))
220+
{
215221
float xPos = reader.ReadSinglePacked();
216222
float yPos = reader.ReadSinglePacked();
217223
float zPos = reader.ReadSinglePacked();
@@ -229,15 +235,17 @@ private void ApplyTransformInternal(Vector3 position, Quaternion rotation)
229235
if (!enabled)
230236
return;
231237

232-
if (InterpolatePosition && (!IsServer || InterpolateServer)) {
238+
if (InterpolatePosition && (!IsServer || InterpolateServer))
239+
{
233240
lastReceiveTime = Time.unscaledTime;
234241
lerpStartPos = transform.position;
235242
lerpStartRot = transform.rotation;
236243
lerpEndPos = position;
237244
lerpEndRot = rotation;
238245
lerpT = 0;
239246
}
240-
else {
247+
else
248+
{
241249
transform.position = position;
242250
transform.rotation = rotation;
243251
}
@@ -248,7 +256,9 @@ private void SubmitTransform(ulong clientId, Stream stream)
248256
{
249257
if (!enabled)
250258
return;
251-
using (PooledBitReader reader = PooledBitReader.Get(stream)) {
259+
260+
using (PooledBitReader reader = PooledBitReader.Get(stream))
261+
{
252262
float xPos = reader.ReadSinglePacked();
253263
float yPos = reader.ReadSinglePacked();
254264
float zPos = reader.ReadSinglePacked();
@@ -257,19 +267,23 @@ private void SubmitTransform(ulong clientId, Stream stream)
257267
float yRot = reader.ReadSinglePacked();
258268
float zRot = reader.ReadSinglePacked();
259269

260-
if (IsMoveValidDelegate != null && !IsMoveValidDelegate(clientId, lerpEndPos, new Vector3(xPos, yPos, zPos))) {
270+
if (IsMoveValidDelegate != null && !IsMoveValidDelegate(clientId, lerpEndPos, new Vector3(xPos, yPos, zPos)))
271+
{
261272
//Invalid move!
262273
//TODO: Add rubber band (just a message telling them to go back)
263274
return;
264275
}
265276

266-
if (!IsClient) {
277+
if (!IsClient)
278+
{
267279
// Dedicated server
268280
ApplyTransformInternal(new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
269281
}
270282

271-
using (PooledBitStream writeStream = PooledBitStream.Get()) {
272-
using (PooledBitWriter writer = PooledBitWriter.Get(writeStream)) {
283+
using (PooledBitStream writeStream = PooledBitStream.Get())
284+
{
285+
using (PooledBitWriter writer = PooledBitWriter.Get(writeStream))
286+
{
273287
writer.WriteSinglePacked(xPos);
274288
writer.WriteSinglePacked(yPos);
275289
writer.WriteSinglePacked(zPos);
@@ -278,11 +292,14 @@ private void SubmitTransform(ulong clientId, Stream stream)
278292
writer.WriteSinglePacked(yRot);
279293
writer.WriteSinglePacked(zRot);
280294

281-
if (EnableRange) {
282-
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++) {
283-
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId)) {
284-
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo() {
285-
clientId = NetworkingManager.Singleton.ConnectedClientsList[i].ClientId,
295+
if (EnableRange)
296+
{
297+
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
298+
{
299+
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId))
300+
{
301+
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo()
302+
{
286303
lastMissedPosition = null,
287304
lastMissedRotation = null,
288305
lastSent = 0
@@ -293,20 +310,23 @@ private void SubmitTransform(ulong clientId, Stream stream)
293310
Vector3? receiverPosition = NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position);
294311
Vector3? senderPosition = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position);
295312

296-
if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) {
313+
if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value))
314+
{
297315
info.lastSent = NetworkingManager.Singleton.NetworkTime;
298316
info.lastMissedPosition = null;
299317
info.lastMissedRotation = null;
300318

301319
InvokeClientRpcOnClientPerformance(applyTransformDelegate, NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, writeStream, string.IsNullOrEmpty(Channel) ? "MLAPI_DEFAULT_MESSAGE" : Channel);
302320
}
303-
else {
321+
else
322+
{
304323
info.lastMissedPosition = new Vector3(xPos, yPos, zPos);
305324
info.lastMissedRotation = Quaternion.Euler(xRot, yRot, zRot);
306325
}
307326
}
308327
}
309-
else {
328+
else
329+
{
310330
InvokeClientRpcOnEveryoneExceptPerformance(applyTransformDelegate, OwnerClientId, writeStream, string.IsNullOrEmpty(Channel) ? "MLAPI_DEFAULT_MESSAGE" : Channel);
311331
}
312332

@@ -317,10 +337,12 @@ private void SubmitTransform(ulong clientId, Stream stream)
317337

318338
private void CheckForMissedSends()
319339
{
320-
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++) {
321-
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId)) {
322-
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo() {
323-
clientId = NetworkingManager.Singleton.ConnectedClientsList[i].ClientId,
340+
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
341+
{
342+
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId))
343+
{
344+
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo()
345+
{
324346
lastMissedPosition = null,
325347
lastMissedRotation = null,
326348
lastSent = 0
@@ -330,28 +352,33 @@ private void CheckForMissedSends()
330352
Vector3? receiverPosition = NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position);
331353
Vector3? senderPosition = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position);
332354

333-
if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) {
355+
if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value))
356+
{
334357
Vector3? pos = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position);
335358
Vector3? rot = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.rotation.eulerAngles);
336359

337-
if (pos != null && rot != null) {
360+
if (info.lastMissedPosition != null && info.lastMissedRotation != null)
361+
{
338362
info.lastSent = NetworkingManager.Singleton.NetworkTime;
339-
info.lastMissedPosition = null;
340-
info.lastMissedRotation = null;
341363

342-
using (PooledBitStream stream = PooledBitStream.Get()) {
343-
using (PooledBitWriter writer = PooledBitWriter.Get(stream)) {
344-
writer.WriteSinglePacked(pos.Value.x);
345-
writer.WriteSinglePacked(pos.Value.y);
346-
writer.WriteSinglePacked(pos.Value.z);
364+
using (PooledBitStream stream = PooledBitStream.Get())
365+
{
366+
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
367+
{
368+
writer.WriteSinglePacked(info.lastMissedPosition.Value.x);
369+
writer.WriteSinglePacked(info.lastMissedPosition.Value.y);
370+
writer.WriteSinglePacked(info.lastMissedPosition.Value.z);
347371

348-
writer.WriteSinglePacked(rot.Value.x);
349-
writer.WriteSinglePacked(rot.Value.y);
350-
writer.WriteSinglePacked(rot.Value.z);
372+
writer.WriteSinglePacked(info.lastMissedRotation.Value.x);
373+
writer.WriteSinglePacked(info.lastMissedRotation.Value.y);
374+
writer.WriteSinglePacked(info.lastMissedRotation.Value.z);
351375

352376
InvokeClientRpcOnClientPerformance(applyTransformDelegate, NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, stream, string.IsNullOrEmpty(Channel) ? "MLAPI_DEFAULT_MESSAGE" : Channel);
353377
}
354378
}
379+
380+
info.lastMissedPosition = null;
381+
info.lastMissedRotation = null;
355382
}
356383
}
357384
}
@@ -364,7 +391,8 @@ private void CheckForMissedSends()
364391
/// <param name="rotation">The rotation to teleport to</param>
365392
public void Teleport(Vector3 position, Quaternion rotation)
366393
{
367-
if (InterpolateServer && IsServer || IsClient) {
394+
if (InterpolateServer && IsServer || IsClient)
395+
{
368396
lerpStartPos = position;
369397
lerpStartRot = rotation;
370398
lerpEndPos = position;

0 commit comments

Comments
 (0)