『while』文とは
繰り返し処理を行いたいときに使用します。
もくじ
1.基本構文
2.構文パターン
3.具体例
4.Unityでの使用例【アニメーションの再生終了を待つ】
基本構文
1 2 3 4 |
while (条件) { // 処理 } |
※プログラミングは基本的に、すべて半角英数字で記述します。上記では便宜上全角を使用していることをご了承ください。
“while(条件)”の「条件」を満たす限り、while内をループして、
「処理」が繰り返し実行されます。
「条件」を満たさなくなった段階で、while文が終了します。
「条件」を”true”とすることで、無限ループさせることができます。
無限ループさせるときは、しっかりとwhile文を抜けられるように
処理を記述する必要があります。
“continue;”を記述することで、
それ以降の処理を無視して、再びループの最初に戻ることができます。
“break;”を記述することで、
while文を抜ける(終了させる)ことができます。
構文パターン
「while」文は以下のような書き方もできます。
「条件」部分を”true”にすることで、無限ループさせることができます。
無限ループさせる場合は、必ず”break;”を入れるなどして
while文を抜けられるようにしてください。
今回の場合は、「条件」を満たすと”break;”が実行され、while文を抜けます。
このとき”break;”より下にある「処理」は実行されません。
1 2 3 4 5 6 |
while (true) { if(条件) break; // 処理 } |
“continue;”を使うことで、次のループへと進むことができます。
今回の場合、「条件」を満たすと次のループへと移行します。
このとき”continue;”より下にある「処理」は実行されません。
1 2 3 4 5 6 |
while (true) { if(条件) continue; // 処理 } |
具体例
それでは具体例を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int count = 0; while (true) { ++count; if (count == 5) { count += 5; continue; } else if (count >= 10) break; Debug.Log(count); } |
==:「等しい」, >=:「以上」
count += 5;:countを+5する(count = count + 5; を省略した形)
++count;:countの値を+1する
Debug.Log(count):UnityエディタのConsoleに”count”の値を出力する関数
while文を抜けた後、Consoleに出力されている数値は何でしょうか。
答えは、「1,2,3,4」です。
“while(true)”となっているのでwhileの中を無限ループします。
while文の中を見ていくと、
最初に”count”が+1されて、その後のif文では、
『”count”が5であれば、”count”を+5して、次のループへ、
“count”が10以上であれば、while文を抜ける』
と条件分岐がされています。
そして、while文の最後で”count”の値をConsoleに出力するようになっています。
では、具体的に見ていきましょう。
“count”の値は最初は0で、while文の最初に+1されているので、
“count”は1になります。”count”は1なので、その後のif文はスルーされて、
最後にConsoleに1が出力されて、次のループへと進みます。
これが、while文の1周になります。以降これが繰り返されます。
“count”が1ずつ増えていき、5になったとき、
“if(count == 5)”の中に入るので、
“count”は+5されて10になり、”continue”となっているので、
次のループへと進みます。このとき、”continue”より下にはいかないため、
Consoleへの出力はされません。
10となった”count”は、すぐに+1されて11となり、
今度は”else if(count >= 10)”の中に入り、”break;”が実行されるので、
while文を抜けます。
“continue”のときと同様に、”break”以下にはいかないので、
Consoleに出力されずにwhile文が終了となります。
ゆえに、Consoleに出力されるのは、「1,2,3,4」ということになります。
Unityでの使用例
Animatorを利用したAnimationの再生終了を待つためのスクリプトです。
1 2 3 4 5 6 7 8 9 10 11 12 |
IEnumerator WaitAnimationEnd(Animator anim, string animName) { bool IsEndAnim = false; while (!IsEndAnim) { if (!anim.IsInTransition(0)) IsEndAnim = anim.GetCurrentAnimatorStateInfo(0).IsName(animName); yield return new WaitForEndOfFrame(); } } |
anim.IsInTransition(0):アニメーションが遷移しているかどうか取得
anim.GetCurrentAnimatorStateInfo(0).IsName(animName):
animNameというアニメーションが再生されているかどうか取得
yield return new WaitForEndOfFrame():レンダリング完了を待つ
animationの終了を待つ処理を、
IEnumeratorを利用してコルーチンで行っています。
コルーチンとは、1フレーム内では処理が終わらず、
数フレームあるいはそれ以上かけて処理を実行する必要がある場合に
用いられます。
「処理を途中で中断し、再度続きから処理を実行することができる」
というのがコルーチンの特徴です。
コルーチンに関しては、別途詳しく記事を書きたいと思います。
上記スクリプトでは、while文の中でアニメーションの状態を取得して、
アニメーションの遷移が完了した時点で、while文が終了するように
なっています。
今回使用したスクリプトは、
「アニメーションの遷移が完了したタイミング」を取得しているので、
アニメーションの遷移完了とアニメーションの終了が
同じタイミングでないといけないのがネックです。(画像1)
別のやり方もあるのですが、while文の使用例ということで
このスクリプトにしました。
使用するときは、
StartCoroutine(WaitAnimationEnd(任意のAnimator, 任意のAnimation名));
とします。
“StartCoroutine();”がコルーチン開始の方法となります。