2018年6月28日木曜日

【unity】コルーチンの中でwhile文を書いたら

  1. IEnumerator DealHard () {
  2. while (time > 0) {
  3. time -= Time.deltaTime;
  4.  
  5. lefttime.text = ((int)time).ToString ();
  6. }
  7. time = 0;
  8.  
  9. Debug.Log ("タイムアップ");
  10. }

このスクリプトは残り時間を計測しその秒数をテキストに出しています。

このコードではunityが途中でバグります。(それか一瞬でtimeが0になる)

どこが間違っているかお分かりですか?

  1. IEnumerator DealHard () {
  2. while (time > 0) {
  3. time -= Time.deltaTime;
  4.  
  5. lefttime.text = ((int)time).ToString ();
  6.  
  7. yield return null; // ここ
  8. }
  9. time = 0;
  10.  
  11. Debug.Log ("タイムアップ");
  12. }

正解は yield return null をwhileの中に書いていないことです。

そもそも Time.deltaTime は前のフレームと次のフレームの時間差を取るものです。
最初のコードでは無数の繰り返し処理が1フレームで行われてしまいます。
そして何やかんやでunityが死ぬ。

yield return null はそのフレームの作業を中断し次のフレームから再開させます。
つまり、 Time.deltaTime との相性がよくなるわけです。
よかった、これで解決ですね

0 件のコメント:

コメントを投稿