using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
|
namespace CJ.Wait
|
{
|
/// <summary>
|
/// 延迟几秒执行事件
|
/// </summary>
|
public class WaitCallBack : MonoBehaviour
|
{
|
internal float waitTime = 2.0f;
|
|
public bool doOnAwake = false;
|
/// <summary>
|
/// 时间到达回调
|
/// </summary>
|
public Action<Component> OnCompelete;
|
/// <summary>
|
/// 每帧回调
|
/// </summary>
|
public Action<Component> OnWait;
|
|
internal static Dictionary<GameObject, WaitCallBack> waitDic = new Dictionary<GameObject, WaitCallBack>();
|
|
private float m_Time = 0;
|
|
private bool start = false;
|
|
private Component m_Comp;
|
|
private void Awake()
|
{
|
if (doOnAwake)
|
{
|
Play();
|
}
|
}
|
|
private void OnDisable()
|
{
|
Stop();
|
}
|
|
private void Update()
|
{
|
if (start)
|
{
|
m_Time += Time.deltaTime;
|
if (m_Time >= waitTime)
|
{
|
Stop();
|
if (OnCompelete != null)
|
OnCompelete(m_Comp);
|
}
|
if (OnWait != null && start)
|
OnWait(m_Comp);
|
}
|
}
|
|
internal void Play()
|
{
|
start = true;
|
}
|
|
internal void Restart()
|
{
|
m_Time = 0;
|
Play();
|
}
|
|
internal void Stop()
|
{
|
m_Time = 0;
|
start = false;
|
}
|
|
internal void Pause()
|
{
|
start = false;
|
}
|
|
private void OnDestroy()
|
{
|
if (waitDic.ContainsKey(gameObject))
|
{
|
waitDic.Remove(gameObject);
|
}
|
}
|
|
internal void AddWaitDic(Component go)
|
{
|
m_Comp = go;
|
waitDic.Add(go.gameObject, this);
|
}
|
}
|
|
public static class Helper
|
{
|
public static void DoWaitStart(this Component go)
|
{
|
if (GetWait(go) == null)
|
return;
|
GetWait(go).Play();
|
}
|
|
public static void OnWaitCompelete(this Component go, Action<Component> func)
|
{
|
WaitCallBack wait = GetWait(go);
|
if (wait == null)
|
return;
|
wait.OnCompelete = func;
|
}
|
|
public static void OnWait(this Component go, Action<Component> func)
|
{
|
WaitCallBack wait = GetWait(go);
|
if (wait == null)
|
return;
|
wait.OnWait = func;
|
}
|
|
public static void DoWaitRestart(this Component go)
|
{
|
if (GetWait(go) == null)
|
return;
|
GetWait(go).Restart();
|
}
|
|
public static void DoWaitStop(this Component go)
|
{
|
if (GetWait(go) == null)
|
return;
|
GetWait(go).Stop();
|
}
|
|
public static void DoWaitPause(this Component go)
|
{
|
if (GetWait(go) == null)
|
return;
|
GetWait(go).Pause();
|
}
|
|
public static WaitCallBack GetWait(Component go)
|
{
|
WaitCallBack wait = null;
|
if (go == null)
|
return null;
|
WaitCallBack.waitDic.TryGetValue(go.gameObject, out wait);
|
if (wait == null)
|
{
|
wait = go.GetComponent<WaitCallBack>();
|
if (wait == null)
|
{
|
wait = go.gameObject.AddComponent<WaitCallBack>();
|
}
|
wait.AddWaitDic(go);
|
}
|
return wait;
|
}
|
|
public static void SetWait(this Component comp, float time)
|
{
|
WaitCallBack wait = GetWait(comp);
|
if (wait != null)
|
{
|
wait.waitTime = time;
|
}
|
}
|
}
|
}
|