私はある時点で数秒待つ必要のある更新機能を持つコード(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秒間で区切ることです。
私はあなたの質問に答えましたが、あなたが何をしたいかは、更新機能に入れないと思うので教えていただければ幸いです –
編集で更新しました – RnRoger
Enumeratorで更新をエミュレートできますそれを 'WaitForEndOfFrame'で終わらせます。だからあなたのStart()メソッドでは、StartCoroutine(IEnumeratorUpdate());あなたの待機ロジックを必要とするコードをそこに置いてください! – Maakep