http://www.manew.com/thread-92253-1-1.html

目标
本篇博文的主要目标是告诉你在项目中如何使用WaitUntil和WaitWhile这两个API函数。

是否混淆了WaitUntil和WaitWhile?
不知道如何使用WaitUntil和WaitWhile?
如果你是上面这两种情况,那么现在就该我为你服务了。我假定在你阅读这篇博文前你已经了解了协程,因为 WaitUntil和 WaitWhile仅仅在协程中的 yield语句后面出现。 如果你还不了解协程,请看下面的链接:  
Mastering Coroutines in Unity in 10 mins
开始学习WaitUntil:
θ 根据定义,它挂起语句, 直到指定的条件返回 true。
θ 换句话说,当我们指定的条件是 false时,它不会 继续执行语句。 unity 将会等待条件返回 true 。

OK ,我们了解了概念,下一步该做什么呢?  现在我们将用一个简单的 demo 来告诉你如何使用,在什么地方使用它。  假设你是在开发一个汽车竞速游戏,并且当你的油量为空时通知玩家。 在这种情况下,看看如下代码:

[C#]   纯文本查看   复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using  UnityEngine;
using  System.Collections;
public  class  Demo : MonoBehaviour {
     public  int  counter;
     void  Start() {
         counter = 20;
         StartCoroutine(FuelNotification());
     }
     
     IEnumerator FuelNotification() {
         Debug.Log( "Waiting for tank to get empty" );
         yield  return  new  WaitUntil(()=> counter <= 0);
         Debug.Log( "Tank Empty!" );  //Notification
     }
     void  Update() {
         if  (counter > 0)
         {
             Debug.Log( "Fuel Level: "  + counter);
             counter--;
         }
     }
}

当counter 变量变为 0 ,玩家会得到一个通知。
非常简单,不是吗?
Yeah! 但是和WaitUntil一起使用的神秘的“() =>”是什么呢?好,我将为你解释这个 问题。这个东西叫做 Lambda表达式。(仅仅 => 部分,不包含括号)它是一种匿名方法(另一个 C# 概念),它隐式地获得传递变量的信息,它大量使用在 LINQ 表达式中。 Lambda表达式是一个非常便利的工具,试一试吧。
下面的链接展示它如何工作:
θ   https://msdn.microsoft.com/en-us/library/bb397687.aspx
θ   https://www.youtube.com/watch?v=LDgQ-spnrYY
无论如何,如果这是你的大脑混乱,我们有另外一个解决办法:
[C#]   纯文本查看   复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using  UnityEngine;
using  System.Collections;
public  class  Demo : MonoBehaviour {
     public  int  counter;
     void  Start() {
         counter = 20;
         StartCoroutine(FuelNotification());
     }
     IEnumerator FuelNotification() {
         Debug.Log( "Waiting for tank to get empty" );
         yield  return  new  WaitUntil(IsTankEmpty);
         Debug.Log( "Tank Empty!" );
     }
     void  Update() {
         if  (counter > 0)
         {
             Debug.Log( "Fuel Level: "  + counter);
             counter--;
         }
     }
     public  bool  IsTankEmpty(){
         if (counter>0){  return  false ; }
         else  return  true ; }
     }
}

检查控制台;输出是一样的,对吧?学会了吗?一整个方法仅仅一行代码,看看Lambda 表达式是多么有威力。  现在我希望你忘记前面说的 WaitUntil 。
现在来学习WaitWhile:WaitWhile 是WaitUntil 的对立面。它抑制表达式,当条件为真。不像 WaitUntil ,它将会等待条件变为 false ,才能指向后面的代码块。 和前面同样的例子,我们使用WaitWhile:
[C#]   纯文本查看   复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using  UnityEngine;
using  System.Collections;
public  class  Demo : MonoBehaviour {
public  int  counter;
     void  Start() {
         counter = 20;
         StartCoroutine(FuelNotification());
     }
     
     IEnumerator FuelNotification() {
         Debug.Log( "Waiting for tank to get empty" );
         yield  return  new  WaitWhile(()=> counter > 0);
         Debug.Log( "Tank Empty!" );
     }
     void  Update() {
         if  (counter > 0)
         {
             Debug.Log( "Fuel Level: "  + counter);
             counter--;
         }
     }
}

你可以看见,仅仅处理条件的机制不同。其他部分都一样。 但是请注意使用这些概念是一把双刃剑。 如果你的运算量非常巨大,这将会降低游戏的性能,因为这些函数每一帧都会调用。 好了,我将要结束这篇关于 WaitUntil 和 WaitWhile 的博客。如果你对这篇博客的任何地方还是有疑惑,请在下面留言。保持联系,就像大多数博客一样。想要获得游戏开发的想法?你还在等什么?现在就联系我们并获得想法。我们的公司是印度最好的Unity 3D 游戏开发公司之一。

原文作者:   Viju Dudiya
原文链接: http://www.theappguruz.com/blog/the-mystery-of-waituntil-waitwhile-in-unity-5-3-revealed

WaitUntil和WaitWhile相关推荐

  1. UniTask使用笔记

    异步处理&同步处理 同步处理:简单说就是代码按顺序执行,在方法1里调用方法2时,要等到方法2执行完毕才接着执行方法1的代码. 异步处理:简单说就是在两个方法里的代码同时或者来回执行,在方法1里 ...

  2. 《Unity游戏优化》笔记(4)[21/02/05_周五][P29_46]

    目录 第2章 脚本策略 (P29) 2.1 使用最快的方法获取组件 2.2 移除空的回调定义 (P31) 2.3 缓存组件索引 (P34) 2.4 共享计算输出 2.5 Update.Coroutin ...

  3. coroutine 携程与定时一起混用

    --[[ -- added by wsh @ 2017-12-19 -- 协程模块:对Lua协程conroutine进行扩展,使其具有Unity侧协程的特性 -- 注意: -- 1.主线程使用coro ...

  4. unity update 协程_Unity协程,停止协程及yield return使用_019

    public void Start() { //开启协程 Coroutine testCoroutine = StartCoroutine(Test()); //停止指定协程 StopCoroutin ...

  5. Unity超基础学习笔记(二)

    Unity超基础学习笔记(二) 1. 基本数据类型的扩展 之前在K12中学习了一些基本的数据类型,实际上C#支持更多的数据类型.如下: 注意无符号整型数和有符号整型数的表示范围,例如: int 能表示 ...

  6. Unity的协程详解

    一.协程的定义 协程,即为协同程序. Unity中的协程由协程函数和协程调度器两部分构成.协程函数使用的是C#的迭代器, 协程调度器则利用了MonoBehaviour中的生命周期函数来实现. 协程函数 ...

  7. Unity 讯飞实时语音转写(二)—— 接收转写结果

    目录 Unity 讯飞实时语音转写(一)-- 使用WebSocket连接讯飞语音服务器 Unity 讯飞实时语音转写(二)-- 接收转写结果 Unity 讯飞实时语音转写(三)-- 分析转写结果 正文 ...

  8. Unity 3D基础入门编程_艾孜尔江撰稿

    ** 一. 版本控制 ** 目前流行的两大方式:SVN和Git: 前者采用增量式,后者采用快照式: 前者产生单点故障影响大. 安装git软件. 本地库--历史版本: 暂存区--临时存储: 工作区--写 ...

  9. 艾孜尔江_Unity 3D入门常用函数用法及案例概要【干货】

    ** 一. 版本控制 ** 目前流行的两大方式:SVN和Git: 前者采用增量式,后者采用快照式: 前者产生单点故障影响大. 安装git软件. 本地库--历史版本: 暂存区--临时存储: 工作区--写 ...

最新文章

  1. oracle解锁system密码,Oracle System密码忘记 密码修改、删除账号锁定lock
  2. CentOS6.4安装gvim
  3. c++ asc chr 函数_15万怎么选?丰田CHR、本田XRV谁档次高?车主说了心里话
  4. SQL模糊查询 LIKE
  5. SAP 电商云 Spartacus UI 支持延迟加载的新功能的入口设计
  6. 危险的两个函数GetCurrentDirectory和GetParent
  7. 奶块显示正常登录服务器但进不去,奶块服务器流畅怎么进不进去quest; | 手游网游页游攻略大全...
  8. linux跟踪函数代码,linux ltrace-跟踪进程调用库函数的情况
  9. npm的那些“坑”——持续更新
  10. 【虚幻引擎4系列教程】第1章:虚幻引擎4的安装指导
  11. 光有想法怎么开技术公司?
  12. 介绍html5ppt模板,html5简单介绍.ppt
  13. Grafana panel 图形高级定制
  14. mpp新增一个字段_DM8 MPP环境搭建
  15. Linux 重新加载 nginx 配置命令
  16. 【unity】维护一个changelog
  17. 一个有用的数据库:中国研究数据服务平台(CNRDS)
  18. Linux中设置和重启网络的命令
  19. 如何利用动态代理IP来做SEO(网络营销)
  20. Python读取\修改word文档中的文本框内容

热门文章

  1. 测试工程师更换笔记本 - 软件安装(win10系统)
  2. 【CF #811 Div3】 A-E
  3. 红黑树RBT基本概念与实现
  4. Ubuntu_ROS中应用kinect v2笔记
  5. 简报 | 在巴拿马日本Bitpoint交易所开发运营交易平台
  6. 楷书书法规则_《楷书之美》3分钟教会你如何欣赏楷书,明白楷书的基本规律!...
  7. 互联网日报 | 蛋壳公寓否认破产;滴滴发布首款定制网约车D1;京东Q3营收1742亿元超预期...
  8. Android Drawable Resource学习(五)、StateListDrawable
  9. 秒杀模块-业务分析参考
  10. core2 duo I3 I5 I7什么意思