You've already forked taptap2024_GJ_chidouren
155 lines
4.0 KiB
C#
155 lines
4.0 KiB
C#
|
|
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 (this.play)
|
|||
|
|
{
|
|||
|
|
this._time = -this.initialPlayDelay;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
this._time = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this._callback = callback;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Unregister player.
|
|||
|
|
/// </summary>
|
|||
|
|
public void OnDisable()
|
|||
|
|
{
|
|||
|
|
this._callback = null;
|
|||
|
|
s_UpdateActions.Remove(OnWillRenderCanvases);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Start playing.
|
|||
|
|
/// </summary>
|
|||
|
|
public void Play(bool reset, Action<float> callback = null)
|
|||
|
|
{
|
|||
|
|
if (reset)
|
|||
|
|
{
|
|||
|
|
this._time = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.play = true;
|
|||
|
|
if (callback != null)
|
|||
|
|
{
|
|||
|
|
this._callback = callback;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Stop playing.
|
|||
|
|
/// </summary>
|
|||
|
|
public void Stop(bool reset)
|
|||
|
|
{
|
|||
|
|
if (reset)
|
|||
|
|
{
|
|||
|
|
this._time = 0;
|
|||
|
|
if (this._callback != null)
|
|||
|
|
{
|
|||
|
|
this._callback(this._time);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.play = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//################################
|
|||
|
|
// Private Members.
|
|||
|
|
//################################
|
|||
|
|
float _time = 0;
|
|||
|
|
Action<float> _callback;
|
|||
|
|
|
|||
|
|
void OnWillRenderCanvases()
|
|||
|
|
{
|
|||
|
|
if (!this.play || !Application.isPlaying || this._callback == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this._time += this.updateMode == AnimatorUpdateMode.UnscaledTime
|
|||
|
|
? Time.unscaledDeltaTime
|
|||
|
|
: Time.deltaTime;
|
|||
|
|
var current = this._time / this.duration;
|
|||
|
|
|
|||
|
|
if (this.duration <= this._time)
|
|||
|
|
{
|
|||
|
|
this.play = this.loop;
|
|||
|
|
this._time = this.loop ? -this.loopDelay : 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this._callback(current);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|