- 最后登录
- 2013-9-29
- 注册时间
- 2012-8-20
- 阅读权限
- 90
- 积分
- 6371
- 纳金币
- 6372
- 精华
- 0
|
第四节主要讲JavaScript和C#在unity3d编程中执行yielding(pausing)有什么区别,在继续之前,强烈建议您阅读第一、第二和第三节的内容。
yielding pauses代码对于游戏编程是相当有用的,你可以用它更好的控制你游戏中的事件。无论是用JavaScript或C#都不能简单的中断Update()方法。相信你已经猜到了,我们今天要议论的是这两种语言对此的解决方案有什么不同。我们这节中会给出这种解决方案的常用实例。现在我们来看看JavaScript是如何yield的:
private vartextS : String;
private varcounter : float = 0;
functionUpdate ()
{
//call the function that waits three seconds to***cute
WaitThreeSeconds();
}
//This function waits three seconds before***cuting
functionWaitThreeSeconds()
{
//Waits three seconds
yield WaitForSeconds(3);
//converts the counter to a String and stores its value in textS
textS = "Three seconds has passed, now I'm counting..."+counter.ToString();
//add one to the counter
++counter;
}
function OnGUI()
{
//The next line displays the first line of text
GUI.Label(new Rect(20,20,250,20), "I will start counting in 3 seconds.");
//Displays the counter
GUI.Label(new Rect(20,40,500,20),textS);
}
这个代码在屏幕上输出了两个文本,第一行会在开始不久就被渲染出来,第二行只会在暂停3秒后出现,yield代码只会执行一次,然后再正常执行Update()循环(也就是说不会再等三秒在去执行一次WaitThreeSeconds())。有一点要注意,我们知道能在函数内用yield,Update()方法是不能被暂停的。
现在来看看C#代码:
using UnityEngine;
using System.Collections;
public class Yield : MonoBehaviour
{
privatestring textS;
private float counter = 0;
voidUpdate ()
{
//doesn't generate an error but doesn't work either.
WaitThreeSeconds();//<=does nothing
//start the coroutine named WaitThreeSeconds
StartCoroutine("WaitThreeSeconds");//<=right
}
//Waits three seconds before***cuting
IEnumerator WaitThreeSeconds()
{
//Waits three seconds
yield return newWaitForSeconds(3);
//converts the counter to a String and stores its value in textS
textS = "Three seconds has passed, now I'm counting..." + counter.ToString();
//add one to the counter
++counter;
}
void OnGUI()
{
//The next line displays the first line of text
GUI.Label(newRect(20,20,250,20), "I will start counting in 3 seconds.");
//Displays the counter
GUI.Label(new Rect(20,40,500,20),textS);
}
}
主要区别就是我们在C#中不能把yield放在函数中使用,需要使用IEnumerator接口,之所以这样只是因为C#就是这么设计的,我们不能像调用普通函数那样调用WaitThreeSeconds(),即便那么做也不会有任何反应的。所以我们的解决办法就是想调用协同那样调用WaitThreeSeconds()。(例如14行)
另外一个区别就是在21行,我们要用yield return new WaitForSeconds(3)来替换 yield WaitForSeconds(3)代码,因为我们用IEnumerator接口需要一个返回值。
希望这节我解释的足够明白了。下一节我会像向你们展示在JavaScript 和C#中使用Raycast类得区别。 |
|