Unity 协程用法总结

协程:协同程序,在主程序运行的同时,开启另外一段逻辑处理,来协同当前程序的执行,注意协程不是线程,只是具有线程特点的“伪协程”。
协程的使用需要直接或间接的继承MonoBehavior。

协程的执行原理

协程函数的返回值必须是IEnumerator,它是一个迭代器,可以把它当成执行一个序列的某个节点的指针,它提供了两个重要的接口,分别是Current(返回当前指向的元素)和MoveNext(将指针向后移动一个单位,如果移动成功,则返回true)。

yield关键词用来声明序列中的下一个值或是一个无意义的值,如果使用yield return x(x是指一个具体的对象或数值),那么MoveNext返回为true并且Current被赋值为x,如果使用yield break使得MoveNext()返回为false。

如果MoveNext函数返回为true意味着协程的执行条件被满足,则能够从当前的位置继续往下执行。否则不能从当前位置继续往下执行。

协同方法与普通方法的区别:

普通方法被调用时,原来执行的部分保留现场,停止执行,然后去执行要调用的方法,等待被调用的方法执行完之后才继续执行调用前的方法。
协同方法的执行是不用等协同方法执行完再执行调用之前原来方法的代码,即协程可暂停,两者异步执行。

开启协程的两种方式

1、StartCoroutine(string methodName) //参数为方法名字符串
2、StartCoroutine(IEnumerator method) //参数是方法名,方法中可包含多个参数

终止协程的两种方式:

StopCoroutine(string methodName) //只能终止以字符串形式启动的协程
StopAllCoroutine() //终止所有协程

协程的返回值

协程必须有有返回值,且返回值类型为IEnumrator。返回值语句为yield retuen 表达式或值 或 yield break。
yield:挂起,程序遇到yield关键字时会被挂起,暂停执行,等待条件满足时从当前位置继续执行
yield return 0 or yield return null: 程序在下一帧中从当前位置继续执行
yield return 1,2,3,…: 程序等待1,2,3…帧之后从当前位置继续执行
yield return new WaitForSeconds(float n): 程序等待n秒后从当前位置继续执行
yield return WWW: 等待一个网络请求完成后从当前位置继续执行
yield return StartCoroutine(): 等待一个协程执行完成后从当前位置继续执行
yield new WaitForEndOfFrame(): 在所有的渲染以及GUI程序执行完成后从当前位置继续执行
yield new WaitForFixedUpdate(): 所有脚本中的FixedUpdate()函数都被执行后从当前位置继续执行
yield break:协程执行条件不满足,即不会从当前的位置继续执行协程,将回到函数继续执行。

协程的一些注意地方:

  1. 多个协程可以同时运行,它们会根据各自的启动顺序来更新;
  2. 协程可以嵌套任意多层;
  3. 如果你想让多个脚本访问一个协程,那么你可以定义静态的协程;
  4. 如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们;
  5. IEnumerator类型的方法不能带ref或者out型的参数,但可以带被传递的引用;
  6. 目前在Unity中不能检测作用于对象的协程数量以及具体是哪些协程作用在对象上。

协程简单实例

  1. 运动到某一位置
    对于下面这个简单脚本组件,我们可以在Inspector面板中给targetPosition和moveSpeed变量赋值,程序运行的时候,该对象就会在协程的作用下,以我们给定的速度运动到给定的位置。
usingUnityEngine;
Using System.Collections;  Public class MoveExample : MonoBehaviour
{  public Vector3 targetPosition;  public float moveSpeed;  Void Start()  {  StartCoroutine(MoveToPosition(targetPosition));  }  IEnumerator MoveToPosition(Vector3 target)  {  while(transform.position != target)  {  transform.position = Vector3.MoveTowards(transform.position, target, moveSpeed * Time.deltaTime);  Yield return 0;  }  }
}
  1. 按指定路径前进
    我们可以让运动到某一位置的程序做更多,不仅仅是一个指定位置,我们还可以通过数组来给它赋值更多的位置,通过MoveToPosition() ,我们可以让它在这些点之间持续运动。
