diff options
Diffstat (limited to 'JamHelper/Assets/JamUtils/Scripts/Smooth-Motion-in-Unity/InterpolationFactorController.cs')
-rw-r--r-- | JamHelper/Assets/JamUtils/Scripts/Smooth-Motion-in-Unity/InterpolationFactorController.cs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/JamHelper/Assets/JamUtils/Scripts/Smooth-Motion-in-Unity/InterpolationFactorController.cs b/JamHelper/Assets/JamUtils/Scripts/Smooth-Motion-in-Unity/InterpolationFactorController.cs new file mode 100644 index 0000000..efb96f3 --- /dev/null +++ b/JamHelper/Assets/JamUtils/Scripts/Smooth-Motion-in-Unity/InterpolationFactorController.cs @@ -0,0 +1,58 @@ +using UnityEngine; + +[DisallowMultipleComponent] +[DefaultExecutionOrder(ORDER_EXECUTION)] +public class InterpolationFactorController : MonoBehaviour +{ + public const int ORDER_EXECUTION = -1000; + + private static InterpolationFactorController Instance; + private float[] _lastFixedUpdates = new float[2]; + private int _lastIndex; + + public static float Factor { get; private set; } + + private void Awake() + { + if (Instance) + { + Destroy(this); + Debug.LogWarning($"The '{typeof(InterpolationFactorController).Name}' is a singleton!"); + return; + } + + Instance = this; + Factor = 1; + } + + private void Start() + { + _lastFixedUpdates = new float[2] { Time.fixedTime, Time.fixedTime }; + _lastIndex = 0; + } + + private void FixedUpdate() + { + _lastIndex = NextIndex(); + _lastFixedUpdates[_lastIndex] = Time.fixedTime; + } + + private void Update() + { + float lastTime = _lastFixedUpdates[_lastIndex]; + float prevTime = _lastFixedUpdates[NextIndex()]; + + if (lastTime == prevTime) + { + Factor = 1; + return; + } + + Factor = (Time.time - lastTime) / (lastTime - prevTime); + } + + private int NextIndex() + { + return (_lastIndex == 0) ? 1 : 0; + } +} |