为什么我的程序不像我需要的那样等待?

时间:2014-07-21 02:41:37

标签: c# unity3d coroutine

好吧我正在尝试做的是让我的程序等待预定的次数然后将字符移动到网格上的另一个位置(由“panel_x”和“panel_y”变量标记)。相反,它等待,然后围绕每一帧移动角色...我不知道我做错了什么。我相信我需要一个协程,但我可能错了。

//How I am calling the coroutine
void Update()
    {
       if(HP != 0)
       { 
       StartCoroutine(Wait());
       }
    }

//The Coroutine I need to run to move my character
//around...I need this to run until the character's
//hp reaches 0.
IEnumerator Wait()
    {
        while(true)
        {
            //I need it to wait...  
            yield return new WaitForSeconds(3);
            //Then move the character to another
            //grid...
            panel_x = Random.Range(1, 4);
            panel_y = Random.Range(1, 4);
        }
    }

3 个答案:

答案 0 :(得分:1)

更新在每一帧上运行。这里发生的是你在每个帧上调用Wait(),它将在无限循环中运行多个实例。

我相信你要做的是每3秒更改一次x和y值。 如果是这样,请尝试这样的事情。

float timer = 0.0f;
void Update()
{
    if (HP != 0)
    {
       timer += Time.deltaTime;
       if (timer >= 3)
       {
           panel_x = Random.Range(1, 4);
           panel_y = Random.Range(1, 4);
           timer = 0;
       }
    }
}

Time.deltaTime返回帧之间传递的时间,因此可以通过对每帧进行求和将其用作计时器。当3秒过去后,我们将计时器重置为0并运行我们的方法。

答案 1 :(得分:0)

您之后是否修改了HP?如果HP不为0,则每次执行StartCoroutine(Wait())时都会调用Update()。这就是你得到奇怪结果的原因。

答案 2 :(得分:-1)

您的功能似乎没有采用任何参数,因此我可以为您提供其他方法,例如Invoke

Invoke(x, y)在一定的秒延迟后执行一个函数。例如:

void Update(){
    if(HP != 0)
        Invoke("MoveChar", 3); //execute MoveChar() after 3 seconds
}

MoveChar(){
    panel_x = Random.Range(1,4);
    panel_y = Random.Range(1,4);
}

仅为了您的信息,还有InvokeRepeating(x, y, z)在这种情况下您可能不需要。{
在函数x被y延迟调用后,每隔z秒重复一次。

void Start(){ 
    //execute MoveChar() after 3 seconds and call the
    //function again after 0.5 seconds repeatedly
    InvokeRepeating("MoveChar", 3, 0.5);
}

MoveChar(){
    panel_x = Random.Range(1,4);
    panel_y = Random.Range(1,4);
}