查看: 1209|回复: 0
打印 上一主题 下一主题

Unity3D中JavaScript与C#对比(四)

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-9-5 14:11:22 |只看该作者 |倒序浏览
第四节主要讲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类得区别。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-16 07:32 , Processed in 0.228143 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部