Using UnityEngine;
Using System.Collections;  Public class MoveExample : MonoBehaviour
{  public Vector3[] path;  public float moveSpeed;  Void Start()  {  StartCoroutine(MoveOnPath(true));  }  IEnumerator MoveOnPath(bool loop)  {  do  {  foreach(var point in path)  Yield return StartCoroutine(MoveToPosition(point));  }  while(loop);  }  IEnumerator MoveToPosition(Vector3 target)  {  while(transform.position != target)  {  transform.position = Vector3.MoveTowards(transform.position, target, moveSpeed * Time.deltaTime);  Yield return 0;  }  }
}

Unity 协程用法总结相关推荐

  1. Unity协程简述(简单用法,简易分析)

    Unity协程 协程的简单用法 简述 函数 协程的执行顺序 协程替我们做了什么 Yleid Return 如何进行跳帧,延迟,等待的操作 从IL的角度分析 IL语言 总结 自定义一个迭代器 优化 最后 ...

  2. unity 协程特点

    协程 一. Unity中使用协程 1. 什么是协程 2. 如何使用 3. 协程的应用场景 创建补间动画 打字机效果 异步加载资源 4. 注意事项 二. Unity协程的底层原理 1. 协程本体:C#的 ...

  3. Unity协程深入及实现

    Unity协程深入 文章目录 Unity协程深入 Unity协程简介 Unity协程的用法 协程的原理 协程的缺陷 自己实现协程 参考 Unity协程简介 Unity中的协程能够允许我们将一个任务分散 ...

  4. 【Unity】Unity协程(Coroutine)的原理与应用

    文章目录 前言 一.什么是协程 二.应用场景 1.异步加载资源 2.将一个复杂程序分帧执行 3.定时器 三.协程的使用 注意事项 四.Unity协程的底层原理 1. 协程本体:C#的迭代器函数 2. ...

  5. Unity 协程Coroutine综合测试

    Unity 协程Coroutine综合测试 1 using UnityEngine; 2 using System.Collections; 3 using System.Text; 4 5 publ ...

  6. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

  7. Unity 协程深入解析与原理

    先来直接放一段代码 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 p ...

  8. Unity协程实现分析以及Lua协程与Unity协程的混合使用

    1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...

  9. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网 ...

最新文章

  1. 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析
  2. 第十六届智能车竞赛比赛进行中 - 参赛队员提出的问题
  3. Python之seaborn:利用seaborn的color_palette()函数改变绘图界面风格
  4. 剑指Offer - 面试题47. 礼物的最大价值(动态规划)
  5. Java实现Spark-Redis,Spark 之 Redis on spark java.io.NotSerializableException
  6. 又一次Java线程卡死的调试经历
  7. Linux下Kafka单机安装配置
  8. jieba分词怎么操作_常用分词工具使用教程
  9. 查看windows系统信息
  10. 知其所以然技术论坛VC++资源下载
  11. python批量查询(excel)数据
  12. linux系统下使用gcc编译C++程序出现XXX未定义的引用的处理
  13. BI工具和报表工具有什么不同
  14. 电脑安装哪款linux系统好,四款linux操作系统总有一款适合你
  15. 用R语言画相关性矩阵,带P值和*号
  16. 谢绝枯燥快乐编程,四大游戏编程网站,让你边玩游戏,边学Python
  17. 《流浪地球》中的逃生气囊球和马斯克有什么关系?
  18. 用 Python 爬取电影,这些电影真的很不错
  19. ACE学习笔记(4)——第三个例子:任务和反应堆
  20. 凡客和PPG都是半斤八两

热门文章

  1. LaTex数学公式中常用的符号及标记
  2. macOS下malware移除之anysearch劫持(Remove hijacking of anysearch)
  3. 什么是SOA架构?SOA架构有什么作用?
  4. 流量矿石:经历九死一生,曾获王欣亲自嘉奖,被5亿快播用户追捧
  5. 计算机语言cobol,COBOL计算机方言
  6. 万象2004不能用的解决方法
  7. 生成csv文件打开列变成科学计数法
  8. 华为OceanStor全闪存技术论坛登陆上海滩:探寻智能时代闪存普惠
  9. 揭秘边缘计算新晋“网红”——5G MEC深度解读第一弹
  10. linux LTP移植Android,LTP交叉编译(LTP201XXXX以上版本)