Unity3D之协程(Coroutines & Yield )
2015-06-18 18:00
986 查看
写游戏代码,往往最终需要代码为连续的事件.结果会像这样:
[它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行。]
[csharp] view
plaincopyprint?
<span style="font-size:18px;">private int state = 0;
void Update()
{
if (state == 0)
{
//做步骤0
state = 1;
return;
}
if (state == 1)
{
// 做步骤1
state = 2;
return;
}
// ...
} </span>
往往使用yield语句更为方便.yield语句是一个特殊的返回类型,它确保函数从yield语句的下一行继续执行.
[csharp] view
plaincopyprint?
<span style="font-size:18px;">while(true) {
// 做步骤0
yield return 0;
// 等待一帧
// 做步骤1
yield return 2;
// 等待两帧
// ...
} </span>
你也可以传递时间值到yield语句,Update函数会在yield结束后执行下一语句.
[csharp] view
plaincopyprint?
<span style="font-size:18px;"> // do something
yield return WaitForSeconds (5.0);
//等待5秒
// do something more... </span>
你可以入栈并连接协程.
这个例子将执行Do,但是do函数之后的print指令会立刻执行.
[csharp] view
plaincopyprint?
<span style="font-size:18px;">Do ();
Console.WriteLine("This is printed immediately");
IEnumerator Do ()
{
Console.WriteLine("Do now");
yield return new WaitForSeconds (2);
Console.WriteLine("Do 2 seconds later");
} </span>
这个例子将执行Do,并等待,直到Do完成再执行其他语句.【注:这里的等待是把线程时间交给其他任务,而不是阻塞式等待】
[csharp] view
plaincopyprint?
<span style="font-size:18px;">// 启动协程
yield return StartCoroutine("Do");
Console.WriteLine("Also after 2 seconds");
Console.WriteLine ("这个print将在Do协程执行完以后显示。");
IEnumerator Do ()
{
Console.WriteLine("Do now");
yield return new WaitForSeconds (2);
Console.WriteLine("Do 2 seconds later");
}
</span>
任何事件处理程序都可以是协同程序 。
注意你不能在Update或FixedUpdate函数内使用yield,但是你能使用 StartCoroutine 开始一个函数.
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine and MonoBehaviour.StartCoroutine 可以获得更多使用yield的信息.
yield return可以看做是一种特殊的return,会返回到父类继续执行,但是yield return后面的类型或方法会有一个执行条件,当条件满足时会回调包含yield的子函数,例如下面代码
例1:
[csharp] view
plaincopyprint?
<span style="font-size:18px;">void Start () {
print("Starting:" + Time.time);
StartCoroutine(WaitAnPrint(2.0F));
print("Before WaiAndPrint:" + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint:" + Time.time);
}
</span>
在执行yield return new WaitForSeconds(waitTime)时暂停的条件没有满足,故返回到start函数中继续执行,直到满足条件后再回调WaitAndPrint,所以输出为:
Starting:0
Before WaiAndPrint:0
WaitAndPrint:2.12291
例2:
[csharp] view
plaincopyprint?
<span style="font-size:18px;">IEnumerator Start()
{
print("starting:" + Time.time);
yield return StartCoroutine(WaitAndPrint(2.0F));
print("done:" + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint:" + Time.time);
}</span>
因为start为顶级函数,所以会阻塞在这里,直到StartCoroutine(WaitAndPrint(2.0F))执行完毕,输出为:
starting:0
WaitAndPrint:2.00315
done:2.00315
http://blog.csdn.net/jjiss318/article/details/7447421
[它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行。]
[csharp] view
plaincopyprint?
<span style="font-size:18px;">private int state = 0;
void Update()
{
if (state == 0)
{
//做步骤0
state = 1;
return;
}
if (state == 1)
{
// 做步骤1
state = 2;
return;
}
// ...
} </span>
往往使用yield语句更为方便.yield语句是一个特殊的返回类型,它确保函数从yield语句的下一行继续执行.
[csharp] view
plaincopyprint?
<span style="font-size:18px;">while(true) {
// 做步骤0
yield return 0;
// 等待一帧
// 做步骤1
yield return 2;
// 等待两帧
// ...
} </span>
你也可以传递时间值到yield语句,Update函数会在yield结束后执行下一语句.
[csharp] view
plaincopyprint?
<span style="font-size:18px;"> // do something
yield return WaitForSeconds (5.0);
//等待5秒
// do something more... </span>
你可以入栈并连接协程.
这个例子将执行Do,但是do函数之后的print指令会立刻执行.
[csharp] view
plaincopyprint?
<span style="font-size:18px;">Do ();
Console.WriteLine("This is printed immediately");
IEnumerator Do ()
{
Console.WriteLine("Do now");
yield return new WaitForSeconds (2);
Console.WriteLine("Do 2 seconds later");
} </span>
这个例子将执行Do,并等待,直到Do完成再执行其他语句.【注:这里的等待是把线程时间交给其他任务,而不是阻塞式等待】
[csharp] view
plaincopyprint?
<span style="font-size:18px;">// 启动协程
yield return StartCoroutine("Do");
Console.WriteLine("Also after 2 seconds");
Console.WriteLine ("这个print将在Do协程执行完以后显示。");
IEnumerator Do ()
{
Console.WriteLine("Do now");
yield return new WaitForSeconds (2);
Console.WriteLine("Do 2 seconds later");
}
</span>
任何事件处理程序都可以是协同程序 。
注意你不能在Update或FixedUpdate函数内使用yield,但是你能使用 StartCoroutine 开始一个函数.
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine and MonoBehaviour.StartCoroutine 可以获得更多使用yield的信息.
yield return可以看做是一种特殊的return,会返回到父类继续执行,但是yield return后面的类型或方法会有一个执行条件,当条件满足时会回调包含yield的子函数,例如下面代码
例1:
[csharp] view
plaincopyprint?
<span style="font-size:18px;">void Start () {
print("Starting:" + Time.time);
StartCoroutine(WaitAnPrint(2.0F));
print("Before WaiAndPrint:" + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint:" + Time.time);
}
</span>
在执行yield return new WaitForSeconds(waitTime)时暂停的条件没有满足,故返回到start函数中继续执行,直到满足条件后再回调WaitAndPrint,所以输出为:
Starting:0
Before WaiAndPrint:0
WaitAndPrint:2.12291
例2:
[csharp] view
plaincopyprint?
<span style="font-size:18px;">IEnumerator Start()
{
print("starting:" + Time.time);
yield return StartCoroutine(WaitAndPrint(2.0F));
print("done:" + Time.time);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint:" + Time.time);
}</span>
因为start为顶级函数,所以会阻塞在这里,直到StartCoroutine(WaitAndPrint(2.0F))执行完毕,输出为:
starting:0
WaitAndPrint:2.00315
done:2.00315
http://blog.csdn.net/jjiss318/article/details/7447421
yiled return 本质上和return作用一样,将当前函数返回。只不过下一次再调用这个函数,可以从yiled return的下一句开始执行,函数本身的变量也都会一直保存上一次调用的状态。
摘自 http://zhidao.baidu.com/link?url=04ZkySxpaIeAHUvL8ZR68LPvAh55qIX0AFIz-CV-uJDZQ2NjbOdl8PrDDFIexpS_2G-Xuordc5Vwfp1-mtV_6-WhehXk_ueqEHzmgXhj1f3[/code]
相关文章推荐
- Unity教程之手把手教你实现弹框
- Unity3D:NGUI Srollview子对象中有Button时,点击不能滚动
- 在桌面版 Ubuntu 中安装 Unity Tweak Tool
- Unity--ngui的UIEventTrigger使用
- unity3d Awake和 Start 区别
- 这几天在搞UNITY3D,感觉回到了AS2
- unity www读取本地视频文件和外部视频文件 播放视频动画和视频声音
- Unity中基于RPC机制实现摄像头视频传输
- UNITY与HTML通讯
- Unity3D实践系列02,查看Scene窗口物体
- Unity学习疑问记录之触屏
- Unity压缩图片
- Unity 5光照贴图烘焙
- Unity3D实现弹幕的效果
- Unity3D实践系列01,创建项目
- unity5,UI Button too small on device than in Game View解决办法
- 【Unity快速实现小功能】实现摄像机跟随角色移动功能
- 【Unity实用小技巧】设置动画模型循环播放
- 事件/委托机制(event/delegate)(Unity3D开发之十七)
- 事件/委托机制(event/delegate)(Unity3D开发之十七)