2017-02-15 12 views
0

私はある時点で数秒待つ必要のある更新機能を持つコード(C#)を持っています。問題は、waitコマンドを実行している最中に更新機能を継続し、遅れているはずのビットが完全にスキップされることです。 ブール変数のため、アップデートは一度しか使用できません。問題が発生しないように、再度利用可能にします。 コードは待機中のものがなくても動作しますので、心配する必要はありません。私は大抵の場合、待っている必要はありません。レとUnity:アップデート中のWait()がほとんど動作していますが、それほど役に立ちません。

void Update() 
{ 

    if (RoundOver == false) 
    { 
     RoundOver = true; 
     Seconds = 3; 
     Debug.Log("Waiting", gameObject); 
     StartCoroutine(Wait()); 
     if (Continue) 
     { 
      Continue = false; 
      Debug.Log("Done Waiting", gameObject); 
      RoundNumber += 1;    //Just game stuff 
      ZombiesLeft = ZombieAmount(); //Just game stuff 
      RoundOver = false; 
     } 
     Debug.Log("Done wit stuff", gameObject); 
    } 
    if (counter > DelayTime && RoundOver == false) 
    { 
     counter = 0; 
     Debug.Log("Going to spawn a zombie", gameObject); 
     SpawnZombie(); 
    } 
    counter += Time.deltaTime; 
    } 

機能待って次のように出力されている

IEnumerator Wait() 
{ 
    Debug.Log("ACTUALLY WAITING", gameObject); 
    yield return new WaitForSeconds(Seconds); 
    Continue = true; 
    Debug.Log("ACTUALLY WAITING DONE", gameObject); 
} 

を:

Waiting 
ACTUALLY WAITING 
Done wit stuff 
ACTUALLY WAITING DONE 

だから、明らかに正しい順序が

Waiting 
ACTUALLY WAITING 
ACTUALLY WAITING DONE 
Done wit stuff 

EDIT次のようになります。 ブロックI n if (continue)は、(ここでは隠れている)要件が満たされたときに2番目のブロックをアクティブにすることになっています。 2番目のブロックは、完了するまで(何分もかかる可能性があります)、その後RoundOverをfalseに設定して最初のブロックを再び有効にするまで、その作業を続けます。最初のブロックは基本的にはRoundNumber +=1のような変数を増やすことで2番目のブロックを再実行し続けることです。ここで唯一の問題は2番目のブロックを3秒間で区切ることです。

+0

私はあなたの質問に答えましたが、あなたが何をしたいかは、更新機能に入れないと思うので教えていただければ幸いです –

+0

編集で更新しました – RnRoger

+0

Enumeratorで更新をエミュレートできますそれを 'WaitForEndOfFrame'で終わらせます。だからあなたのStart()メソッドでは、StartCoroutine(IEnumeratorUpdate());あなたの待機ロジックを必要とするコードをそこに置いてください! – Maakep

答えて

1

void SpawnZombie()を別のではなくIEnumeratorに変換することで回避しました。その後、SpawnZombie()StartCoroutine(SpawnZombie())に置き換えました。それを私が望むように振る舞わせるために、SpawnZombie()ifを追加して、私が望むときに3秒だけ待っていることを確認してください。

0

デバッグステートメントDebug.Log("Done wit stuff", gameObject);は、ifステートメントif (Continue)の範囲外です。このため、コルーチンがまだ実行中であっても表示されます。

+0

私はそれを得る、全体のポイントは、コードを続けるまで3秒待つことです。 – RnRoger

1

Update関数で待機することはできません。IEnumeratorを返す関数でのみ待機できます。これは詰め込むのクリーンではありませんが、このために

は、あなたがこの

void Update() 
{ 
    if (RoundOver == false) 
    { 
     RoundOver = true; 
     StartCoroutine(Wait()); 
    } 
    if (counter > DelayTime && RoundOver == false) 
    { 
    counter = 0; 
    Debug.Log("Going to spawn a zombie", gameObject); 
    SpawnZombie(); 
    } 
    counter += Time.deltaTime; 
} 

IEnumerator Wait() 
{ 
    Seconds = 3; 
    Debug.Log("Waiting", gameObject); 
    Debug.Log("ACTUALLY WAITING", gameObject); 
    yield return new WaitForSeconds(Seconds); 
    Debug.Log("Done Waiting", gameObject); 
    RoundNumber += 1;    //Just game stuff 
    ZombiesLeft = ZombieAmount(); //Just game stuff 
    RoundOver = false; 
    Debug.Log("ACTUALLY WAITING DONE", gameObject); 
    Debug.Log("Done wit stuff", gameObject); 
} 

ようなものを作ることができ、私はアップデートから可能ならば、すべてのコードを削除し、必要な時にコルーチンを開始します。

関連する問題