Unity延时执行的多种方法小结

目录
  • Update计时器
  • Invoke
  • 协程
  • DoTween

最开始接触unity的时候,我做延时都是在update里做计时器。后来才发现,我屮艸芔茻,还有这么多种更方便延时执行的方式。现在我们就来捋一捋。

本文列举的有以下四种,如有错漏,欢迎补充指正

Update Invoke 协程 DoTween
支持参数传入 ✖️ ✖️ ✔️ ✖️

下表是在不同情况下各方案的执行状态

Update Invoke 协程 DoTween
Time.timeScale = 0 ✔️ ✖️ ✖️ ✔️
activeSelf == false ✖️ ✔️ ✖️ ✔️
enabled == false ✖️ ✔️ ✔️ ✔️
destroy ✖️ ✖️ ✖️ ✔️

Update计时器

在Update等刷新函数内计时,timer += Time.deltaTime 当时间达到预期,执行需要延时的方法。 需要注意的是,增量时间Time.deltaTime是每帧都不同的浮点数。计时器不能用 == 去判断达成条件。需要用 > 或 >= 加一个标志位。以确保函数能执行到且只执行一次 Update在 Time.timeScale = 0 时会正常执行,但这时Time.deltaTime的值为0。需要这时使用计时器的话,可以使用Time.realtimeSinceStartup

 private float delayTime = 1;
    private float timer = 0;
    private bool executed = false;
    void Update(){
        if (executed == false){
            timer += Time.deltaTime;
            if (timer >= 1){
                executed = true;
                DelayFunc();
            }
        }
    }
    private void DelayFunc(){
        print("执行测试函数");
    }

Invoke

Invoke() 方法是 Unity3D 的一种委托机制。使用简单便捷。 但是这个家伙和其他方式不太一样的是,隐藏物体或将脚本enabled 设置为false,并不会中断Invoke的执行。 Invoke支持重复调用: InvokeRepeating("方法名",延时时长,每次调用间隔时长)

 private float delayTime = 5;
    private void Start(){
        Invoke("DelayFunc",delayTime);
        //InvokeRepeating("DelayFunc",delayTime,cdTime);
    }
    private void DelayFunc(){
        print("执行测试函数");
    }

协程

协程本质是迭代器,写法麻烦,但很好用。可以延时固定时间,也可以延时固定帧。
点击这里是一个协程的管理类,支持暂停继续等功能

  private float timer = 0;
    private void Start()
    {
        StartCoroutine("DelayFunc");
        Time.timeScale = 0;
    }
    IEnumerator DelayFunc()
    {
        while ( timer < 30)
        {
            yield return new WaitForSeconds(1);
            timer++;
            print("执行测试函数"+timer);
        }
    }

DoTween

如果你使用UGUI,那么你一定知道DoTween。DoTween是很常用的简单动画插件,但有时候我们能用它来做一些奇怪的操作。比如延时函数 执行后只能通过 seq.Pause();seq.Kill();等自带函数关闭。 Time.timeScale = 0,隐藏物体,禁用脚本,删除物体等情况下,均继续执行方法。

 private void Start()
    {
        seq = DOTween.Sequence();
        seq.AppendInterval(5);
        seq.AppendCallback(DelayFunc);
        seq.SetAutoKill(false);
        seq.SetUpdate(true);//设为true时可在Time.timeScale=0的情况下正常执行

    }
    void DelayFunc()
    {
        print("执行测试函数");
    }

