【C#入門】繰り返し処理(for文・foreach文・while文)の使い方!同じ処理の反復を自動化しよう

C# 繰り返し処理 C#プログラミング入門

この記事は「Unityでゲームを作るうえで必要なC#プログラミングの基礎知識」を解説するシリーズの第三弾で、今回は繰り返し処理について詳しくご説明するという内容になっています。

Unityでゲームを作る際にはC#によるプログラミングは避けて通れないので、プログラミングが苦手だなぁという方は本シリーズをご覧いただき基礎知識を学んで頂ければと思います。

繰り返し処理とは?

まずはじめに、繰り返し処理について簡単にご説明しようと思います。といっても、これは読んで字のごとくで「同じことを何度も繰り返す処理」のことを指します。

プログラミングをしていると同じ処理を繰り返したくなることがあるのですが、このときもし繰り返し処理を行えるような構文がなければ、プログラムは上から下へ流れるだけなので同じ処理を行うためのコードを何度も書く必要があってすごく不便です。そこでC#を含む多くのプログラミング言語には短いコードで同じ処理を繰り返し行えるような構文が用意されています。

ちなみに余談ですが、プログラミングでは繰り返し処理を行う部分のことをループと呼びます。あとで出てくる用語なので覚えておきましょう。

C#での繰り返し処理の書き方

ではここからC#での繰り返し処理の書き方をご紹介していきます。C#では次の3種類の構文があります。

  • for文
  • foreach文
  • while文

それぞれ詳しく見ていきましょう。

for文の使い方

まずはfor文と呼ばれる繰り返し構文です。for文ではループ変数という変数を使って、繰り返しをカウントしながら同じ処理を反復します。とりあえずサンプルコードをご覧ください。

using UnityEngine;

public class SampleScript : MonoBehaviour
{

    void Start()
    {
        for(int i = 0; i < 3; i++)
        {
            Debug.Log((i + 1).ToString() + "回目の攻撃!");
        }
    }

    void Update()
    {

    }

}

これはコンソールに3回「〇回目の攻撃!」という文章を表示するC#スクリプトです。for文の部分を抜き出すと次のようになっています。

for(int i = 0; i < 繰り返す回数; i++)
{
    ここに繰り返す処理;
}

for文では慣例的にループ変数「i」を使って繰り返しの状態をカウントします(※ループ変数には好きな名前をつけられますが、繰り返し処理を表す「iteration」の頭文字をとってiにする場合がほとんどです)。

ただこれだけだと少し分かりづらいので、もう少し一般化したものも掲載しておきますね。

for (ループ変数の宣言; ループ変数の条件式; ループ変数の更新)
{
    ここに繰り返す処理;
}

ではfor文の考え方の流れを説明すると次のようになります。

  1. まずループ変数を宣言し、初期値を入れます。ほとんどの場合は「i = 0」となります。
  2. ループ変数の条件式を書きます。例えば「i < 3」であれば、(1番でiの初期値を0としたので)iが0~2の間だけ処理が繰り返されます。
  3. ループ変数をどのように更新するかを指定します。ほとんどの場合は「i++」、つまりループ処理を1回終えたらiが1だけ加算された状態となります。

まだちょっとピンとこないかもしれないので、最初のサンプルコードのループ部分の流れを一緒に追ってみましょう。

  1. ループ処理に入った時はi=0です。
  2. 最初のループではi=0で、「1回目の攻撃!」と表示されます。ループを終えるとiが1加算されるので、i=1になります。
  3. 次のループではi=1で、「2回目の攻撃!」と表示されます。ループを終えるとi=2になります。
  4. 3回目のループではi=2で、「3回目の攻撃!」と表示されます。ループを終えるとi=3になります。
  5. i=3になったので条件式(i<3)が偽になります。この時点でループを抜けます。

こんな感じでfor文は少し複雑なのですが、流れを一つ一つ丁寧に追っていくと理解しやすいと思います。ぜひじっくりと理解を深めていっていただければと思います。

foreach文の使い方

さて次はforeach文です。foreach文は配列等の要素を一つ一つ順番に取り出して調べるときに便利な構文となっています。まずはサンプルスクリプトを見てみましょう。

using UnityEngine;

public class SampleScript : MonoBehaviour
{

    string[] fruits = { "りんご", "みかん", "バナナ" };

    void Start()
    {
        foreach(string fruit in fruits)
        {
            Debug.Log(fruit);
        }
    }

    void Update()
    {

    }

}

foreach文の部分を抜き出すと次のようになっています。

foreach(型名 変数名 in 配列名)
{
    ここに繰り返す処理;
}

foreach文では指定した配列から一つ要素を取り出し、指定した変数に代入して処理を実行します。for文と比べると配列を使った繰り返し処理をスッキリと書けるのが特徴です。参考までに上のサンプルコードをfor文で書いた場合の例を掲載しておきますね。

using UnityEngine;

public class SampleScript : MonoBehaviour
{

    string[] fruits = { "りんご", "みかん", "バナナ" };

    void Start()
    {
        for(int i = 0; i < fruits.Length; i++)
        {
            Debug.Log(fruits[i]);
        }
    }

    void Update()
    {

    }

}

while文の使い方

それから三つ目の繰り返し構文はwhile文です。while文は他の2つとは違って繰り返す回数が最初から決まっていない場合に使います。まずはサンプルスクリプトをご覧ください。

using UnityEngine;

public class SampleScript : MonoBehaviour
{

    float playerBulletPosition = 0;
    float playerBulletSpeed = 1;
    float enemyPosition = 10;

    void Start()
    {
        while(playerBulletPosition < enemyPosition)
        {
            playerBulletPosition += playerBulletSpeed;

            Debug.Log("敵キャラまでの距離:" + (enemyPosition - playerBulletPosition).ToString());
        }

        Debug.Log("命中!");
    }

    void Update()
    {

    }

}

これは直線状にいる敵に向かってプレイヤーが弾を飛ばし、命中するまで「敵キャラまでの距離:〇」とコンソールに表示するサンプルスクリプトです。while文の部分を抜き出すと次のようになっています。

while (条件式)
{
    ここに繰り返す処理;
}

while文では条件式が真(true)の間だけ処理を繰り返します。

なお注意点として、while文は繰り返し処理が永遠に終わらない「無限ループ」になる可能性があります。while文の処理がどこかのタイミングで終了するか、処理の間に待ち時間を設ければ問題はありませんが、1フレームの間に無限ループから抜け出せないとUnityエディタが強制終了する可能性があるので気を付けましょう。

繰り返し処理の使い分けについて

さてここまで3種類の繰り返し構文をご紹介してきましたが、初心者の方からしたら「一体どれをどんな時に使えばいいんだっけ?」と混乱してしまいますよね。

そこでおさらいとして繰り返し処理の使い分けをまとめておきましょう。一般的には次のように使い分けを行います。

  • for文:あらかじめ繰り返す回数が決まっている時や、配列等を扱う繰り返し処理の中でインデックスを使いたいときに使用。
  • foreach文:配列などデータの集まりを一つずつ順番に見ていきたいときに使用。
  • while文:繰り返す回数が最初から決まっていない場合に使用。

一番汎用性が高いのがfor文なのでとりあえずfor文だけでもマスターしておくと便利かなと思います。その他はforeach文はたまに使う程度で、個人的にはwhile文はほとんど使いません。ただ全く使わないということもないと思うので一応覚えておいていただければ損はないかなと思っています。

おわりに

以上、C#での繰り返し処理の使い方について一通りご説明しました。

繰り返し処理を使いこなせるようになると面倒な処理もサクッと行うことができて便利ですし、プログラムの自由度も増すので、ぜひ上記の内容を参考にして使い方をマスターしていただければと思います。