Unity 协程开启、停止与生命周期
StopAllCoroutines只会停止调用这个接口的脚本实例对象上的所有协程,而非调用这个接口脚本的所有实例对象。
协程被打断
使用Unity的MonoBehavior组件开启一段协同程序非常方便,但是应该注意如果这段程序需要运行一段较长时间,在运行期间,如果开启这段协同程序的组件被删除或SetActive(false) 隐藏了,则协程会被打断,这段程序就不在执行了,因此使用StartCoroutine要注意源组件的生命周期和协程的生命周期。
这种情况(或者有些类不继承自MonoBehaviour),若想要在这些类中使用StartCoroutine,则可以
//空 Mono 类
public class MonoStub : MonoBehaviour
{ }new GameObject().AddComponent<MonoStub>().StartCoroutine("Test1");
不这样的话,在Unity5.6中会报错。
上面是Unity5.6.3P4上测试过,之前在Unity5.2.5上可以使用:
new GameObject().AddComponent<MonoBehaviour>().StartCoroutine("Test1");
例:一个协程在 yield return 后 运行过程中会因为父节点的暂时隐藏而打断协程,就可以单独挂一个独立的空组件来保证协程运行过程不会被中断
// 创建一个继承 MonoBehaviour 的空类private class MonoStub:MonoBehaviour {}private GameObject monoStub;private IEnumerator routineLoadItems;// 注意GCprivate void OnDestroy(){StopCoroutine(routineLoadItems);Destroy(monoStub);}public void SetData(List value){this.transform.RemoveChildren();if (this.gameObject.activeSelf){//StartCoroutine(LoadItemList(value));monoStub = new GameObject();routineLoadItems = LoadItemList(value);monoStub.AddComponent<MonoStub>().StartCoroutine(routineLoadItems);}}
//程序在下一帧中从当前位置继续执行
yield return 0;//程序在下一帧中从当前位置继续执行
yield return null;//程序等待N秒后从当前位置继续执行
yield return new WaitForSeconds(N);//在所有的渲染以及GUI程序执行完成后从当前位置继续执行
yield new WaitForEndOfFrame();//所有脚本中的FixedUpdate()函数都被执行后从当前位置继续执行
yield new WaitForFixedUpdate();//等待一个网络请求完成后从当前位置继续执行
yield return WWW;//等待一个xxx的协程执行完成后从当前位置继续执行
yield return StartCoroutine(xxx);//如果使用yield break语句,将会导致协程的执行条件不被满足,不会从当前的位置继续执行程序,而是直接从当前位置跳出函数体,回到函数的根部
yield break;
协程开启与停止的对应方法:
注意点:
1、StopCoroutine(方法名字符串or方法名引用);
注意:如果启动(StartCoroutine)用的是方法名引用,结束(StopCoroutine)也必须用方法名引用,否则结束不了。
2、StopAllCoroutine(),只能结束它所在脚本的所有协程,对其它脚本里的协程不起作用。
3、IEnumerator类型的函数,不能带ref或out类型参数。
using UnityEngine;
using System.Collections;public class Test : MonoBehaviour
{//声明一个协程public IEnumerator Count(int i){while (true){i++;Debug.Log(i);yield return null;}}//开启协程的方式1void Start1(){StartCoroutine("Count", 0);}//停止协程的方式1void Stop1(){StopCoroutine("Count");}//开启协程的方式2IEnumerator routine;void Start2(){routine = Count(0);StartCoroutine(routine);}//停止协程的方式2void Stop2(){StopCoroutine(coroutine);}//开启协程的方式3Coroutine coroutine;void Start3(){coroutine = StartCoroutine(Count(0));}//停止协程的方式3void Stop3(){StopCoroutine(coroutine);}void Start(){Start3();}void Update(){if (Input.GetKeyDown("space")){Stop3();}}}
Unity协程StartCoroutine/StopCoroutine_Unity李大馋师的博客-CSDN博客
Unity 协程开启、停止与生命周期相关推荐
- 《学Unity的猫》——第九章:状态机与Unity协程,好奇猫与铁皮怪水管
文章目录 9.1 会吐水的铁皮怪 9.2 状态机是什么 9.3 使用协程实现状态机 9.4 进程与线程 9.4.1 什么是进程 9.4.2 什么是线程 9.5 Unity的协程 9.5.1 Unity ...
- unity 协程特点
协程 一. Unity中使用协程 1. 什么是协程 2. 如何使用 3. 协程的应用场景 创建补间动画 打字机效果 异步加载资源 4. 注意事项 二. Unity协程的底层原理 1. 协程本体:C#的 ...
- 【Unity】Unity协程(Coroutine)的原理与应用
文章目录 前言 一.什么是协程 二.应用场景 1.异步加载资源 2.将一个复杂程序分帧执行 3.定时器 三.协程的使用 注意事项 四.Unity协程的底层原理 1. 协程本体:C#的迭代器函数 2. ...
- unity如何解决协程开启频繁导致的程序卡顿
unity如何解决协程开启频繁导致的程序卡顿 一.协程 协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中.当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一 ...
- Unity协程深入及实现
Unity协程深入 文章目录 Unity协程深入 Unity协程简介 Unity协程的用法 协程的原理 协程的缺陷 自己实现协程 参考 Unity协程简介 Unity中的协程能够允许我们将一个任务分散 ...
- Unity 协程探究
一.官方手册中的描述 1.Manual/Coroutines 函数在调用时, "从调用到返回" 都发生在一帧之内,想要处理 "随时间推移进行的事务", 相比Up ...
- Unity协程简述(简单用法,简易分析)
Unity协程 协程的简单用法 简述 函数 协程的执行顺序 协程替我们做了什么 Yleid Return 如何进行跳帧,延迟,等待的操作 从IL的角度分析 IL语言 总结 自定义一个迭代器 优化 最后 ...
- Unity 协程(Coroutine)原理与用法详解
前言: 协程在Unity中是一个很重要的概念,我们知道,在使用Unity进行游戏开发时,一般(注意是一般)不考虑多线程,那么如何处理一些在主任务之外的需求呢,Unity给我们提供了协程这种方式 为啥在 ...
- Unity协程实现分析以及Lua协程与Unity协程的混合使用
1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...
最新文章
- 一年融4轮,虎赞科技完成红杉领投3000万美元B轮融资
- python中处理日期和时间的标准模块是-Python时间相关处理
- dbscan算法_DBSCAN聚类算法探索
- ArcGIS怎样获取重分类后各类所占的像元个数
- PHP之MVC项目实战(二)
- oracle数据库报错1033,Oracle联机日志出现错误ORA-16038 ORA-19809 ORA-00312 解决
- unity调用php,unity访问php
- 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员……
- 使用Sqlite数据库存储数据
- 使Window注册表更改立刻生效的命令行命令
- logback 简介
- 数据清洗案例 OpenRefine入门
- 【转下载】黑莓7290中文说明书
- CSDN博客去广告-谷歌插件
- springboot项目配置视图解析器无效的问题
- Android6.0风格图标,jQuery仿Android样式扁平风格图标插件
- Server_虚拟机闲谈;
- STM32配置DAC输出固定电压和方波
- 一个软硬件牛人的学习经历---给同是换行的人以共勉
- OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
热门文章
- linux监测本机udp发动情况,Linux 下 TCP/UDP 端口测试及验证方法说明
- java作业练习4:KFC前台订餐系统(版本1)
- c语言调用graphviz_graphviz使用
- vue如何sleep_H5如何保持屏幕常亮—nosleep.js
- 锐捷网络与科大讯飞战略签约 强强联手助力智慧教育
- pyspider爬虫学习-教程2-AJAX-and-more-HTTP.md
- Android翻页入门
- asp.net983-宠物领养系统的设计与实现#毕业设计
- 【视频】视频播放(包含视频录制)的测试点总结
- Java基本类型和包装类型总结