首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Unity - WaitForSeconds在更新或循环中不工作

是一个常见的问题,通常是由于误解或错误使用导致的。下面是一个完善且全面的答案:

Unity - WaitForSeconds是Unity引擎中的一个协程工具,用于在协程中暂停一段时间。它的工作原理是通过在协程中等待指定的时间间隔来实现暂停功能。然而,在更新或循环中使用WaitForSeconds时,它可能不会按预期工作。

这个问题通常是由于误解协程和更新循环之间的关系导致的。在Unity中,更新循环是引擎每帧执行的过程,用于更新游戏对象的状态和执行其他逻辑。协程是一种特殊的函数,可以在更新循环之外执行,并且可以在需要时暂停和恢复执行。

当在更新或循环中使用WaitForSeconds时,它实际上是在更新循环中执行的,而不是在协程中执行。这意味着它将阻塞更新循环,并且不会按预期暂停协程的执行。因此,如果在更新或循环中使用WaitForSeconds,它将不起作用。

为了解决这个问题,可以考虑以下几种方法:

  1. 使用协程:将需要暂停的逻辑放在一个协程中,并使用yield return new WaitForSeconds来实现暂停。确保协程在需要的时候被启动,并且不要在更新或循环中使用WaitForSeconds。
  2. 使用计时器:使用计时器来跟踪经过的时间,并在达到指定时间间隔时执行相应的逻辑。可以使用Time.deltaTime来获取每帧的时间间隔,并累加到计时器中。当计时器达到指定时间时,执行相应的逻辑。
  3. 使用Unity提供的其他工具:Unity提供了许多其他工具和方法来处理时间和延迟,例如Invoke、InvokeRepeating、Coroutine等。根据具体的需求,选择适合的工具来实现暂停和延迟功能。

总结起来,Unity - WaitForSeconds在更新或循环中不工作是因为它是在更新循环中执行的,而不是在协程中执行。为了解决这个问题,可以使用协程、计时器或其他Unity提供的工具来实现暂停和延迟功能。具体的实现方式取决于具体的需求和场景。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云游戏多媒体解决方案:https://cloud.tencent.com/solution/gaming
  • 腾讯云音视频处理服务:https://cloud.tencent.com/product/mps
  • 腾讯云人工智能服务:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发服务:https://cloud.tencent.com/product/mobdev
  • 腾讯云对象存储服务:https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙解决方案:https://cloud.tencent.com/solution/metaverse

请注意,以上链接仅供参考,具体的产品选择应根据实际需求和情况进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Coroutine,你究竟干了什么?(小续)

Unity自建的WaitForSeconds类似,另外的,如果我们进一步考虑WaitForFixedUpdate和WaitForEndOfFrame这类的YieldInstruction,我们是否也可以自己实现...,就是在其延时结束之后调用MoveNext(),而像WaitForFixedUpdate,便是每次FixedUpdate之后才调用MoveNext(),另外的WaitForEndOfFrame,则是每帧结束之前调用对应的...目前想到的一种方法便是创建几种不同类型的CoroutineManager,譬如WaitForSecondsCoroutineManager、WaitForFixedUpdateCoroutineManager等等,用于不同更新时刻处理其中的...("Inner Unity coroutine end at time : " + Time.time); }   那么“外层”的UnityCoroutine只有“内层”的InnerUnityCoroutine...实际上还是特殊类型判断上做文章!Unity中,每次调用StartCoroutine都会返回一个特殊的Coroutine类型,而这个类型便是我们实现嵌套Coroutine的突破口!

69120

Coroutine,你究竟干了什么?

