很多人延时调用某个函数时会使用Unity内置的 Invoke
方法,但是这种方式有个明显的缺点,就是参数必须传一个函数名,比如:
void Start()
{
//5秒后执行TestFunction方法
Invoke("TestFunction",5f);
}
void TestFunction()
{
Debug.Log("方法被调用");
}
要执行这个打印信息,就必须放在某个函数中并且给函数命名,即便内容只有一行代码。而在开发过程中,很多时候,起名字是一件很痛苦的事情。
在这里使用线程等待的方式封装了一个更好用的的延时方法
using System;
using System.Threading.Tasks;
/// <summary>
/// 封装后的延时调用函数,可直接使用匿名方法
/// </summary>
public class TestTimmer
{
public static async void StartTimmer(float delay, Action action)
{
await Task.Delay((int)(delay*1000));
action?.Invoke();
}
}
使用方法也比Invoke
更方便,也可以传带参数的方法,因为Lambda表达式中是可以任意编辑的
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
TestTimmer.StartTimmer(3, () => { Debug.Log("3秒后执行"); });
TestTimmer.StartTimmer(4, Function1);
TestTimmer.StartTimmer(5, () => { Function2(5); });
}
void Function1()
{
Debug.Log("Function1被执行");
}
void Function2(int a)
{
Debug.Log(a);
}
}
可以看到没有任何问题。