diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs index 85428ebf5..e821074b8 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs @@ -23,6 +23,7 @@ namespace Mirror { public enum CoordinateSpace { Local, World } + public enum UpdateMethod { Update, LateUpdate, FixedUpdate } public abstract class NetworkTransformBase : NetworkBehaviour { @@ -119,6 +120,11 @@ public uint sendIntervalMultiplier protected double timeStampAdjustment => NetworkServer.sendInterval * (sendIntervalMultiplier - 1); protected double offset => timelineOffset ? NetworkServer.sendInterval * sendIntervalMultiplier : 0; + // Update Method /////////////////////////////////////////////////////////// + [Header("Update Method")] + [Tooltip("Update by default. Try a different method when having problems with Physics or Animations.")] + public UpdateMethod updateMethod = UpdateMethod.Update; + // debugging /////////////////////////////////////////////////////////// [Header("Debug")] public bool showGizmos; diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformReliable.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformReliable.cs index b81433773..d44621c24 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformReliable.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformReliable.cs @@ -45,15 +45,15 @@ public class NetworkTransformReliable : NetworkTransformBase // update ////////////////////////////////////////////////////////////// void Update() { - // 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(); + if (updateMethod == UpdateMethod.Update) + UpdateCall(); } void LateUpdate() { + if (updateMethod == UpdateMethod.LateUpdate) + UpdateCall(); + // set dirty to trigger OnSerialize. either always, or only if changed. // It has to be checked in LateUpdate() for onlySyncOnChange to avoid // the possibility of Update() running first before the object's movement @@ -68,6 +68,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() { // apply buffered snapshots IF client authority diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformUnreliable.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformUnreliable.cs index 79538737c..8f2b1f949 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformUnreliable.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformUnreliable.cs @@ -29,11 +29,8 @@ public class NetworkTransformUnreliable : NetworkTransformBase // Update applies interpolation void Update() { - 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(); + if (updateMethod == UpdateMethod.Update) + UpdateCall(); } // LateUpdate broadcasts. @@ -43,6 +40,9 @@ void Update() // this could cause visible jitter. void LateUpdate() { + if (updateMethod == UpdateMethod.LateUpdate) + UpdateCall(); + // if server then always sync to others. if (isServer) UpdateServerBroadcast(); // client authority, and local player (= allowed to move myself)? @@ -51,6 +51,21 @@ void LateUpdate() 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() { // We check interval every frame, and then send if interval is reached.