Unity-WebSocket/Assets/FishNet/Runtime/Generated/Component/Utility/MonoTickSmoother.cs
2025-06-28 11:28:54 +03:30

157 lines
4.7 KiB
C#

using FishNet.Managing.Logging;
using FishNet.Managing.Timing;
using FishNet.Object;
using FishNet.Object.Prediction;
using GameKit.Dependencies.Utilities;
using UnityEngine;
#pragma warning disable CS0618 // Type or member is obsolete
namespace FishNet.Component.Transforming
{
/// <summary>
/// Smoothes an object between ticks.
/// This can be used on objects without NetworkObject components.
/// </summary>
public class MonoTickSmoother : MonoBehaviour
{
//Lazy way to display obsolete message w/o using a custom editor.
[Header("This component will be obsoleted soon.")]
[Header("Use NetworkTickSmoother or OfflineTickSmoother.")]
[Header(" ")]
#region Serialized.
/// <summary>
/// True to use InstanceFinder to locate the TimeManager. When false specify which TimeManager to use by calling SetTimeManager.
/// </summary>
[Tooltip("True to use InstanceFinder to locate the TimeManager. When false specify which TimeManager to use by calling SetTimeManager.")]
[SerializeField]
private bool _useInstanceFinder = true;
/// <summary>
/// GraphicalObject you wish to smooth.
/// </summary>
[Tooltip("GraphicalObject you wish to smooth.")]
[SerializeField]
private Transform _graphicalObject;
/// <summary>
/// True to enable teleport threshhold.
/// </summary>
[Tooltip("True to enable teleport threshold.")]
[SerializeField]
private bool _enableTeleport;
/// <summary>
/// How far the object must move between ticks to teleport rather than smooth.
/// </summary>
[Tooltip("How far the object must move between ticks to teleport rather than smooth.")]
[Range(0f, ushort.MaxValue)]
[SerializeField]
private float _teleportThreshold;
#endregion
#region Private.
/// <summary>
/// TimeManager subscribed to.
/// </summary>
private TimeManager _timeManager;
/// <summary>
/// BasicTickSmoother for this script.
/// </summary>
private LocalTransformTickSmoother _tickSmoother;
#endregion
private void OnEnable()
{
Initialize();
}
private void OnDisable()
{
_tickSmoother.ResetState();
ChangeSubscription(false);
ObjectCaches<LocalTransformTickSmoother>.StoreAndDefault(ref _tickSmoother);
}
[Client(Logging = LoggingType.Off)]
private void Update()
{
_tickSmoother?.Update();
}
/// <summary>
/// Initializes this script for use.
/// </summary>
private void Initialize()
{
_tickSmoother = ObjectCaches<LocalTransformTickSmoother>.Retrieve();
if (_useInstanceFinder)
{
_timeManager = InstanceFinder.TimeManager;
ChangeSubscription(true);
}
}
/// <summary>
/// Sets a new PredictionManager to use.
/// </summary>
/// <param name="tm"></param>
public void SetTimeManager(TimeManager tm)
{
if (tm == _timeManager)
return;
//Unsub from current.
ChangeSubscription(false);
//Sub to newest.
_timeManager = tm;
ChangeSubscription(true);
}
/// <summary>
/// Changes the subscription to the TimeManager.
/// </summary>
private void ChangeSubscription(bool subscribe)
{
if (_timeManager == null)
return;
if (subscribe)
{
if (_tickSmoother != null)
{
float tDistance = (_enableTeleport) ? _teleportThreshold : MoveRates.UNSET_VALUE;
_tickSmoother.InitializeOnce(_graphicalObject, tDistance, (float)_timeManager.TickDelta, 1);
}
_timeManager.OnPreTick += _timeManager_OnPreTick;
_timeManager.OnPostTick += _timeManager_OnPostTick;
}
else
{
_timeManager.OnPreTick -= _timeManager_OnPreTick;
_timeManager.OnPostTick -= _timeManager_OnPostTick;
}
}
/// <summary>
/// Called before a tick starts.
/// </summary>
private void _timeManager_OnPreTick()
{
_tickSmoother.OnPreTick();
}
/// <summary>
/// Called after a tick completes.
/// </summary>
private void _timeManager_OnPostTick()
{
_tickSmoother.OnPostTick();
}
}
}