我正在学习如何在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!");
}
文本的第一位最终立即打印,然后在两秒后,第二位文本也会出现,正如预期的那样。那么为什么等待也不适用于盒子呢?谢谢你的帮助。
答案 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语句输出错误。据我所知,尽管显示了编译错误,但代码可能会正常工作,但我不想冒险; - )