Unity3D--协程使用详解
1. 简介
unity的协程(Coroutine)是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余的部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数。
函数体全部执行完成,协程结束,由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。
协程不是进程,也不是线程,它就是一个特殊的函数——可以在某个地方挂起,并且可以重新在挂起处继续运行。
协程方法与普通方法的区别:
普通方法
被调用时,原来执行的部分保留现场,停止执行,然后去执行要调用的方法,并且,被调用的方法执行完之后才能返回到调用前的状态接着往下执行。
协同方法
执行不用等协同方法执行完再执行调用之前原来方法的代码,而是两者异步执行。
协程不是多线程,它与主线程同时运行,它在主线程运行的同时开启另一段逻辑处理。
类似一个子线程单独出来处理一些问题,性能开销较小。
Unity的协程会在每帧结束之后去检测yield的条件是否满足,满足则执行yield return之后的代码。
在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程,而其他协程处于休眠状态。
协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component。
性能:
在性能上相比于一般函数没有更多的开销
协程的好处:
让原来要使用异步 + 回调方式写的非人类代码, 可以用看似同步的方式写出来。
能够分步做一个比较耗时的事情,如果需要大量的计算,将计算放到一个随时间进行的协程来处理,能分散计算压力
协程的坏处:
协程本质是迭代器,且是基于unity生命周期的,大量开启协程会引起gc
如果同时激活的协程较多,就可能会出现多个高开销的协程挤在同一帧执行导致的卡帧
协程是在什么地方执行?
协程不是线程,不是异步执行;协程和monobehaviour的update函数一样也是在主线程中执行
unity在每一帧都会处理对象上的协程,也就是说,协程跟update一样都是unity每帧会去处理的函数。经过测试,协程至少是每帧的lateUpdate后运行的。
前驱知识:
- 设计模式——迭代器模式
- C#中的IEnumerator、IEnumerable接口
2. 协程的实现
协程的实现需要在Unity中继承MonoBehaviour并使用C#的迭代器IEnumrator,格式如下所示:
IEnumrator 函数名(形参表) //最多只能有一个形参
{ yield return xxx; //恢复执行条件//方法体
}
在IEnumerator类型的方法中写入需要执行的操作,遇到yield后会暂时挂起,等到yield return后的条件满足才继续执行yield语句后面的内容。
3. 协程的开启与中止
3.1 协程的开启
开启协程需要使用StartCoroutine()方法:
开启无参数的协程:
StartCoroutine(协程名());或StartCoroutine("协程名");
开启单参数的协程:
StartCoroutine(协程名(参数));或StartCoroutine("协程名",参数);
开启多参数的协程:
StartCoroutine(协程名(参数1,......));
或
void StartCoroutine()//开启协程的函数
{IEnumerator coroutine = Test(5, 6);StartCoroutine(coroutine);
}public IEnumerator Test(int a, int b)//协程{//等待帧画面渲染结束yield return new WaitForEndOfFrame();a=2;b=3;
}
3.2 协程的结束
当协程的方法体执行完毕将会自动结束
调用StopCoroutine();方法中止协程执行
中止协程的几种情况:
中止所有协程:
StopAllCoroutines();
使用对象实例中止指定协程
Coroutine c; void Start() {c = StartCoroutine(CountSeconds()); } void Update() {if (Input.GetKeyDown(KeyCode.J)){StopCoroutine(c);} }
使用字符串中止指定协程
只有以协程名字符串启动的协程可以用此方法中止
既:StartCoroutine(“协程名”);或StartCoroutine(“协程名”,参数);允许使用**StopCoroutine(“协程名”);**中止协程
不允许使用直接调用协程方法的方式中止指定协程
既:**StopCoroutine(协程名([参数]));**不被允许
4. yield 协程回复条件语句
快查表:
yield语句 | 功能 |
yield return null; | 下一帧再执行后续代码 |
yield return 0; | 下一帧再执行后续代码 |
yield return 6;(任意数字) | 下一帧再执行后续代码 |
yield break; | 直接结束该协程的后续操作 |
yield return asyncOperation; | 等异步操作结束后再执行后续代码 |
yield return StartCoroution(其它协程); | 调用执行其它协程后再执行后续代码 |
yield return WWW(); | 等待WWW操作完成后再执行后续代码 |
yield return new WaitForEndOfFrame(); | 等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行 |
yield return new WaitForSeconds(0.3f); | 等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响); |
yield return new WaitForSecondsRealtime(0.3f); | 等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响); |
yield return WaitForFixedUpdate(); | 等待下一次FixedUpdate开始时再执行后续代码 |
yield return new WaitUntil() | 将协同执行直到当输入的参数(或者委托)为true的时候 |
yield return new WaitWhile() | 将协同执行直到 当输入的参数(或者委托)为false的时候 |
生命周期图:
转载:卖烤麸烤饼儿的博客_CSDN博客-一些尝试,Unity基础,C#领域博主卖烤麸烤饼儿擅长一些尝试,Unity基础,C#,等方面的知识,卖烤麸烤饼儿关注c#,unity,游戏程序,.net,游戏策划领域.https://blog.csdn.net/qq_44705559
Unity3D--协程使用详解相关推荐
- python协程库_python中协程的详解(附示例)
本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...
- Android kotlin实战之协程suspend详解与使用
前言 Kotlin 是一门仅在标准库中提供最基本底层 API 以便各种其他库能够利用协程的语言.与许多其他具有类似功能的语言不同,async 与 await 在 Kotlin 中并不是关键字,甚至都不 ...
- go 协程(Goroutine)详解
什么是协程 一种比线程更加轻量级的存在.正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程,协程的切换和创建完全是用户决定的. 进程.线程.协程对比 线程和进程是完全由操作系统的分配的,对操 ...
- 【笔记】spring的注解回顾,springboot-restful项目结构介绍 springboot-freemarker ⼯程配置详解
注解 学Spring boot有一阵子了,总结一下它的注解. @Controller :修饰class,⽤来创建处理http请求的对象 @RestController :Spring4之后加⼊的注解, ...
- [Unity3D]-协程的介绍和使用
本文是个人对Unity协程的一些理解和总结.Unity协程长的有点像线程,但却不是线程.因为协程仍然是在主线程中执行,且在使用时不用考虑同步与锁的问题.协程只是控制代码等到特定的时机后再执行后续步骤. ...
- Unity3D协程(转)
这篇文章转自:http://blog.csdn.net/huang9012/article/details/38492937 协程介绍 在Unity中,协程(Coroutines)的形式是我最喜欢的功 ...
- Unity3d 协程、调用函数、委托
为什么80%的码农都做不了架构师?>>> (一)协程 开启方法:StartCoroutine("函数名"): 结束方法StopCoroutine(" ...
- unity3D协程(Coroutine)原理深入剖析
原文:http://www.tuicool.com/articles/3IV32m Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:h ...
- Unity3D 协程 浅谈
理解:协程不是线程,也不是异步执行(知道就行). 1.协程和MonoBehaviour的Update函数一样,也是在MainThread中执行的(一定得明白这句话意思). 1 2 3 4 5 6 7 ...
- Unity3D 协程
简介 什么是协程? unity协程是一个能够暂停协程执行,暂停后立即返回主函数,执行主函数剩余的部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数.函数体全部执行完成, ...
最新文章
- 一文概述 2018 年深度学习 NLP 十大创新思路
- jmgraph前端画图组件(html5版)
- C++用顶层函数重载操作符
- redis、memcache、mongoDB 对比
- java excel自动保存_比POI好用的EasyExcel简单使用记录
- java+map申明_Java中两种HashMap申明方式区别?
- android使用Dialog实现复选功能与数据库结合综合实例
- Java为什么不允许覆盖静态方法?
- 人脸对齐(十三)--3DDFA
- winform 右下角弹出小窗口
- Java集合框架讲解【泛型、Collection接口、Map接口、以及子接口和实现类、集合的遍历形式等】
- 3.1 数值分析: 迭代法的基本思想
- Win10 安装 Rational Rose
- python 档案管理系统_用Python编写人才档案管理系统?
- iOS 获取设备UDID
- 【MySQL】MySQL安装图解
- R语言|导入excel数据
- WebStorm设置px转换rem,亲测有效!
- 商标注册的费用是多少钱
- 1185_SPC560B60L7_ADC0标准通道的Injected转换模式
热门文章
- 浙大远程计算机应用基础考试,浙大远程计算机应用基础(A)作业5(含答案).doc
- 《电路分析基础》第7章 正弦稳态电路 读书笔记
- 汽车水泵垫片行业调研报告 - 市场现状分析与发展前景预测
- van访谈_ElectricSheepCompany访谈
- 制作自定义光盘nLite
- java中与时间有关的转换和校验
- CTF入门指南 | 内附教程分享
- win10安装过程修改esp分区吗_ghost版Win10系统的安装教程
- 2020最新面试题(含答案)
- Mac菜鸟操作入门(一)-与Windows比较之常用操作