Draft - Update, Late, Fixed.

Needs renaming, and better comments/tooltip.
This commit is contained in:
JesusLuvsYooh 2024-07-06 19:33:29 +01:00
parent 2d2e270868
commit 167d49e365
3 changed files with 46 additions and 10 deletions

View File

@ -23,6 +23,7 @@
namespace Mirror namespace Mirror
{ {
public enum CoordinateSpace { Local, World } public enum CoordinateSpace { Local, World }
public enum UpdateMethod { Update, LateUpdate, FixedUpdate }
public abstract class NetworkTransformBase : NetworkBehaviour public abstract class NetworkTransformBase : NetworkBehaviour
{ {
@ -92,6 +93,11 @@ public abstract class NetworkTransformBase : NetworkBehaviour
protected double timeStampAdjustment => NetworkServer.sendInterval * (sendIntervalMultiplier - 1); protected double timeStampAdjustment => NetworkServer.sendInterval * (sendIntervalMultiplier - 1);
protected double offset => timelineOffset ? NetworkServer.sendInterval * sendIntervalMultiplier : 0; protected double offset => timelineOffset ? NetworkServer.sendInterval * sendIntervalMultiplier : 0;
// CoordinateSpace ///////////////////////////////////////////////////////////
[Header("Update Method")]
[Tooltip("Update by default. Try a different method when having problems with Physics or Animations.")]
public UpdateMethod updateMethod = UpdateMethod.Update;
// debugging /////////////////////////////////////////////////////////// // debugging ///////////////////////////////////////////////////////////
[Header("Debug")] [Header("Debug")]
public bool showGizmos; public bool showGizmos;

View File

@ -47,15 +47,15 @@ public class NetworkTransformReliable : NetworkTransformBase
// update ////////////////////////////////////////////////////////////// // update //////////////////////////////////////////////////////////////
void Update() void Update()
{ {
// if server then always sync to others. if (updateMethod == UpdateMethod.Update)
if (isServer) UpdateServer(); UpdateCall();
// 'else if' because host mode shouldn't send anything to server.
// it is the server. don't overwrite anything there.
else if (isClient) UpdateClient();
} }
void LateUpdate() void LateUpdate()
{ {
if (updateMethod == UpdateMethod.LateUpdate)
UpdateCall();
// set dirty to trigger OnSerialize. either always, or only if changed. // set dirty to trigger OnSerialize. either always, or only if changed.
// It has to be checked in LateUpdate() for onlySyncOnChange to avoid // It has to be checked in LateUpdate() for onlySyncOnChange to avoid
// the possibility of Update() running first before the object's movement // the possibility of Update() running first before the object's movement
@ -70,6 +70,21 @@ void LateUpdate()
} }
} }
void FixedUpdate()
{
if (updateMethod == UpdateMethod.FixedUpdate)
UpdateCall();
}
void UpdateCall()
{
// if server then always sync to others.
if (isServer) UpdateServer();
// 'else if' because host mode shouldn't send anything to server.
// it is the server. don't overwrite anything there.
else if (isClient) UpdateClient();
}
protected virtual void UpdateServer() protected virtual void UpdateServer()
{ {
// apply buffered snapshots IF client authority // apply buffered snapshots IF client authority

View File

@ -36,11 +36,8 @@ public class NetworkTransformUnreliable : NetworkTransformBase
// Update applies interpolation // Update applies interpolation
void Update() void Update()
{ {
if (isServer) UpdateServerInterpolation(); if (updateMethod == UpdateMethod.Update)
// for all other clients (and for local player if !authority), UpdateCall();
// we need to apply snapshots from the buffer.
// 'else if' because host mode shouldn't interpolate client
else if (isClient && !IsClientWithAuthority) UpdateClientInterpolation();
} }
// LateUpdate broadcasts. // LateUpdate broadcasts.
@ -50,6 +47,9 @@ void Update()
// this could cause visible jitter. // this could cause visible jitter.
void LateUpdate() void LateUpdate()
{ {
if (updateMethod == UpdateMethod.LateUpdate)
UpdateCall();
// if server then always sync to others. // if server then always sync to others.
if (isServer) UpdateServerBroadcast(); if (isServer) UpdateServerBroadcast();
// client authority, and local player (= allowed to move myself)? // client authority, and local player (= allowed to move myself)?
@ -58,6 +58,21 @@ void LateUpdate()
else if (isClient && IsClientWithAuthority) UpdateClientBroadcast(); else if (isClient && IsClientWithAuthority) UpdateClientBroadcast();
} }
void FixedUpdate()
{
if (updateMethod == UpdateMethod.FixedUpdate)
UpdateCall();
}
void UpdateCall()
{
if (isServer) UpdateServerInterpolation();
// for all other clients (and for local player if !authority),
// we need to apply snapshots from the buffer.
// 'else if' because host mode shouldn't interpolate client
else if (isClient && !IsClientWithAuthority) UpdateClientInterpolation();
}
protected virtual void CheckLastSendTime() protected virtual void CheckLastSendTime()
{ {
// We check interval every frame, and then send if interval is reached. // We check interval every frame, and then send if interval is reached.