This commit is contained in:
JesusLuvsYooh 2024-11-14 01:07:07 +02:00 committed by GitHub
commit 30e1d4d53a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 46 additions and 10 deletions

View File

@ -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;

View File

@ -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

View File

@ -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.