【Unity入門】UnityのC#基礎【ループ文】

前回は条件分岐についてやりました。今回もちょっとプログラムらしいことをやってみたいと思います。ループ処理というのができるようになるとできる事がたくさん増えるので覚えましょう。

この記事は本のように順を追って解説しています。この記事は途中のページになります。この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<繰り返し文>

今回は繰り返しの処理を解説していきたいと思います。

同じ処理を繰り返し行いたい場合、長々と何個も同じ文を書かなくても繰り返し文を書く事でスッキリ短く書く事ができます。

同じ処理を繰り返すっていうと「終わりまで繰り返す」みたいな事がまず、頭に思い浮かびそうですが、「全部の中から当てはまるものを探す」みたいな検索機能や「全体に効果を適用する」みたいな拡散機能みたいなものだったり、色々な使い道があるので覚えておくと便利です。

<whileループ>

繰り返し文の中で基本的な物にwhileループというものがあります。

今回もあまり深く考えずにとりあえずやってみましょうか

while

↑のように書いてみてください。実行すると

loop a

と、こういう感じでDebug.Logを1回しか書いてないのに5回表示されている事がわかります。今は5回なので利便性があまり感じられませんが、何百、何千回とか、あと何回するか不明な時などにも便利です。

書き方としては

while ( bool型 )
{
 ループの中身
}

という感じです。bool型がtrueの時ループし続けるという文になります。

ここで注意です。このbool型が一生trueだった場合無限ループという現象に陥ってUnityがフリーズします。こうなったらしょうがないので強制終了しましょう。

例えば

int a = 0;
bool b = a < 5;
while(b)
{
 ++a;
}

とした場合、一見↑と同じに見えますが、無限ループに陥ってフリーズします。

bにはすでにtrueが代入されており、whileループの間この値が変わらないのでフリーズします。

int a = 0;
bool b = a < 5;
while(b)
{
 ++a;
 b = a < 5;
}

と、また代入し直してあげることによって普通に動くようになります。

<Updateとループ文との違い>

以前Updateというのをやりましたが、Updateもループ文なんじゃないの?って疑問が出てくるかもしれませんが、実は全然違います。

Updateは毎フレームUnity側から呼ばれているだけです。
ループ文というのは1フレーム内で全て処理します。

while update

↑のような処理で書いてみましょうか。これで再生すると以前やったみたいに箱が右側に移動していくように思えますが、実際再生すると一瞬で5の位置に移動します。ログを見てみると

loop

確かに1ずつ移動しているのがわかります。ですが、移動経過途中は見えずに一瞬で移動してしまいました。

これは、色々な計算処理→画面に描画までで1フレームだからです。

Update場合、

(計算処理の中で呼ばれる→描画)→(計算処理で呼ばれる→描画)→・・・以下ループ。

という感じで計算結果を反映させて描画を繰り返しています。

ループ文の場合、

(計算処理で呼ばれる→ここでループ→描画)

で終わりです。

描画される前に全てのループを終えてから描画したので一瞬で移動したわけですね。以上のことよりUpdateとループ文は全然違う事がわかります。

<breakとcontinue>

ループ処理は途中で制御することもできます。

break continue

↑のような感じで書いてみてください。

ちょっと恐ろしい書き方をしています。while(true)になっているので絶対に無限ループに突入してしまいそうです。

ですが、実行するとコンソールウィンドウにいきなり10と表示されて終わると思います。なぜでしょうか?感のいい人はもう分かったと思いますが、continueとbreakですね。

continueというのは、これが呼ばれるとここより下の文は実行せずにループ処理に戻ります

↑の例で言うと、aが10より下の時、continueと書いてありますから、aが10より下の時、continueから下の部分が実行されません。aが10より下の間は++aしか実行されていないということになります。そのため、コンソールウィンドウにいきなり10と表示されました。

breakは、これが呼ばれるとループ文を抜けます

while(true)は無限ループを表しますが、breakにより途中で抜けているので無限ループにならずに済んでいるわけです。無限ループに陥ってしまうとフリーズしてしまうのでbreakはとても重宝します。

<do〜while文>

さて、while文で

int a = 0;
while(a> 5)
{
 ++a;
 Debug.Log(a);
}

という風に、「a < 5」を反対にして「a > 5」とした場合どうなるでしょうか。
実行しても何も起きないと思います。