JS(着说UnityScript)的话稍稍自由散漫了些,不太符合我们这些略显严谨的程序猿;相比之下,C#各方面都十分沁人心腑,使用起来还是相当舒畅的 :)   就游戏开发而言,Unity也确实为我们减轻了不少开发负担...、缩短了很多开发流程,但从开发原理上来讲,使用Unity你仍然避不开许多传统的开发技术,譬如几乎所有游戏程序都有的Update,Unity里就变成了MonoBehaviour的一个成员方法;而另一个几乎与...Update并重的Init方法,Unity里则被换成了Start。...,譬如在cocos2d-x中,CCDelayTime就是专门用来干这个的,当然,其他引擎也有自己不同的支持方式,但是从实现层面来讲,基本都是“标记开始时间,Update中持续更新检查”这种方法,从代码上来看...三 Coroutine原来如此 :)   看来答案应该是WaitForSeconds这个类型身上了~经过简单的一些搜索,我找到了这么一篇帖子,内容便是如何自己实现一个简单的WaitForSeconds

1K10

“疑难杂症”又二记

引子 近来工作又遇到一些“疑难杂症”,在此简单记下,自省省人 ~ 1....();   Hotween.To(...);   大部分情况下,上面的代码都运行的很好,但是极少数的情况下(真机测试下情况尤甚),会出现动画(tween)出错的情况,而且极难重现...惹的祸 :)   自己大概学习过一些Hotween的实现源码,原理上来说还是挺传统的,大概就是通过一个Update来不断更新由Hotween.To或者From等API产生的ABSTweenComponent...(Hotween中的Tweener,Sequence都继承于他),当然个中细节很多,在此就不一一赘述了,值得一提的就是Hotween时间相关的逻辑上大抵都仰仗于Unity中的Time,也就是说,如果拿上面的代码举例...duration时间,但实际上相对Hotween而言,duration时间还没有到(感觉颇有些相对论的味道 :)),动画仍然会在yield之后继续运行,这与你代码的逻辑假设是相悖的,自然就会出现那的奇怪问题

26330

Unity应用架构设计(10)——绕不开的协程和多线程(Part 1)

进入本章主题之前,我们必须要了解客户端应用程序都是单线程模型,即只有一个主线程(Main Thread),或者叫做UI线程,即所有的UI控件的创建和操作都是主线程上完成的。...这是个好问题,从设备的硬件上,这已不是瓶颈: 学过操作系统的同学肯定知道CPU是真正的处理大脑,单核的CPU年代,某一时刻CPU只能处理一个线程,通过CPU的调度来实现在不同线程间切换工作。...协程的内部原理 回到本文的主题,对于Unity应用程序而言,还提供了另外一种『异步方式』:Coroutine。...要解惑yield这是第二个阶段:能知道枚举器是怎样工作的。 如果你很清楚上诉两个阶段的内部原理之后,要理解Unity中的Coroutine是非常简单的,你会了解为什么它是伪的“多线程”。...本章内容对多线程开了个头,我将在下篇文章中说说怎样Unity中使用和管理多线程。 源代码托管Github上,点击此了解

1.4K60

Unity应用架构设计(10)——绕不开的协程和多线程(Part 2)

对于Unity而言,又提供了另外一种『异步』的概念,就是协程(Coroutine),通过反编译,它本质上还是主线程上的优化手段,并不属于真正的多线程(Thread)。...那么问题来了,怎样Unity中使用多线程呢?...UI上 Unity中有这么个方法可以轮询是不是有任务要更新,那就是Update方法,每一帧会执行 所以自定义的UnityDispatcher提供一个BeginInvoke方法,并接送一个Action...由于篇幅有限,我贴完整代码了,只分析其中最核心思路: Thread中有一个WaitFor方法,它每一帧都会询问异步任务是否完成: public bool Update(){ if(_isDown...(150, 2); } 小结 这两篇文章为大家介绍了怎样Unity中使用协程和多线程,多线程其实不难,但同步数据是最麻烦的。

1.8K110

Unity之协程

话不多说先来个代码给个初印象: 一、开启协程: 我Unity下创建了一个Cube(随便什么物体都行),然后把我的cs文件挂载上去。...IEnumerator Test() { Debug.Log(System.DateTime.Now+" hello"); yield return new WaitForSeconds...(0f); Debug.Log(Time.time+" world"); } Unity的Console面板上点击显示时间戳: ,(为什么不用之前的函数了,因为那个函数显示的时间不够精确...因为yield return是等待下一帧执行,而这里又等待了0s,所以我们从第一帧到下一帧开始用了0.02s,这也是默认的Unity每帧更新的时间:0.02s。...; } } 当然了,如果在程序中开始的协程是字符串形式,那么结束也应该是字符串形式: 有些注意事项: 1.多个协程可以同时运行,它们会根据各自的启动顺序来更新

