2014-07-21 21 views
0

好幾乎我想要做的是讓我的程序等待預定的時間,然後將字符移動到網格上的另一個點(它由「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); 
     } 
    } 

回答

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

謝謝!我的Twitter上的某個人告訴我只需將StartCoroutine放入啓動方法中即可使用,但這個提示給我很多次,所以下次我需要使用這種方法! –

0

您是否修改過那個HP?如果HP不是0,那麼StartCoroutine(Wait())將在每次執行Update()時被調用。這就是爲什麼你會得到奇怪的結果。

-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)這也許你不會在這種情況下需要。
它在y延遲調用函數x之後每隔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); 
} 
相關問題