[Unity] 协程

查看:782 |回复:2 | 2019-8-9 10:06:08

您需要 登录 才可以下载或查看,没有账号?注册

x
        今天看了一篇博文,讲协程好多地方都讲错了,这里我只讲解一些用法。如果想更深入的了解迭代器,可以看这篇博文  https://www.cnblogs.com/murongxiaopifu/p/4437432.html

        协程一般用来在脚本中增加延时效果。在创建脚本的Start和UpData函数里是不能使用:yield WaitForSeconds (1)的,如果想使用延时效果,就需要将;void Start ()函数的返回值改成下面的样子,IEnumerator Start()。
  1. IEnumerator Start()
  2.     {
  3.         StartCoroutine("DoSomething", 2.0F);
  4.         yield return new WaitForSeconds(1);
  5.         StopCoroutine("DoSomething");
  6.         //注意:有很多人说,只有使用字符串开启的协程才可以
  7.         /手动的将它们停下来,其实这种说法是错误的,用下面的方法开启协程也是可
  8.         //以停止协程的,当然我写的东西受限于我现在的水平也可能有错误,
  9.         //如果谁看出来有错误希望在下面的回复中指出
  10.         
  11.         Coroutine cor = StartCoroutine(DoSomething(2.0f));
  12.         StopCoroutine(cor);
  13.         
  14.         IEnumerator enumerator = DoSomething(2.0f);
  15.         StartCoroutine(enumerator);
  16.         StopCoroutine(enumerator);
  17.         
  18.     }
  19. IEnumerator DoSomething(float someParameter)
  20. {
  21.     while (true) {
  22.         print("DoSomething Loop");
  23.         yield return null;
  24.     }
  25. }
点击此处复制文本
注意:
StopCoroutine(string methodName):中止一个协程,只能终止该MonoBehaviour中的协同程序
StopAllCoroutines():中止所有协同,只能终止该MonoBehaviour中的协同程序
将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启。

下面涉及了一些迭代器,看得懂就看,看不懂也正常,如果想弄明白,最好看一下迭代器原理,或者设计模式里面的迭代模式,我就不讲了
  1.   IEnumerator enumerator;
  2.     private void OnGUI()
  3.     {
  4.         //此方法用于调用协程,直接能够调用一直执行下去
  5.         if (GUILayout.Button("协程"))
  6.         {
  7.             StartCoroutine(Fun());
  8.         }
  9.         if (GUILayout.Button("开启"))
  10.         {
  11.             //此处执行后,不会打印Fun方法里面的内容。此处调用只会生成一个叠代器。
  12.             //在以后调用叠代器里面的MoveNext方法才会执行一次打印
  13.             enumerator = Fun();
  14.             //注意:正常使用Fun方法会返回一个迭代器,而使用StartCoroutine调用
  15.             //Fun方法,程序在编译的时候会为我们多做很多事,这里就不详细讲了。
  16.         }
  17.         if (GUILayout.Button("执行一次"))
  18.         {
  19.             //每点击一下,会调用一次MoveNext()方法,
  20.             enumerator.MoveNext();
  21.         }
  22.     }
  23.     private IEnumerator Fun()
  24.     {
  25.         for (int i = 0; i < 10; i++)
  26.         {
  27.             print(i + "分隔" + Time.frameCount);
  28.             yield return null;
  29.         }
  30.     }
点击此处复制文本
使用StartCoroutine调用Fun方法的效果是这样的
clipboard1.png
使用”开启“和”执行一次“两个按钮一次一次调用MoveNext调用方法是这种效果
clipboard.png



评分

参与人数 2元素币 +20 活跃度 +12 展开 理由
悦动的喵 + 12 + 12 硬核
狼之独步 + 8

查看全部评分

2019-8-9 10:06:08  
 赞 赞 0

使用道具 登录

2个回答,把该问题分享到群,邀请大神一起回答。
2#
void start()也可以开启协程啊,yield return xxx写在开头不就行了?
回复 收起回复
2019-10-20 11:07:58   回复
 赞 赞 0

使用道具 登录

3#
本帖最后由 张金锋 于 2019-10-21 14:47 编辑
可惜不快乐 发表于 2019-10-20 11:07
void start()也可以开启协程啊,yield return xxx写在开头不就行了?

你还是找开Unity自己试试吧
回复 收起回复
2019-10-21 14:42:47   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

手机游戏引擎手游引擎Unity3D技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表