一个简单的事件回调管理器。
用来简单的解决多线程无法调用Unity主线程API 的问题。
用来处理延时回调。
用来处理自定义时长循环回调。
首先是 TimeActionUpdate 类,用来存储事件。
public class TimeActionUpdate
{
public float timeCounter;
public Action updateAction;
public Action endAction;
public bool isTrigered = false;
public TimeActionUpdate(Action updateAction = null, Action endAction = null)
{
this.updateAction = updateAction;
this.endAction = endAction;
}
public TimeActionUpdate() { }
public void Update(float dt)
{
if (isTrigered)
{
if (timeCounter > 0)
{
timeCounter -= dt;
updateAction?.Invoke();
}
else
{
isTrigered = false;
endAction?.Invoke();
}
}
}
public void Trigger(float invokeTime = 0.05f)
{
timeCounter = invokeTime;
isTrigered = true;
}
}
使用时:
public class Demo : MonoBehaviour
{
Dictionary<string, TimeActionUpdate> allActions = new Dictionary<string, TimeActionUpdate>();
private const string invokeCallback = "invokeCallback";
private const string updateCallback = "updateCallback";
//注册回调
private void Start()
{
allActions[invokeCallback] = new TimeActionUpdate(null, Func_InvokeCallback);
allActions[updateCallback] = new TimeActionUpdate(null, Func_UpdateCallback);
}
//在Update中更新回调
private void Update()
{
foreach (var item in allActions)
{
item.Value.Update(Time.deltaTime);
}
}
//回调方法类型1
private void Func_InvokeCallback()
{
Debug.Log("延时回调被调用");
}
//回调方法类型2
private void Func_UpdateCallback()
{
Debug.Log("循环回调被调用");
}
//触发回调 1 供其他方法调用 可以绑定在Button上等
public void Trigger_InvokeCallBack()
{
allActions[invokeCallback].Trigger(2); //在 2 秒后 将执行 回调方法 Func_InvokeCallback()
}
//触发回调 2 供其他方法调用 可以绑定在Button上等
public void Trigger_UpdateCallBack()
{
allActions[updateCallback].Trigger(2); // 立即开始执行 Func_UpdateCallback() 回调方法 并持续 2 秒钟
}
}