到此这篇关于Unity延时执行的多种方法小结的文章就介绍到这了,更多相关Unity延时执行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • unity实现物体延时出现

    本文实例为大家分享了unity实现物体延时出现的具体代码,供大家参考,具体内容如下 新建一个cube和plane,隐藏cube,脚本挂在plane上. 1. update计时器实现 using System.Collections; using System.Collections.Generic; using UnityEngine; //一个隐藏的物体等待t秒后显示,updata计时器实现 public class activeShow : MonoBehaviour { public Ga

  • Unity封装延时调用定时器

    本文实例为大家分享了Unity封装延时调用定时器的具体代码,供大家参考,具体内容如下 封装一个延时调用定时器类 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class WaitTimeManager { private static TaskBehaviour m_Task; static WaitTimeManage

  • Unity延时执行的多种方法小结

    目录 Update计时器 Invoke 协程 DoTween 最开始接触unity的时候,我做延时都是在update里做计时器.后来才发现,我屮艸芔茻,还有这么多种更方便延时执行的方式.现在我们就来捋一捋. 本文列举的有以下四种,如有错漏,欢迎补充指正 ✨ Update Invoke 协程 DoTween 支持参数传入 ✖️ ✖️ ✔️ ✖️ 下表是在不同情况下各方案的执行状态 ✨ Update Invoke 协程 DoTween Time.timeScale = 0 ✔️ ✖️ ✖️ ✔️ a

  • Android中实现延时执行操作的方法小结

    在Android开发中我们可能会有延时执行某个操作的需求,例如我们启动应用的时候,一开始呈现的是一个引导页面,过了两三秒后,会自动跳转到主界面.这就是一个延时操作. 下面是实现延时执行操作的几种方法: 1.使用线程的休眠实现延时操作 new Thread() { @Override public void run() { super.run(); Thread.sleep(3000);//休眠3秒 /** * 要执行的操作 */ } }.start(); 2.使用TimerTask实现延时操作

  • Unity存储游戏数据的多种方法小结

    目录 1 PlayerPrefs: Unity自带的一种简单的键值存储系统 2 ScriptableObject: Unity中最灵活的数据管理工具 2.1 如何手动创建和修改数据文件 2.2 ScriptableObject优缺点总结 3 JSON: 轻量级的数据交换格式 3.1 序列化与反序列化 3.2 用JsonUtility对对象进行序列化和反序列化 4 XML:一种可扩展标记语言 5 三者特点总结 6 数据库:存储大量数据时使用的一种方法 1.安装SQLite插件 2.创建数据库和表

  • Python定义一个跨越多行的字符串的多种方法小结

    方法一: >>> str1 = '''Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存. (纵有疾风起,人生不言弃.)''' >>> str1 'Le vent se lève, il faut tenter de vivre. \n起风了,唯有努力生存.\n(纵有疾风起,人生不言弃.)' 编辑的时候,引号挺对的,但是不知道为什么发布的时候,第一行的引号总是多了一些,其实应该是下面这样的: 不过感觉这种方法不够纯粹

  • PHP定时执行计划任务的多种方法小结

    PHP定时执行的三种方式实现 1.windows 的计划任务 2.linux的脚本程序 3.让web浏览器定时刷新 具体实现 windows计划任务 PHP很少在win服务器上跑,具体实现也不再深究,看网上实现的原理大概是写bat脚本,然后让window任务添加执行这个bat脚本,具体可以参考:http://www.jb51.net/article/29134.htm linux 的脚本实现 这里主要使用到crontab这个命令, 使用方式 : crontab filecrontab [ -u

  • 使用 C# 下载文件的多种方法小结

    目录 简单下载 异步下载 下载文件的同时向服务器发送自定义请求头 如何解决下载文件不完整的问题 使用 Downloader 进行 HTTP 多线程下载 下载非 HTTP 协议的文件 文件下载是一个软件开发中的常见需求.本文从最简单的下载方式开始步步递进,讲述了文件下载过程中的常见问题并给出了解决方案.并展示了如何使用多线程提升 HTTP 的下载速度以及调用 aria2 实现非 HTTP 协议的文件下载. 简单下载 在 .NET 程序中下载文件最简单的方式就是使用 WebClient 的 Down

  • javaScript 删除字符串空格多种方法小结

    复制代码 代码如下: // 去掉字符串的头空格(左空格) function LTrim(str){ var i; for(i=0;i<str.length; i++) { if(str.charAt(i)!=" ") break; } str = str.substring(i,str.length); return str; } // 去掉字符串的尾空格(右空格) function RTrim(str){ var i; for(i=str.length-1;i>=0;i-

  • PHP缓存技术的多种方法小结

    1.普遍缓存技术: 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得. 用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表. 举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会

  • PHP 获取客户端真实IP地址多种方法小结

    经过复杂的判断与算是的获取IP地址函数 复制代码 代码如下: function getIP() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_X_FORWARDED')) { $ip = getenv('

  • Vue3中10多种组件通讯方法小结

    目录 Props emits expose / ref Non-Props 单个根元素的情况 多个元素的情况 v-model 单值的情况 多个 v-model 绑定 v-model 修饰符 插槽 slot 默认插槽 具名插槽 作用域插槽 provide / inject 总线 bus getCurrentInstance Vuex State Getter Mutation Action Module Pinia 安装 注册 mitt.js 安装 使用 本文讲解 Vue 3.2 组件多种通讯方式

随机推荐