WaitForSeconds的问题

时间:2013-03-05 06:13:07

标签: javascript time unityscript

我正在学习如何在Unityscript中使用 WaitForSeconds 功能,并且之前已经取得了成功。但是现在我在一个脚本中尝试它,当对象的生命值达到0时,将对象(在这种情况下为一个盒子)移出屏幕,然后在一定的秒数后让它重新出现在一个随机位置在屏幕上,并将运行状况设置回其默认值。到目前为止我所拥有的是:

function Update () 
{
    if(health <= 0)
    {
        RespawnWaitTime ();
        var position = Vector3(Random.Range(-6,6),Random.Range(-4.5,4.5),0); //this is the onscreen range   
        transform.position = position;
        health = 2;                 
    }
}

function RespawnWaitTime ()
{
    var offScreen = Vector3(10,10,0);
    transform.position = offScreen;
    yield WaitForSeconds(2);
}

然而,它并没有等待2秒钟。盒子直接进入新的位置,好像功能不在那里。我相信它确实会进入屏幕外的位置,但只是直接跳回去而不等待。我已经通过将一些代码更改为:

来测试它是否正在应用等待
function RespawnWaitTime ()
{
    var offScreen = Vector3(10,10,0);
    transform.position = offScreen;
    print("I'm over here!");
    yield WaitForSeconds(2);
    print("I'm coming back!");  
}

文本的第一位最终立即打印,然后在两秒后,第二位文本也会出现,正如预期的那样。那么为什么等待也不适用于盒子呢?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我怀疑WaitForSeconds是异步的,因此当更新调用RespawnWaitTime时,RespawnWaitTime会立即返回。您可以尝试以下代码来查看WaitForSeconds的行为吗?

function Update () {
        print("1 in update before calling respandwaittime");
        RespawnWaitTime ();
        print("3 in update after calling respandwaittime");
}

function RespawnWaitTime (){
    print("2 in in respainwaittime before calling waitforseconds");
    yield WaitForSeconds(2);
    print("4 in in respainwaittime after calling waitforseconds");
}

由于输出为1,2,3,4(如预期的那样),您可以像这样重新编程:

function Update () {
    if(health <= 0){
        recover();
        return;
    }
}

function recover(){
    var offScreen = Vector3(10,10,0);
    transform.position = offScreen;
    yield WaitForSeconds(2);
    //this is the onscreen range   
    var position = Vector3(Random.Range(-6,6),Random.Range(-4.5,4.5),0); 
    transform.position = position;
    health = 2;                 
}

答案 1 :(得分:0)

你需要使用&#34;产生RespawnWaitTime();&#34; - 否则调用它的函数将在协同程序运行的同时继续执行。

让协程暂停执行调用它的代码,直到协程完成,此时原始代码从yield语句后面的行恢复。

但是 - 因为你不能将yield语句放在Update()中 - 你需要调用一个中间函数,如下所示:

function Update () 
{
    if(health <= 0)
    {
        Respawn ();              
    }
}

function Respawn ()
{
    yield RespawnWaitTime ();
    var position = Vector3(Random.Range(-6,6),Random.Range(-4.5,4.5),0);
    transform.position = position;
    health = 2;
}

function RespawnWaitTime () : IEnumerator
{
    var offScreen = Vector3(10,10,0);
    transform.position = offScreen;
    yield WaitForSeconds(2);
}

注意我还添加了&#34;:IEnumerator&#34;到RespawnWaitTime() - 如果你没有,控制台将为调用它的yield语句输出错误。据我所知,尽管显示了编译错误,但代码可能会正常工作,但我不想冒险; - )