Unity之Invoke

Invoke 是 MonoBehaviour 类中的方法,用于延迟调用方法。

1、基本用法

Invoke()
cs 复制代码
// 基本语法
Invoke("方法名", 延迟时间);

// 示例
void Start()
{
    // 3秒后执行 Shoot 方法
    Invoke("Shoot", 3f);
}

void Shoot()
{
    Debug.Log("射击!");
}
InvokeRepeating()
cs 复制代码
// 基本语法
InvokeRepeating("方法名", 首次延迟时间, 重复间隔时间);

// 示例
void Start()
{
    // 2秒后第一次执行,之后每隔1秒重复执行
    InvokeRepeating("SpawnEnemy", 2f, 1f);
}

void SpawnEnemy()
{
    Debug.Log("生成敌人!");
}
CancelInvoke()
cs 复制代码
// 停止所有通过 Invoke 调用的方法
CancelInvoke();

// 停止特定方法
CancelInvoke("方法名");
IsInvoking()
cs 复制代码
// 检查是否有任何 Invoke 正在执行
if (IsInvoking())
{
    // 有方法正在等待执行
}

// 检查特定方法是否正在等待执行
if (IsInvoking("方法名"))
{
    // 该方法正在等待执行
}

2、Invoke与委托结合使用

从 Unity 2017.1 开始,可以使用 Action 委托替代字符串方法名:

cs 复制代码
// 使用 Invoke 的替代方案
void Start()
{
    // 延迟执行
    StartCoroutine(DelayedAction(2f, () => 
    {
        Debug.Log("延迟执行");
    }));
    
    // 重复执行
    StartCoroutine(RepeatingAction(1f, 0.5f, () => 
    {
        Debug.Log("重复执行");
    }));
}

IEnumerator DelayedAction(float delay, Action action)
{
    yield return new WaitForSeconds(delay);
    action?.Invoke();
}

IEnumerator RepeatingAction(float startDelay, float interval, Action action)
{
    yield return new WaitForSeconds(startDelay);
    
    while (true)
    {
        action?.Invoke();
        yield return new WaitForSeconds(interval);
    }
}

与自定义委托结合

cs 复制代码
    public delegate void DelegateTest();
    class Program
    {
        static void Main(string[] args)
        {
            DelegateTest dele = new DelegateTest(Test1);
            dele += Test2;
            // 执行
            //dele();  // 简化语法
            dele.Invoke();

        }
        static void Test1()
        {
            Console.WriteLine("Test1");
        }
        static void Test2()
        {
            Console.WriteLine("Test2");
        }
    }

3、最佳实践和注意事项

  1. 性能考虑
  • 避免频繁使用 Invoke,特别是在 Update 中
  • 对于性能敏感的场景,优先使用协程
  1. 代码维护
  • 字符串方法名容易拼写错误,且重构时不安全
  • 考虑使用委托或协程替代
  1. 对象销毁时
  • GameObject 被销毁时,所有 Invoke 调用会自动取消
  • 脚本被禁用时,Invoke 不会自动停止
  1. 精度问题
  • Invoke 的时间精度不如 Time.deltaTime 精确
  • 对于需要精确时间控制的场景,建议使用 Update 配合计时器
相关推荐
在路上看风景2 小时前
31. Unity 异步加载的底层细节
unity
天人合一peng4 小时前
Unity中做表头时像work中整个调整宽窄
unity
小李也疯狂16 小时前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
牛掰是怎么形成的16 小时前
Unity材质贴图引用陷阱:包体暴涨真相
unity·材质·贴图
呆呆敲代码的小Y16 小时前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
EQ-雪梨蛋花汤16 小时前
【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
unity·游戏引擎
我的offer在哪里17 小时前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
泡泡茶壶ᐇ17 小时前
Unity游戏开发入门指南:从零开始理解游戏引擎核心概念
unity·游戏引擎
YigAin18 小时前
Unity中的Lock,到底在锁什么,什么时候该用?
unity
Var_al19 小时前
抖小Unity WebGL分包命令行工具实践指南
unity·游戏引擎·webgl