【Unity】foreach文とは?配列などの全要素を取り出してループ処理を作れる

foreach文とは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「foreach文ってなに?」

「foreach文を使うとどんなことができるの?」

というお悩みの方に向けた内容となっています。

Unityで使うC#では、スクリプト内でforeach文を使ってループ処理を作ることができます。

このforeach文とは、配列やコレクション(ListやDictionary)などの要素を順番に全て取り出して、その要素ごと処理を実行できる記述方法です。

配列やコレクションにおける繰り返し処理では、for文を用いて書くことが多いですが、全ての要素を取り出した処理を作る場合は、foreach文の方が簡潔に書くことができます。

そこでこのページでは、UnityのC#で使えるforeach文について、どんなことができるのか、また使い方や実用例までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

foreach文とは?

まずは、foreach文でできることや仕組みについて紹介していきます。

配列やコレクションの要素を順番に全て取り出せる

foreach文とは、配列やコレクション(ListやDictionary)で管理している要素を全て取り出して、繰り返し処理を作ることができる記述方法です。

そもそも配列コレクションというのは、複数の変数を扱う仕組みのことで、それぞれの要素に値を入れて管理しています。

foreach文は、この複数の変数を持つ配列やコレクションから、一つずつ要素を順番に取り出して、処理を作っていくことができます。

例えば、上記のようにint型の配列を作っていた場合に、foreach文を使うことで、上から順番に全ての要素の数値を表示させていくといった処理を作ることができます。

なお、配列やコレクションについては、以下のページも参考にしてみてください。

for文よりも簡単にループ処理を作れる

配列やコレクションの要素は、for文でも同じように繰り返し処理を作ることができますが、全ての要素を取り出すような場合は、foreach文の方が簡潔に記述することができます。

例えば、int型の配列を作り、それぞれの要素を取り出して繰り返しの処理を作ってみます。

以下は、for文で作った処理になります。

using UnityEngine;

public class Sample : MonoBehaviour
{
    int[] num = { 10, 26, 9};   // 配列を初期化

    void Start()
    {
        // for文で繰り返し処理を作る
        for (int i = 0; i < num.Length; i++)
        {
            Debug.Log(num[i]);
        }
    }
}

for文で作る際は、何回処理を繰り返すのかを10行目で「配列の変数名.Length」と記述して、全ての要素数を取得しておくことで、その要素の数だけ繰り返すという処理を作っています。

一方で、foreach文で作る場合は以下のようになります。

using UnityEngine;

public class Sample : MonoBehaviour
{
    int[] num = { 10, 26, 9};   // 配列を初期化

    void Start()
    {
        // foreach文で繰り返し処理を作る
        foreach (int i in num)
        {
            Debug.Log(i);
        }
    }
}

foreach文の詳しい記述方法は後ほどまとめていますが、for文のように要素の数を取得する必要がなく、ループ処理を作ることができているのが分かります。

そのため、配列やコレクションの要素を全て順番に取り出して処理を作りたい場合は、foreach文の方が非常に分かりやすい記述になります。

ただし、取り出す順番を変えたり、取り出す要素数を指定するような場合は、for文の方が細かく指定することができます。

foreach文の使い方

ここからは、foreach文の使い方について紹介していきます。

要素を取り出して変数に代入し記述していく

foreach文を使って配列などの要素を取り出して処理を作る場合は、以下のように記述して使います。

foreach (型名 変数名 in 配列やコレクションの変数名)
{
// ループしたい処理を記述
}

foreachを使う場合、配列やコレクションの要素を取り出して、それをforeachの後ろで宣言した変数にinを使って代入、そして中に記述した処理を要素の数だけ実行していくという仕組みになっています。

例えば、配列を使ったスクリプトの中で、以下のようにforeachで要素の値を2倍にして表示させるという処理を作ってみます。

using UnityEngine;

