diff options
Diffstat (limited to 'Assets/Scripts/Common/EffectPlayer.cs')
-rw-r--r-- | Assets/Scripts/Common/EffectPlayer.cs | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/Assets/Scripts/Common/EffectPlayer.cs b/Assets/Scripts/Common/EffectPlayer.cs new file mode 100644 index 0000000..f60165a --- /dev/null +++ b/Assets/Scripts/Common/EffectPlayer.cs @@ -0,0 +1,154 @@ +using UnityEngine; +using System; +using System.Collections.Generic; + +namespace Coffee.UIEffects +{ + /// <summary> + /// Effect player. + /// </summary> + [Serializable] + public class EffectPlayer + { + //################################ + // Public Members. + //################################ + /// <summary> + /// Gets or sets a value indicating whether is playing. + /// </summary> + [Header("Effect Player")] [Tooltip("Playing.")] + public bool play = false; + + /// <summary> + /// Gets or sets the delay before looping. + /// </summary> + [Tooltip("Initial play delay.")] [Range(0f, 10f)] + public float initialPlayDelay = 0; + + /// <summary> + /// Gets or sets the duration. + /// </summary> + [Tooltip("Duration.")] [Range(0.01f, 10f)] + public float duration = 1; + + /// <summary> + /// Gets or sets a value indicating whether can loop. + /// </summary> + [Tooltip("Loop.")] public bool loop = false; + + /// <summary> + /// Gets or sets the delay before looping. + /// </summary> + [Tooltip("Delay before looping.")] [Range(0f, 10f)] + public float loopDelay = 0; + + /// <summary> + /// Gets or sets the update mode. + /// </summary> + [Tooltip("Update mode")] public AnimatorUpdateMode updateMode = AnimatorUpdateMode.Normal; + + static List<Action> s_UpdateActions; + + /// <summary> + /// Register player. + /// </summary> + public void OnEnable(Action<float> callback = null) + { + if (s_UpdateActions == null) + { + s_UpdateActions = new List<Action>(); + Canvas.willRenderCanvases += () => + { + var count = s_UpdateActions.Count; + for (int i = 0; i < count; i++) + { + s_UpdateActions[i].Invoke(); + } + }; + } + + s_UpdateActions.Add(OnWillRenderCanvases); + + if (play) + { + _time = -initialPlayDelay; + } + else + { + _time = 0; + } + + _callback = callback; + } + + /// <summary> + /// Unregister player. + /// </summary> + public void OnDisable() + { + _callback = null; + s_UpdateActions.Remove(OnWillRenderCanvases); + } + + /// <summary> + /// Start playing. + /// </summary> + public void Play(bool reset, Action<float> callback = null) + { + if (reset) + { + _time = 0; + } + + play = true; + if (callback != null) + { + _callback = callback; + } + } + + /// <summary> + /// Stop playing. + /// </summary> + public void Stop(bool reset) + { + if (reset) + { + _time = 0; + if (_callback != null) + { + _callback(_time); + } + } + + play = false; + } + + //################################ + // Private Members. + //################################ + float _time = 0; + Action<float> _callback; + + void OnWillRenderCanvases() + { + if (!play || !Application.isPlaying || _callback == null) + { + return; + } + + _time += updateMode == AnimatorUpdateMode.UnscaledTime + ? Time.unscaledDeltaTime + : Time.deltaTime; + var current = _time / duration; + + if (duration <= _time) + { + play = loop; + _time = loop ? -loopDelay : 0; + } + + _callback(current); + } + } +} |