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

这篇具有很好参考价值的文章主要介绍了【Unity入门】19.定时调用Invoke。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Unity入门】定时调用Invoke

    大家好,我是Lampard~~

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

unity invoke,Unity原理,unity,游戏引擎

(一)计时器

(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方法只执行一次

unity invoke,Unity原理,unity,游戏引擎

(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);
    }

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

unity invoke,Unity原理,unity,游戏引擎

(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常用的四个计时器:

unity invoke,Unity原理,unity,游戏引擎

(二)Demo电风扇

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

unity invoke,Unity原理,unity,游戏引擎

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

unity invoke,Unity原理,unity,游戏引擎

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

unity invoke,Unity原理,unity,游戏引擎

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

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

    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,Unity原理,unity,游戏引擎

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

unity invoke,Unity原理,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-769133.html

到了这里,关于【Unity入门】19.定时调用Invoke的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity入门02——Unity工作原理

    Unity引擎本质是一个软件使用它时是处于运行中的 我们是在一个运行中的软件里制作游戏的 Unity开发的本质就是在Unity引擎的基础上利用反射和引擎提供的各种功能进行的拓展开发 1.回忆一下反射的概念 程序正在运行时,可以查看其它程序集或者自身的元数据 一个运行的程序

    2024年02月05日
    浏览(30)
  • Unity中如何激发(invoke)一个Button的OnClick事件

    点了【按钮2】后,会激发(invoke)【按钮1】的OnClick事件 1、用Invoke()激发 2、用ExecuteEvents.Execute()分发

    2024年02月12日
    浏览(34)
  • 【Unity】 基础交互入门(C#脚本互相调用的方法,含动态绑定脚本)

    脚本A: 在需要被调用的类里这样写: 脚本B: 在其他类里调用: 如果出现无法识别上下文的提示,检查一下以下问题: 1、两个脚本的命名空间是否一致,如果不需要的命名空间可以直接删除。 2、类名是否大写开头,且命名合法,且和文件名一致。 3、更新编译一下保存一

    2024年02月15日
    浏览(46)
  • 【学习笔记】unity脚本学习(五)【常用的方法函数Destroy、Instantiate 、SendMessage、invoke 、Coroutine】

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/130233098 视频参考 极客学院Unity3D视频精讲课程 Object体系结构 可以看到MonoBehaviour继承自Component,Component继承自Object MonoBehaviour复习 MonoBehaviour官网API 之前学的start awake等都是Message事件响应函数,它们都是我们在脚本

    2024年02月04日
    浏览(34)
  • 【VRTK】【VR开发】【Unity】19-VRTK实现旋转运动

    课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 在实际开发中,旋转运动也是时常需要模拟的重要运动类型。常见的场景有开关门,方向盘轮胎以及拉动拉杆等等。 旋转运动的实现可以基于物理系统也可以脱离物理系统,后者

    2024年02月02日
    浏览(37)
  • Unity 时间定时调度系统

    之前的文章也有写过时间调度系统,但是没有支持异步调度只有回调调度,而且效率和代码可读性不是很好,下面介绍一种更优质的时间调度系统 首先需要定义一个时间行为,每次延时后需要干什么,延迟的时间类型是什么都需要使用TimerAction 这个调度器是个单例,单例在此

    2024年02月03日
    浏览(37)
  • Unity定时器

    1.Unity定时器受TimeScale影响 2.用法

    2024年02月11日
    浏览(26)
  • FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装? 数据封装(baiData Encapsulation) ,笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。 解封装 ,就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业

    2023年04月09日
    浏览(35)
  • Unity中定时器的简易使用

    //定时器写法1 //定时器写法2 //定时器写法3 协程的定时中断

    2024年02月13日
    浏览(25)
  • Webpack5入门到原理19:React 脚手架搭建

    package.json .eslintrc.js babel.config.js webpack.config.js 修改运行指令 package.json

    2024年01月21日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包