【Unity入门】19.定时调用Invoke

【Unity入门】定时调用Invoke

    大家好,我是Lampard~~

    欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 

(一)计时器

(1)Invoke 单词调用

    计时器我们并不陌生,在cocos上有着schedule类是相似的。在Unity中给我们提供了Invoke相关的类来实现计时器功能

    首先我们熟悉的是单次延时调用方法Invoke

Unity 的 Invoke() 方法是一种用于延迟执行某个方法的方式。Invoke() 方法可以在指定的时间(以秒为单位)后执行指定的方法

Invoke() 方法的语法如下:

```

Invoke(string methodName, float time);

```

其中,`methodName` 是要执行的方法的名称,`time` 是要延迟的时间(以秒为单位)

    好,我们接下来就尝试在mainLogic中使用这个方法,我们在start方法中打印了当前时间,并Invoke调用了TryInvoke方法,在TryInvoke打印了被调用时候的时间

    代码很简单,需要注意的是Invoke传入的是函数名称,是一个字符串,每加双引号会报错

    void Start()
    {
        Debug.Log("当前的时间是" + Time.time);
        this.Invoke("TryInvoke", 2);
    }

    void TryInvoke()
    {
        Debug.Log("执行方法的时间是" + Time.time);
    }

    看看结果,确实是2秒后调用,没有问题。而且tryInvoke方法只执行一次

(2)InvokeRepeating 重复调用

    那我想重复调用行不行?想每隔两秒就执行一次。

    可以,那就需要用到了InvokeRepeating方法了

InvokeRepeating() 是 Unity 提供的一个定时器方法,用于在指定的时间间隔(以秒为单位)重复执行指定的方法。InvokeRepeating() 方法的语法如下:

```

InvokeRepeating(string methodName, float time, float repeatRate);

```

其中,`methodName` 是要执行的方法的名称,`time` 是要延迟的时间(以秒为单位),`repeatRate` 是重复执行的时间间隔(以秒为单位)

    可以看到,这个方法比起Invoke,只是多了一个重复执行的时间的参数,比如说,如果我想每两秒就执行一次,代码可以这样写:

    void Start()
    {
        Debug.Log("当前的时间是" + Time.time);
        this.InvokeRepeating("TryInvoke", 2, 2);
    }

    void TryInvoke()
    {
        Debug.Log("执行方法的时间是" + Time.time);
    }

    看看效果,果然就会被重复执行了: 

(3)IsInvoking 是否正在调用

    那比如说,现在是每2秒执行一次,我突然想让这个计时器停下来,比如如果玩家鼠标左键点击的时候,就让这个计时器停下需要怎么写呢?

    首先我们需要判定以下这个方法是否在计时器调用中,这个方法就是IsInvokeing

IsInvoking 是 Unity 提供的一个方法,用于判断某个方法是否正在被 Invoke 或 InvokeRepeating 方法调用。IsInvoking 方法的语法如下:

```

bool IsInvoking(string methodName);

```

其中,`methodName` 是要判断的方法名称

    所以我们可以在update方法中写一个监听鼠标点击的方法,然后在鼠标点击的时候判定这个方法是不是被计时器调用

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (this.IsInvoking("TryInvoke"))
            { 
                // 取消调用
            }
        }
    }

(4)CancelInvoke 取消调用

    下一步就是取消计时器的调用。unity也给我们提供了方法,就是CancelInvoke

CancelInvoke 是 Unity 提供的一个方法,用于取消某个方法的 Invoke 或 InvokeRepeating 方法调用。CancelInvoke 方法的语法如下:

```

void CancelInvoke();

void CancelInvoke(string methodName);

```

其中,第一个重载无参数,可以取消所有正在被 Invoke 或 InvokeRepeating 方法调用的方法;第二个重载需要传入要取消的方法名称,只能取消指定的方法调用

    可以看到,我们可以采取传参或者不传参的方式暂停计时器,不传参就会停止所有的计时器,这个方法有点暴力,因此我们还是精准一些,采用第二个方法试试看

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (this.IsInvoking("TryInvoke"))
            {
                Debug.Log("取消计时器");
                this.CancelInvoke("TryInvoke");
            }
        }
    }

    看看最后效果,到此我们就熟悉了unity常用的四个计时器:

(二)Demo电风扇

    学习了一个新方法怎么能够不写一个demo玩一下呢?

    接下来我们准备了一个电风扇模型,通过Inovke的方法来实现加速减速的效果,首先把这个风扇模型导入到项目中

    接下来我们把之前地球的RotateLogic脚本赋值给他,先让它转起来看看

     可以看到,它就快乐的转动起来了。但是看上去怪怪的,首先这个风扇也太慢了其次速度应该是慢慢加速上去的,而不是一运行就那么快

    那我们继续补充一下逻辑 :

    void Start()
    {
        this.speed = 0;
    }

    void Update()
    {
        this.transform.Rotate(0, this.speed * Time.deltaTime, 0);
        if (Input.GetMouseButtonDown(0))
        {
            this.InvokeRepeating("ChangeSpeed", 0, 1);
        }
    }

    void ChangeSpeed()
    {
        if (this.speed < 500) 
        {
            this.speed += 50;
        }
    }

    首先的默认速度是0,点击之后不间隔重复执行ChangeSpeed方法,修改速度的值,最后看看效果吧:

好啦今天就到这里,谢谢各位感谢阅读!!!
点赞,关注!!!

### Unity 中 `Invoke` 方法的使用 #### 基础概念 `Invoke` 是 Unity 提供的一个函数,允许开发者在指定的时间延迟后调用另一个方法。此方法通常用于实现简单的定时器功能[^1]。 #### 调用无参方法 如果目标方法不需要任何参数,则可以直接通过 `Invoke` 来调用。例如: ```csharp using UnityEngine; public class Example : MonoBehaviour { void Start() { Invoke("SpawnObject", 2); // 在2秒后调用 SpawnObject 方法 } void SpawnObject() { Instantiate(target, new Vector3(0, 2, 0), Quaternion.identity); } } ``` 上述代码展示了如何在启动后的两秒钟内调用 `SpawnObject` 函数[^5]。 #### 注意事项 需要注意的是,在某些情况下无法禁用已经安排好的 `Invoke` 调用。即使设置组件不可用 (`this.enabled = false`) 或者隐藏游戏对象 (`this.gameObject.SetActive(false)`),已计划中的 `Invoke` 并不会自动取消[^2]。 #### 带参数的方法调用 虽然标准形式下的 `Invoke` 不支持直接传递参数,但可以通过扩展方式来间接完成这一需求。下面是一个例子展示如何向被调用的方法传入字符串和整数作为参数[^3]: ```csharp using UnityEngine; using System.Collections; public class MyScript : MonoBehaviour { void Start() { StartCoroutine(DelayedCall()); } IEnumerator DelayedCall() { yield return new WaitForSeconds(5.0f); // 等待5秒 DoSomething("Hello", 123); // 执行带有参数的方法 } void DoSomething(string message, int number) { Debug.Log(message + " " + number); } } ``` 这里采用了协程的方式替代传统的 `Invoke` 实现了带参数的功能[^4]。 #### 替代方案 对于更复杂的场景或者需要更高的可靠性时,建议考虑使用 C# 的委托 (Delegates) 和 Lambda 表达式等现代特性代替原始的 `Invoke` 方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值