それはまぁ、そうで、「a > 5」がfalseなので何も実行されずに終わったわけです。

{ }の中に入る前に条件判定があって、条件を満たした時{ }の中に入る感じですね。
do〜while文というのはこれを反対にした文です。

do while

↑のように書いてみてください。今度はコンソールウィンドウに1だけ表示されると思います。

「a > 5」はfalseなのでこれはループしないのですが、do〜while文は条件判定を後で行う文です。

そのため、条件に関係なくとりあえず一回やってみて、その後ループするかどうか決める感じになります。while文とどっちを使うのかは状況やお好みといった感じでしょうか

<for文>

forループ

while文、do〜while文は無限ループに陥ってしまうという恐ろしさがありました。ちょっと条件を書き間違えるとフリーズしてしまいます。

フリーズしてUnityを落としてしまった場合、それまでのセーブしてなかったデータがぱーになったりします。

そこでfor文というのを使うと便利なのでやってみましょう。

log for loop

↑のように書きます。

なんか++iでなくi++と書くのがお行儀がいいらしいですが、どっちでも結果は一緒です。

for文はまずループさせるための変数を定義します。

int i = 0というのがそうですね。

whileで使っていたaとおんなじです。

なんか一般的にiと書かれる事が多い(intの略)からこう書いてますが、別にint a = 0と書いてもいいです。

次にループさせるための条件を書きます。 i < 5 の部分ですね。これがtrueの間ループします。

最後にループする前にやる事を書きます。++i の部分ですね。

for(定義 ; 条件 ; ループ時にやる事)
{
}
みたいな感じです。

↑の文をwhile文で書くとこうなります。

int i = 0;
while ( i < 5 )
{
 Debug.Log(i);
 ++i;
}

こう書くのと意味は同じです。

こんなにごちゃごちゃ書くより1行でスッとかけるのでループ条件が簡単なら基本的にfor文を使った方がいいかなと思います。何を使うかはお好みですが、無限ループに入りづらいのでこちらの方がオススメですかね。

for文の無限ループ

ちなみに

for(;;)
{
}

と何も書かない事もできます。が、↑では条件式が入ってないので必ずtrueとして扱われるため

while(true)
{
}

と書くのと同じになってしまい、breakが必要になってきます。これも使い方はお好みでしょうか。

<foreach文>

for文をちょっと便利に扱うのにforeach文というのがあります。これは配列などの要素がたくさんある物を扱うのに便利です。とりあえずやってみましょう。

log foreach

↑のように書くとコンソールには

result foreach

と表示されます。
foreachは複数の要素を持つものを順番に取り出してくれるループ文です。

foreach(取り出したものを仮に入れるもの in 取り出し元)
{
}

と書きます。↑の例ではaの配列の中から要素を取り出して仮にiに入れて使うみたいな感じになります。

これをfor文で書くと

int[] a = {1,2,3,4,5};
for(int i = 0; i < 5; ++i)
{
 Debug.Log(a[i]);
}

となります。

↑の場合だと要素の数がわかっているのであんまりありがたみが薄いですが、要素の数がわかっていない時などは便利です。

ただし、whileやdo whileやforと違ってちょっと重いので、ものすごい数のループをさせる時はちょっと注意してください。

現段階では使いどころがあんまりないですが、後々便利に使える事があるので今は頭の片隅にでも置いておいてください。

<まとめ>

さて、基本的なループ文についてここまでやってきました。長々とプログラミングの基本的な事を解説してきましたが、後1回プログラミングの解説をしたいと思います。プログラミング疲れたって人もいるでしょうが、これが出来るかどうかでやれることに天と地の差が生じるので頑張ってください。

覚えておきたい

・while文
・do while文
・for文     ←多分一番よく使う
・foreach文

<わからない事があったら>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば、また別の勉強方法があるので違った切り口を使ってみるのもいいと思います。

<オススメの本>

本で詳しい解説がされているので書籍を買ってみるというのも手の一つです。最近はKindle版があるので届くまで待つ事もなく場所も取らないのでとても良いです。

<オンラインスクール>

オンラインスクールでは人に質問する事ができるので、行き詰まってしまった方にオススメです。 無料体験もあるので試しに見てみるのも手ですよ




次回はインスタンスについて触れてみたいと思います。




タイトルとURLをコピーしました