public class Sample : MonoBehaviour
{
    float[] num = { 5.4f, 16.13f, 4.55f, 30.03f, 3.4f};   // 配列を初期化

    void Start()
    {
        // foreach文で繰り返し処理を作る
        foreach (float n in num)
        {
            Debug.Log(n * 2);   // 代入した値を2倍にして表示する処理
        }
    }
}

10行目のforeachの後ろで、float型の変数nを宣言していて、この変数の中に配列のそれぞれの値が順番に代入されます。

そして、その度に中に記述したnの値を2倍にして表示させるという処理が実行されていきます。

実際にプログラムを実行してみると、

上記のように配列内の値が全て2倍で表示されているのが分かります。

ちなみに、コレクションのListを使った場合は、以下のようになります。

using System.Collections.Generic;   // Listを使う際に必要
using UnityEngine;

public class Sample : MonoBehaviour
{
    List<float> num = new List<float>() { 5.4f, 16.13f, 4.55f, 30.03f, 3.4f};   // Listを初期化

    void Start()
    {
        // foreach文で繰り返し処理を作る
        foreach (float n in num)
        {
            Debug.Log(n * 2);   // 代入した値を2倍にして表示する処理
        }
    }
}

配列と同様に、11行目でfloat型の変数を作り、その変数の中に要素の値が代入されて、繰り返して処理が実行されることになります。

ボールを順番に移動させる処理

ここでは、実際にforeach文を使ってゲーム内の複数のボールを順番に移動させるという処理を作ってみます。

以下のように、ボールを5つ準備しておき、それぞれのオブジェクトに対して、移動用のスクリプトを紐づけておきます。

using UnityEngine;

public class BallController : MonoBehaviour
{
    public bool isMoving = false;   // ボールを動かすかどうかを判定する変数

    void Update()
    {
        if (isMoving)
        {
            transform.Translate(0.02f, 0, 0);   // ボールを横に移動させる処理
        }
    }
}

5行目で定義したbool型の変数isMovingがtrueになると、ボールが横に移動していくという仕組みになっています。

そして、空オブジェクトを作成して、以下のスクリプトをアタッチしておきます。

using System.Collections;   // コルーチンを使うのに必要
using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject[] balls;  // GameObject型の配列を宣言しておく

    void Update()
    {
        // スペースキーを押した場合
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(BallShot()); // コルーチンを開始する
        }
    }

    IEnumerator BallShot()
    {
        // ボールを移動させるループ処理
        foreach (var b in balls)
        {
            b.GetComponent<BallController>().isMoving = true;   // 変数をtrueに変更して移動させる
            yield return new WaitForSeconds(1.0f);  // 1秒間待機させる
        }
    }
}

スクリプトの中の6行目で、GameObject型の配列をpublicを付けて定義していて、この中にボールのゲームオブジェクトをインスペクターウィンドウから入れておきます。

そして、スペースキーを押した処理の中の13行目で、BallShotというコルーチンを呼び出しておきます。

BallShotのコルーチンの中の20行目でforeach文を使って、配列に入れたオブジェクトのisMovingの変数をtrueに切り替えて、移動処理が順番に行われるようにループ処理を行っています。

なお、23行目で一つ移動処理が実行されたら、WaitForSecondsを使って1秒待機させてから次の移動処理を開始するように記述しています。

これでゲームを実行してみると、

上記のように、スペースキーを押すと、配列に設定していたゲームオブジェクトが1秒ごとに移動し始めているのが分かります。

まとめ

このページでは、UnityのC#で使えるforeach文について、どんなものなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

foreach文とは、配列やコレクション(ListやDictionaryなど)の全ての要素を取り出して、要素ごとに処理を繰り返し行ってくれる記述方法です。

for文よりも簡潔に書くことができるので、全要素を取り出したい場合などは便利に活用することができます。

ただし、逆順に取り出したい場合や、条件を付けて取り出すような場合は、for文の方が細かく指定できるので、その都度どちらを使うべきか考えていきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント