unity怎么跳出协程

unity怎么跳出协程,第1张

Unity中什么时候暂时跳出协程是由我们控制的,但重新进入协程不是由我们控制的,Unity总是在每一帧Update和LateUpdate之间去遍历所有未执行完的协程协程就是由你通过yield return控制执行的函数袭数,你可以通过设置条件在任何时候进出协程,它是普通函数的改良版,它能够不阻塞主线程是通过yield return暂时挂起实现的,和多线程完全不一样,它不具备真正的并行执行能力,它在除了yield return 的其他部分仍然是串行执行每行代码迭代器本身与协程没有任何关系,是协程依赖于迭代器,迭代器通过Current属性能够保存上一次执行到的地方,MoveNext可以继续执行,协程正是利用了这一点来实现可 *** 控的线程执行和切换

Unity中协程的使用

如果你希望把A事情放入协程中执行,那么它往往具有这样的特征

1.保持关注A事情(做一些条件检测)的同时不希望影响到主线程或者其他线程逻辑的正常进行,A事情的逻辑应当是与主线程无关的

2.A事情中包含一些断点(条件),你需要在适合的时候去暂时跳出A或者继续执行A中剩余的事情这个是最简单也是用的比较多的,也就是在协程中等待一段时间执行一件事

这个例子是我的敌人在发现玩家进入巡视范围后头上会出现一个感叹号标识,我希望在动画播放完后自动关闭这个标识,因为之前文章中也提到过动画帧录制只能修改组件而不能修改Active状态,所以无法通过直接在动画的最后一针录制关闭物体。可以考虑通过添加动画事件或者在Update中每帧检测动画状态实现(开销过大,该动画的触发并不是常态),采用协程是一个不错的选择,因为动画的播放与敌人的移动等逻辑是无关的,协程可以很方便的实现在一段时间后重新返回该协程执行完剩余的事。在这个游戏中我的人物是使用鼠标点击移动,使用的是NavMeshAgent,所以对于这种移动来说我不希望人物在移动过程中就纤游无法正常完拍竖首成其他 *** 作,我就把移动放在协程中,并且随时根据其他变化来终止移动。

【协同程序

协同程序——在主程序运行的同时开启另一段逻辑指枝处理,来协同当前程序的执行,开启协同程序就是开启一个线程。

协同程序(棚橘coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。

【开启协同程序】

使用MonoBehavior.StartCoroutine可以开启一个协同程序,所以该方法需要在继承Monobehaviour的类中调用

Unity3D中,使用StartCoroutine(String methodName)和startCoroutine(IEnumerator routine)都可以开启一个线程,

a. 使用字符串作为参数可以开启线程并在线程结束之前终止线程,开启线程最多只能传递一个参数

b. 使用IEnumeraotor开启的的线程不能随时终止(除非使用StopAllCoroutines()方法)

没有参数个数的限制

【终止协同程序】

a. Unity使用StopCoroutine(String methodName)来终止一个协同程序,使用StopAllCoroutine来终止所有协同程序,但是这两个方法都只能终止该MonoBehaviour中的协同程序

b. 将协同程序所在的gameObject的acitve属性设置为false,当再次设置active为true的时候,协同程序不会再开启,而设置enable和false则不会生效,因为协同程序开启后是以一个线程在运行的,它与MonoBehavior是互不干扰的模式在运行,此后除非代码调用,他们共同作用于同一个对象,只有当对唯和敏象不可见的时候才能够同时终止这两个线程。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8282616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存