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

news/2025/2/19 14:43:51/

【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方法,修改速度的值,最后看看效果吧:

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


http://www.ppmy.cn/news/55184.html

相关文章

Docker安装在Linux系统上(纯步骤)

Docker安装在Linux系统上操作步骤 本文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只是用来提醒自己安装步骤 下面是docker官网&#xff0c;也有安装详情 https://docs.docker.com/engine/install/centos/ 安装分为四步走 我使用的是CentOS7版本&#xff0c;下面命令…

【AI实战】微小目标检测模型SSPNet--训练环境从零开始搭建

【AI实战】微小目标检测模型SSPNet--训练环境从零开始搭建 SSPNet介绍环境搭建安装依赖参考 SSPNet介绍 SSPNet: Scale Selection Pyramid Network for Tiny Person Detection from UAV Images 官方连接 https://github.com/MingboHong/SSPNetarxiv https://arxiv.org/abs/210…

2023-04-26 力扣LeetCode上的DP动态规划问题分类汇总

2023-04-26 力扣LeetCode上的DP动态规划问题分类汇总 1、线性 DP 最经典单串&#xff1a; 300. 最长上升子序列最经典双串&#xff1a; 1143. 最长公共子序列经典问题&#xff1a; 120. 三角形最小路径和 53. 最大子序和 152. 乘积最大子数组 887. 鸡蛋掉落&#xff08;DP二分…

【嵌入式环境下linux内核及驱动学习笔记-(7-内核 I/O)-多路复用】

目录 2、多路复用2.1 函数select相关2.1.1 应用层select()2.1.2 FD_ZERO2.1.3 FD_SET2.1.4 FD_ISSET 2.2 函数poll相关2.2.1 poll函数 2.3 驱动层 函数2.4 实例 接上篇&#xff0c;继续内核 I/O的五种模式的解读。 2、多路复用 select&#xff0c;poll&#xff0c;epoll都是IO…

C++刷题--选择题3

1&#xff0c; 在上下文和头文件均正常情况下&#xff0c;以下程序的输出结果是&#xff08;&#xff09; int x 1; do{ printf("%2d\n",x); }while(x--);A 1 B 无任何输出 C 2 D 陷入死循环 解析 &#xff1a; D&#xff0c;do-while语句&#xff0c; do里面的先…

ChatGPT会一直火热下去吗?他会是下一个AR,区块链吗?

目录 前言 VR 热潮 区块链热潮 元宇宙热潮 ChatGPT 热潮 理智看待 ChatGPT 前言 如果在今年年底评选 2023 年的年度科技热词&#xff0c;以 ChatGPT 目前的热度&#xff0c;毫无疑问会是今年排名第一的科技热词。 即使今年才过去四个月&#xff0c;但我很难想象还有什么科…

SCADA平台的HMI功能

01 前言 虹科Panorama SCADA平台支持桌面HMI、Web HMI和移动HMI的功能。桌面HMI主要是在桌面工作站实现数据可视化&#xff0c;能够获取到最全面的数据信息以及实现功能&#xff1b;Web HMI可以通过在软件中添加Web HMI服务器&#xff0c;运行程序后&#xff0c;可以在Web 客户…

【代码随想录】刷题Day6

1.有效异位词 242. 有效的字母异位词 直接使用库函数的multiset来判断 其实没什么好说的&#xff0c;因为字符串有重复的可以出现所以用的multiset 缺点&#xff1a;确实浪费空间&#xff0c;红黑树的插入删除&#xff0c;浪费时间 class Solution { public:bool isAnagram(st…