【Unity】C#の基本構文『while』

 

『while』文とは

繰り返し処理を行いたいときに使用します。

 

 

もくじ

1.基本構文
2.構文パターン
3.具体例
4.Unityでの使用例【アニメーションの再生終了を待つ】

 

 

基本構文

 

スクリプト

※プログラミングは基本的に、すべて半角英数字で記述します。上記では便宜上全角を使用していることをご了承ください。

 

スクリプトの解説

“while(条件)”の「条件」を満たす限り、while内をループして、

「処理」が繰り返し実行されます。

「条件」を満たさなくなった段階で、while文が終了します。

 

「条件」を”true”とすることで、無限ループさせることができます。

無限ループさせるときは、しっかりとwhile文を抜けられるように

処理を記述する必要があります。

 

“continue;”を記述することで、

それ以降の処理を無視して、再びループの最初に戻ることができます。

 

“break;”を記述することで、

while文を抜ける(終了させる)ことができます。

 

 

構文パターン

「while」文は以下のような書き方もできます。

 

パターン1

「条件」部分を”true”にすることで、無限ループさせることができます。
無限ループさせる場合は、必ず”break;”を入れるなどして
while文を抜けられるようにしてください。

今回の場合は、「条件」を満たすと”break;”が実行され、while文を抜けます。
このとき”break;”より下にある「処理」は実行されません。

 

パターン2

“continue;”を使うことで、次のループへと進むことができます。

今回の場合、「条件」を満たすと次のループへと移行します。
このとき”continue;”より下にある「処理」は実行されません。

 

 

具体例

それでは具体例を見てみましょう。

 

スクリプト

 

使用されている変数・関数

==:「等しい」, >=:「以上」
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の再生終了を待つためのスクリプトです。

 

スクリプト

 

使用されている変数・関数

anim.IsInTransition(0):アニメーションが遷移しているかどうか取得
anim.GetCurrentAnimatorStateInfo(0).IsName(animName):
animNameというアニメーションが再生されているかどうか取得
yield return new WaitForEndOfFrame():レンダリング完了を待つ

 

スクリプトの解説

animationの終了を待つ処理を、

IEnumeratorを利用してコルーチンで行っています。

 

コルーチンとは、1フレーム内では処理が終わらず、

数フレームあるいはそれ以上かけて処理を実行する必要がある場合に

用いられます。

「処理を途中で中断し、再度続きから処理を実行することができる」

というのがコルーチンの特徴です。

コルーチンに関しては、別途詳しく記事を書きたいと思います。

 

上記スクリプトでは、while文の中でアニメーションの状態を取得して、

アニメーションの遷移が完了した時点で、while文が終了するように

なっています。

 

今回使用したスクリプトは、

「アニメーションの遷移が完了したタイミング」を取得しているので、

アニメーションの遷移完了とアニメーションの終了が

同じタイミングでないといけないのがネックです。画像1image1

別のやり方もあるのですが、while文の使用例ということで

このスクリプトにしました。

 

使用するときは、

StartCoroutine(WaitAnimationEnd(任意のAnimator, 任意のAnimation名));

とします。

“StartCoroutine();”がコルーチン開始の方法となります。