0

我正在学习如何在 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!");  
}

第一段文本立即打印完毕,两秒钟后,第二段文本也出现了,正如预期的那样。那么为什么等待也不适用于盒子呢?谢谢你的帮助。

4

2 回答 2

1

我怀疑 WaitForSeconds 是异步的,因此当 update 调用 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;                 
}
于 2013-03-05T06:28:31.380 回答
0

你需要使用“yield RespawnWaitTime();” - 否则调用它的函数将在协程运行的同时继续执行。

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

但是 - 由于您不能将 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);
}

注意我还在 RespawnWaitTime() 中添加了 ":IEnumerator" - 如果你不这样做,控制台将为调用它的 yield 语句打印一个错误。据我了解,尽管显示了编译错误,但代码可能会起作用,但我不想冒险;-)

于 2015-03-01T14:16:14.430 回答