【Unity】替代Invoke的定时器,可延迟执行带参方法
游戏开发离不开定时器,一个好用的延时方法对于控制游戏节奏而言尤为重要。但是 Unity 中的 Invoke 方法使用有着诸多缺陷,比如不容易查找引用,无法延时带参方法等。其他的延时方法,诸如协程和 Update 中监控,实现都比较繁琐。
这一个类封装了 Update 监控实现定时器的方法,实际使用时和 Invoke 一样便利,同时解决了 Invoke 不容易查找引用和无法延时带参方法的问题。
TimerManager.GetInstance().StartTimer(1f, methodName);
等效于,
Invoke(“methodName”, 1f);
同时可以使用 delegate 关键字实现带参方法的延时,
TimerManager.GetInstance().StartTimer(1f, delegate { methodName(value); });
TimeManager.cs 代码贴上:
using System;
using System.Collections.Generic;
using UnityEngine;
// 定时器管理类
public class TimerManager : MonoBehaviour
{
private List<Timer> poolTimer = new List<Timer>(); // 全部定时器
// 多线程安全的单例【文章后续有对此处单例写法的更正】
private static TimerManager timerManager;
private static readonly object _lock = new object();
public static TimerManager GetInstance()
{
if (timerManager == null)
{
lock (_lock)
{
if (timerManager == null)
{
GameObject obj = GameObject.Find("TimerManager");
if (obj == null)
obj = new GameObject("TimerManager");
timerManager = obj.AddComponent<TimerManager>();
}
}
}
return timerManager;
}
/// <summary>
/// timer 秒后执行一次 timerCallback 函数
/// </summary>
/// <param name="timer">延迟执行时间</param>
/// <param name="timerCallback">延迟执行的函数</param>
/// <param name="unscaled">默认false,若为true -- 不受timescale缩放影响</param>
public void StartTimer(float timer, Action timerCallback