52040

随便再聊一点点Coroutine(确实只是一点点~)

之前写过一点Coroutine相关的东西(这里和这里),大致讲了些自己关于Unity协程的理解,自己在平日的工作中也确实用到了不少相关的知识,遂而引发了一个比较细节或者说微妙(subtle)的思考:...结果很容易验证,正确的答案应该是前者,即”Before, End, After”,这种结果我一度认为可能是Unity本身StartCoroutine的实现问题,感觉上即便StartCoroutine中的协程是延迟执行的...才发现这种立即执行协程的实现方式其实是经过考虑的,因为只有这种方式才能准确的实现协程逻辑:   考虑以下代码: IEnumerator TestCoroutineV2() { yield return new WaitForSeconds...TestCoroutineV3(float leftTime) { while (leftTime > 0) { // some logic here yield return new WaitForSeconds...(1); // 1 leftTime -= 1; // 2 } }   如果1处是延迟执行的,那么每一遍循环,逻辑2处就有大约一帧的延迟,如果leftTime有60秒的话,实际的倒计时可能要花60

36710

Unity中巧用协程和游戏对象的生命周期处理游戏重启的问题

来验证一下上面的说法: 1、如果真的是一帧执行一次,那我就设定Unity的帧率为1(即1秒只执行一次Update); 2、Start()函数之后,启动一个协程,里面跑一个死循环 while (true...Unity内置了一些yield指令(YieldInstruction): -)WaitForSeconds   等待指定的游戏时间(游戏流逝时间可用Time.scale调整) -)WaitForSecondsRealtime...既然是热更新,游戏重启我们肯定希望像安卓那样暴力: 1、先杀掉进程; 2、再重启启动进程; 不是不可以,只是iOS环境下这个方案就行不通了。那怎么办呢?...,然后Start函数中执行:销毁 –> 间隔一段时间(用上面的yield return null或者Unity提供的延时处理指令) –> 初始化 –> 销毁 new出来的GameObject对象。...Coroutine 使用筆記 [2] 对Unity中Coroutines的理解 [3] Unity 协程运行时的监控和优化

3K20

【学习笔记】Unity3D官方游戏教程:Tanks Tutorial

【学习笔记】Unity3D官方游戏教程:Tanks Tutorial 2017-08-03 by Liuqingwen | Tags: Unity3D | Hits ?...一、前言 总结就没有进步,写代码就不能理解,不理解那么知识就不属于你啊!...yield return new WaitForSeconds(3f); } 5. 局部坐标系和摄像机宽高比、屏幕宽高比 这是我从 Tanks 这个游戏中学到的最有用的知识点之一!...非常重要的知识点,也花费了我不少时间,我在上一篇博客中就关于 Unity 中的坐标体系做了一个小小的总结,大家有兴趣的可以去看看:理解Unity3D中的四种坐标体系。 ?...有时候游戏中我们的摄像机并不是直接作为最上层的物体出现在场景中,想象一下这个场景,我们的摄像机旋转的情况下,把摄像机置于一个空物体 parentObject 中作为子物体,那么只要这个父物体旋转了,

1.2K50

一、事件函数的执行顺序(脚本的生命周期)

事件函数的执行顺序 运行unity脚本会按照预定顺序执行大量事件函数。 脚本的生命周期概述 上图概括了unity如何在脚本的生命周期内对事件函数进行排序以及重复执行这些事件函数。...动画更新循环 Unity 评估动画系统时,将调用以下函数和 Profiler 标记。...这些函数具有 Profiler 标记,因此您可以使用 Profiler 查看 Unity 帧中调用这些函数的时间。知道 Unity 调用这些函数的时间有助于准确了解所调用的事件函数的具体执行时间。...WriteTransforms:将所有动画变换从工作线程写入场景。...yield WaitForSeconds 在为帧调用所有 Update 函数后,指定的时间延迟后继续协程 yield WaitForFixedUpdate 在所有脚本上调用所有 FixedUpdate

2.3K10

Unity3d热更新(二):资源打包As

2.Assets目录下创建Scenes文件夹,创建场景scene1.unity。 3.新建ExportAssetBundles.cs,保存在Assets/Editor目录下。...5.运行ExportScene,弹出保存对话框,命名为scene1.unity3d。 小提示 1.AssetBundle的保存后缀名可以是assetbundle或者unity3d。...2.BuildAssetBundle要根据不同的平台单独打包,BuildTarget参数指定平台,如果指定,默认的webplayer。...Instantiate(bundle.Load("Cube"));               bundle.Unload(false);               yield return new WaitForSeconds...否则,只能是各个对象加载成功后,再通过程序手动添加进来,比较繁琐。实际项目中,由于是团队开发,对象间的依赖关系通常会比较凌乱,最好在开发周期就定好相关的规范约束,方便管理。

86650

unity协程简介

Unity中,一般的方法都是顺序执行的,一般的方法也都是一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。...当我们调用一个方法想要让一个物体缓慢消失时,除了Update中执行相关操作外,Unity还提供了更加便利的方法,这便是协程。...第一种方法的优势在于可以调用多个参数的方法,后一种方法只能调用不含参数只包含一个参数的协程方法。...yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale...Unity调用StartCoroutine()后不会等待协程中的内容返回,会立即执行后续代码。 虽然协程十分方便和灵活,但不当的使用会使程序产生无法预想的后果,请使用前慎重考虑。

79220

unity官方案例精讲(第三章)--星际航行游戏Space Shooter

(2)添加Rigidbody组件:用途是通过脚本来为飞船添加作用力,此外希望飞船受重力影响而下坠,取消Use Gravity选项。...Don't clear:此模式不清除颜色深度缓冲区. 结果是,每个帧都会在下一帧上绘制,从而产生涂抹效果。...某些系统中,屏幕可以包含前一帧图像、实心黑屏幕随机彩色像素 )  3、添加背景图片 (1)创建一个Quad面片,重命名为background,移除Mesh Collider组件,Assets/Textures...,unity中提供协程类WaitForSeconds可以实现这样的功能 (4)再添加一个变量spawnWait,使用协程方法,修改函数。...OnTriggerEnter中添加分值更新语句 //增加分数 gameController.AddScore(scoreValue); (6)函数start中初始化变gameController,我们不能直接得到

3K30

Unity3D网络通讯(五)--Socket通讯之Udp通讯

前言 上一篇《Unity3D网络通讯(四)--Socket通讯之Tcp通讯》我们把Tcp的通讯已经说完了,这篇主要说说Udp的通讯,相对于Tcp通讯,个人觉得Udp通讯要简单的很多,UDP协议传送数据时...,由于UDP的面向无连接性,不能保证数据的完整性,因此传输重要数据时建议使用UDP协议。...微卡智享 后台服务端就不说了,还是用的那个Socket的测试工具,我们直接看Unity中怎么实现。 ? 视窗中增加一个UDP的按钮,然后Network文件夹下增加一个SocketUdp的脚本。...发送数据也比较简单,将传入的字符串转为byte[]后直接用Send即可,最后一个参数就是我们初始化中已经创建好的服务器的IPEndPoint。...{ _udpClient.BeginReceive(UdpDataReceived, action); yield return new WaitForSeconds

3.4K21
领券