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 配合计时器
相关推荐
chen_2278 小时前
godot做仪表hmi
游戏引擎·godot
郝学胜-神的一滴15 小时前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
BuHuaX19 小时前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
Solange__2 天前
在线3D预览器、Blender和游戏引擎怎么选?按5类任务比较格式、隐私与编辑性
人工智能·游戏·3d·游戏引擎·blender·1024程序员节·关卡设计
peter67682 天前
unity2d游戏开发经验总结
unity
郝学胜-神的一滴2 天前
游戏设计:原型与开发 19:U3D工位布置与性格说明书
人工智能·算法·unity·unreal engine·游戏策划·游戏设计
Aman19842 天前
Claude Code做Unity项目移植(二): 自动执行只读操作,告别频繁的
unity·游戏开发·vibe coding·claude code
暴走约伯3 天前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
郝学胜-神的一滴3 天前
游戏设计:原型与开发 18:Unity入门的第一课
人工智能·程序人生·游戏·ui·unity·游戏引擎
淡海水3 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc