『for』文とは
決まった回数だけ処理を繰り返したいときに使用します。
もくじ
1.基本構文
2.構文パターン
3.具体例
4.Unityでの使用例【任意座標のオブジェクトを取得する】
基本構文
1 2 3 4 |
for(初期化;条件式;反復子) { // 処理 } |
※プログラミングは基本的に、すべて半角英数字で記述します。上記では便宜上全角を使用していることをご了承ください。
「初期化」「条件式」「反復子」の3つをもとに、for文を決められた回数だけ繰り返します。
詳しい話は、具体例のスクリプト解説で行っています。
“continue;”を記述することで、
それ以降の処理を無視して、次のループへと進むことができます。
“break;”を記述することで、
for文を抜ける(終了させる)ことができます。
構文パターン
「while」文は以下のような書き方もできます。
「初期化」「条件式」「反復子」の各要素は省略することができます。
「条件式」のみを書いた場合の例です。
1 2 3 4 |
for( ;条件式; ) { // 処理 } |
3つの要素すべてを省略することもできます。
この場合、無限ループすることになります。
これなら、素直にwhile(true)を使ったほうが良いですね。
1 2 3 4 |
for( ; ; ) { if(条件) break; } |
「初期化」と「反復子」は複数の要素を書くことができます。
「初期化」を複数書く場合は、for文の外で変数を定義する必要があります。
for(int x = 0, int y = 0; ; ++x, ++y) と、このように書くことはできません。
1 2 3 4 5 |
int x, y; for(x = 0, y = 0; ; ++x, ++y) { if(条件) break; } |
具体例
それでは具体例を見てみましょう。
例1)基本的な使い方(変数が1つの場合)
1 2 3 4 5 6 7 8 9 10 |
for(int i = 10; i > 0; --i) { if(i == 5) { i -= 5; continue; } Debug.Log(i); } |
例2)変数が2つの場合
1 2 3 4 5 |
int x, y; for(x = 0, y = 10; x < y; ++x, --y) { Debug.Log(x); } |
==:「等しい」, >:「より大きい」, <:「より小さい」
i -= 5;:iを-5する(i = i – 5; を省略した形)
++x;:xの値を+1する
--y;:yの値を-1する
Debug.Log(i):UnityエディタのConsoleに i の値を出力する関数
最初に、例1をもとにfor文の各要素について解説します。
” for(int i = 10 ; i > 0 ; --i) ”
「初期化」の要素となる「int i = 10」では、最初にint型の i を定義して、10で初期化しています。ここで定義した変数 i はfor文の中でのみ利用することができます。
続いて「条件式」の要素となる「i > 0」では、”i > 0″ は「 i が0より大きい」という意味で、これを満たす限りfor文を繰り返すという条件を示しています。
最後に「反復子」の要素となる「 -- i」では、” -- i”は「 i を-1する」という意味ですが、これはfor文が1周終わるごと(次のループの最初)に呼び出されて実行されます。例1では、1周終わるごとに i の値が1ずつ減っていくわけですね。
「反復子」が実行されるのは、1周終わるごとなので、for文開始時の条件判定は、初期化した数値で行われることになります。ですので、初期化に設定した値がすでに条件を満たしていなければ、1度もfor文に入ることなくfor文を抜けることになります。
例1をまとめると、
int型の変数 i を用意して、10で初期化します(「int i = 10」の部分)。i の値が1周するごとに1ずつ減っていき(「 --i」の部分)、i の値が0以下になったとき(「i > 0」の部分)、ループを抜けることになります。
では、改めて例1を見ていきましょう。
上記で説明した通り、i の値がループするごとに1ずつ減少していき、 i の値が0より大きい間はループが続きます。
初期の i の値は10なので、10>0と条件を満たしているのでfor文へと入り、if文は満たしていないのでスルーされ、Consoleに10と表示されます。1周が終わったので、i の値は1減って9になり、次のループへと進みます。
2週目も最初は条件判定から行われ、9>0と条件を満たしているので、再度for文の中へ。
これが繰り返し行われ、最終的に「i >0」を満たさなくなった段階でfor文が終了します。結果、出力されるのは「10,9,8,7,6,」となります。
続いて、例2を見ていきましょう。
「初期化」に2つの変数がありますね。この場合は、for文内で変数の定義はできないので、for文の外で定義を行っています。
変数 x は1周するごとに+1され、変数 y は1周するごとに-1されていきます。で「x < y」を満たさなくなった段階でfor文が終了します。
x は0から1ずつ増えていき、y は10から1ずつ減っていく。ゆえに、x と y がともに5になったときに「x < y」を満たさなくなるのでfor文が終了します。結果、コンソールに出力されるのは「0,1,2,3,4」となります。
Unityでの使用例
Raycastを利用した、任意座標のオブジェクトを取得する関数です。
今回のスクリプトでは、レイヤー名がUIとなっているオブジェクトを取得する関数になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private GameObject GetHitObject(Vector2 _targetPos) { RaycastHit2D[] ray = Physics2D.RaycastAll(_targetPos, new Vector3(0, 0, 1)); for (int i = 0; i < ray.Length; ++i) { if (LayerMask.LayerToName(ray[i].collider.gameObject.layer) == "UI") { return ray[i].collider.gameObject; } } return null; } |
Physics2D.RaycastAll(_targetPos, new Vector3(0, 0, 1)):
指定座標に存在する全オブジェクトの情報を配列で取得
LayerMask.LayerToName(ray[i].collider.gameObject.layer):
raycastで取得したオブジェクトのレイヤー名を取得
ray[i].collider.gameObject:raycastで取得したGameObject
最初に、受け取った座標に存在している全オブジェクトの情報リストを配列で取得しています。for文を使って取得した配列の要素1つ1つのレイヤー名を確認して、レイヤー名が”UI”となっているオブジェクトが存在していればGameObjectを返し、存在していなければnullを返す、といった処理が行われています。