From c47b92e92cf33ae8bf2f38929e137294397e4735 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 7 Apr 2021 21:33:14 +0800 Subject: +init --- Assets/Scripts/Common/EffectPlayer.cs | 154 ++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 Assets/Scripts/Common/EffectPlayer.cs (limited to 'Assets/Scripts/Common/EffectPlayer.cs') 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 +{ + /// + /// Effect player. + /// + [Serializable] + public class EffectPlayer + { + //################################ + // Public Members. + //################################ + /// + /// Gets or sets a value indicating whether is playing. + /// + [Header("Effect Player")] [Tooltip("Playing.")] + public bool play = false; + + /// + /// Gets or sets the delay before looping. + /// + [Tooltip("Initial play delay.")] [Range(0f, 10f)] + public float initialPlayDelay = 0; + + /// + /// Gets or sets the duration. + /// + [Tooltip("Duration.")] [Range(0.01f, 10f)] + public float duration = 1; + + /// + /// Gets or sets a value indicating whether can loop. + /// + [Tooltip("Loop.")] public bool loop = false; + + /// + /// Gets or sets the delay before looping. + /// + [Tooltip("Delay before looping.")] [Range(0f, 10f)] + public float loopDelay = 0; + + /// + /// Gets or sets the update mode. + /// + [Tooltip("Update mode")] public AnimatorUpdateMode updateMode = AnimatorUpdateMode.Normal; + + static List s_UpdateActions; + + /// + /// Register player. + /// + public void OnEnable(Action callback = null) + { + if (s_UpdateActions == null) + { + s_UpdateActions = new List(); + 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; + } + + /// + /// Unregister player. + /// + public void OnDisable() + { + _callback = null; + s_UpdateActions.Remove(OnWillRenderCanvases); + } + + /// + /// Start playing. + /// + public void Play(bool reset, Action callback = null) + { + if (reset) + { + _time = 0; + } + + play = true; + if (callback != null) + { + _callback = callback; + } + } + + /// + /// Stop playing. + /// + public void Stop(bool reset) + { + if (reset) + { + _time = 0; + if (_callback != null) + { + _callback(_time); + } + } + + play = false; + } + + //################################ + // Private Members. + //################################ + float _time = 0; + Action _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); + } + } +} -- cgit v1.1-26-g67d0