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 配合计时器
相关推荐
AC梦16 小时前
unity中如何将UI上的字高清显示
ui·unity
小贺儿开发1 天前
Unity3D 智慧城市管理平台
数据库·人工智能·unity·智慧城市·数据可视化
June bug2 天前
【领域知识】休闲游戏一次发版全流程:Google Play + Apple App Store
unity
星夜泊客2 天前
C# 基础:为什么类可以在静态方法中创建自己的实例?
开发语言·经验分享·笔记·unity·c#·游戏引擎
dzj20212 天前
PointerEnter、PointerExit、PointerDown、PointerUp——鼠标点击物体,则开始旋转,鼠标离开或者松开物体,则停止旋转
unity·pointerdown·pointerup
心前阳光2 天前
Unity 模拟父子关系
android·unity·游戏引擎
在路上看风景2 天前
26. Mipmap
unity
咸鱼永不翻身2 天前
Unity视频资源压缩详解
unity·游戏引擎·音视频
在路上看风景2 天前
4.2 OverDraw
unity
在路上看风景2 天前
1.10 CDN缓存
unity