【Unity】List型とは?配列よりも柔軟にデータをまとめて扱える型

C#のListとは? Unity

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

このページでは、

「UnityのList型ってなに?」

「Listは配列とどう違うの?」

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

Unityでスクリプトを書く際に使うC#では、List型と呼ばれる仕組みがあります。

このListとは、配列と同じように複数のデータをひとまとめにして使えるものですが、配列と異なる点として要素数があらかじめ決まっていないのが特徴です。

そのため、Listでは後から要素を追加したり削除したりを行うことができるので、配列よりもより柔軟にデータをまとめることができます。

そこで、このページでは、Unityで使うC#のList型について、どのような型なのか、またListの作り方や使い方についてまとめていきます。

この記事を書いた人

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

List型とは?

まずは、Unityのプログラミング言語のC#で使えるList型について紹介していきます。

配列と同じように複数のデータをまとめている型

List型とは、配列と同じように複数の変数をまとめて管理することができるものになっています。

通常の変数は、一つのデータだけを入れる箱になりますが、Listはこの一つのデータが入っている変数の箱を順番にまとめて管理しているものになります。

Listにおいて、それぞれの変数の箱のことを要素と呼び、またそれぞれの箱毎に0から始まるインデックスで番号が振られています。

なお、配列については、以下の記事で詳しく解説していますので、そちらも参考にしてみてください。

後から要素の追加や削除を行うことができる

Listが配列と異なる大きな点として、Listは後から要素を追加したり削除したりすることができます。

もう少し詳しく説明すると、配列では最初の時点で要素数を決めて、その中にデータを入れていくことになるので、後から配列の要素を増やしたり減らしたりということができません。

しかし、Listの場合は、要素数を決めずに作りデータを入れていくことになるので、新しく入れたい要素があれば追加、反対にいらない要素があれば削除することができます。

そのため、要素数が決まっていれば配列で良いのですが、どのくらいの数を入れるかが決まっていないという場合は、配列ではなくListを使った方が便利です。

Listの使い方

ここからは、実際にListの使い方について紹介していきます。

Listの基本的な作り方・使い方

まずは、List型をどうやって使うのか、基本的な使い方の部分をまとめていきます。

List型の変数を作成する

Listを作る場合は、以下のように記述していきます。

List<型名> 変数名 = new List<型名>();

例えば、ゲーム内でのスコアなどをListの中で保存していく場合は、

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

public class Test : MonoBehaviour
{
    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する
    }
}

上記の8行目のように書くことで、int型scoreListというListを作ることができます。

また、Listを使う際は1行目のように、

using System.Collections.Generic;

と書いてから使う必要があります。

Listの中に要素を追加する

次に、先ほど作成したListの中に要素を追加していきます。

要素を追加する場合は、Addメソッドを使って以下のように記述します。

Listの変数名.Add(追加するデータ);

例えば、ゲーム内で何度かプレイしたスコアを取得して、それぞれの値をListに追加するといった場合、

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);
    }
}

11行目から17行目のように、それぞれのスコアを一つずつAddメソッドを使って追加することができます。

なお、Addメソッドで追加した順番にインデックスが振られていきます。

Listの要素を取得・表示する

Listのデータをスクリプト内で取得したい場合は、配列と同様に以下のように記述します。

Listの変数名[インデックス]

例えば、先ほどのスコアの中で3番目に追加した要素を取得して表示したい場合は、

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        Debug.Log(scoreList[2]);    // インデックス「2」の要素を取得して表示する
    }
}

19行目のように「scoreList[2]」と記述して取得することができます。

なお注意点として、インデックスは「0」から順番に振られていくことになるため、3番目に追加した要素のインデックスが「2」となります。

また、for文を使うことで、以下のようにListの要素を一括して表示することもできます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

20行目でfor文を使って、0から「scoreList.Count」の数まで繰り返す処理を作っています。

実際にゲームを実行してみると、

インデックスの順番通りに要素が表示できているのがわかります。

なお、配列で要素数を取得する場合は「変数名.Length」、Listで要素数を取得する場合は「変数名.Count」となるので、異なる点に注意しておきましょう。

Listに要素を追加するメソッド

Listに要素を追加できるメソッドとして、

  • Add:Listの最後尾に要素を追加する
  • Insert:指定した場所に要素を追加する

の2つがあります。

Add:Listの最後尾に要素を追加する

Addメソッドは、先ほどの使い方でも説明しましたが、Listに要素を追加する場合によく使うメソッドで、そのListの最後尾に要素を追加していくことになります。

Addメソッドは、以下のように記述して使います。

Listの変数名.Add(追加するデータ);

Insert:指定したインデックスに要素を追加する

Insertメソッドは、指定したインデックスの位置に要素を追加することができるメソッドで、以下のように記述して使います。

Listの変数名.Insert(インデックス, 追加するデータ);

例えば、scoreListのデータのインデックス「3」の位置に新しくデータを追加してみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listに要素を挿入する
        scoreList.Insert(3, 396);

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

20行目でInsertメソッドで追加する処理を行っています。

すると「3」の位置、つまり上から4番目の位置に新しく追加したデータが挿入されているのが分かります。

Listから要素を削除するメソッド

Listに要素を追加できるだけでなく、削除することもできます。

削除できるメソッドとして、

  • Remove:指定したデータの要素を削除する
  • RemoveAt:指定したインデックスの要素を削除する
  • Clear:全ての要素を削除する

の3つがあります。

Remove:指定したデータの要素を削除する

Removeメソッドは、指定したデータと同じ要素を削除することができるメソッドで、以下のように記述して使います。

Listの変数名.Remove(削除するデータ);

例えば、scoreListの中にある「288」のデータを削除する処理を作ってみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listの要素を削除する
        scoreList.Remove(288);

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

20行目でRemoveメソッドを使って削除する処理を書いています。

「288」のデータの要素が削除されているのが分かります。

なお、もし同じデータを持っている要素が複数ある場合にRemoveメソッドを使うと、インデックスが一番小さい要素が一つだけ削除されることになります。

RemoveAt:指定したインデックスの要素を削除する

RemoveAtメソッドは、指定したインデックスの要素を削除することができるメソッドで、以下のように記述して使います。

Listの変数名.RemoveAt(削除するインデックス);

例えば、scoreListの中の「5」のインデックスの要素を削除してみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listの要素を削除する
        scoreList.RemoveAt(5);

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

20行目でRemoveAtメソッドを使い要素を削除する処理を書いています。

一番下の「5」のインデックスの要素が削除されて、表示されているのが分かります。

Clear:全ての要素を削除する

Clearメソッドは、Listの中の全ての要素を削除することができるメソッドで、以下のように記述して使います。

Listの変数名.Clear();

例えば、scoreListの中の全ての要素を削除して、新たにListを一つ追加する処理を作ってみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listの要素を削除する
        scoreList.Clear();

        // Listに要素を追加する
        scoreList.Add(104);

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

20行目でClearメソッドを使って、Listの中身を全て削除する処理を行っています。

また、その後の23行目でAddメソッドを使って、Listの中に要素を追加しています。

最初にListに入れていた要素が全て削除されて、新たに追加した一つの要素しか表示されなくなっているのが分かります。

Listの中から検索するメソッド

Listを使って検索することができるメソッドとして、

  • IndexOf:要素がどこにあるかを検索する
  • Contains:要素があるかどうかを検索する

上記の2つがあります。

IndexOf:要素がどこにあるかを検索する

IndexOfメソッドは、特定のデータを検索して、そのデータがどのインデックスの位置にある要素なのかを教えてくれるメソッドで、以下のように記述して使います。

Listの変数名.IndexOf(検索するデータ);

例えば、scoreListの中にある「508」のデータが、どの位置にあるインデックスなのかを知るためには、

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // インデックスの位置を取得して表示
        Debug.Log("「508」の値はインデックスの「" + scoreList.IndexOf(508) + "」");
    }
}

上記の20行目のように、IndexOfメソッドで引数にデータを与えてあげることで、インデックスの位置が返ってきます。

なお、Listの中に同じデータが複数ある場合は、インデックスの一番小さい位置のみを返してくれます。

Contains:要素があるかどうかを検索する

Containsメソッドは、特定のデータを検索して、Listの中にそのデータがあるかどうかを返してくれるメソッドで、以下のように記述して使います。

Listの変数名.Contains(検索するデータ);

例えば、scoreListの中に「193」と「622」というデータがあるかどうかを探してみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // データがあるかどうかを探す処理
        Debug.Log(scoreList.Contains(193));
        Debug.Log(scoreList.Contains(622));
    }
}

20行目と21行目でContainsメソッドを使って、それぞれのデータがあるかどうかを検索する処理をしています。

データがある場合は「true」、データが無い場合は「false」が返ってきているのがわかります。

Listの順番を並び替えるメソッド

Listの順番を並び替えるメソッドとして、

  • Sort:Listを昇順に並び替えるメソッド
  • Reverse:Listを逆順に並び替えるメソッド

の2つがあります。

Sort:Listを昇順に並び替えるメソッド

Sortメソッドは、Listの順番を昇順、つまり数値なら小さい順、文字ならabc順に並び替えることができるメソッドで、以下のように記述して使います。

Listの変数名.Sort();

例えば、scoreListの中の順番を昇順にして表示させる処理を作ってみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listを昇順に並び替える処理
        scoreList.Sort();

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

20行目でSortメソッドで昇順にする処理を書いています。

インデックスの順番ではなく、要素の値が小さい順に並んで表示できているのがわかります。

Reverse:Listを逆順に並び替えるメソッド

Reverseメソッドは、Listの順番を逆順に並び替えることができるメソッドで、以下のように記述して使います。

Listの変数名.Reverse();

例えば、先ほどSortメソッドで昇順にしたものをReverseメソッドで反対にする、つまりListの順番を降順に並び替えてみます。

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

public class Test : MonoBehaviour
{

    void Start()
    {
        List<int> scoreList = new List<int>();  // Listを作成する

        // Listに要素を追加する
        scoreList.Add(499);
        scoreList.Add(364);
        scoreList.Add(288);
        scoreList.Add(193);
        scoreList.Add(508);
        scoreList.Add(209);

        // Listを昇順に並び替える処理
        scoreList.Sort();

        // Listを逆順に並び替える処理
        scoreList.Reverse();

        // Listの中のデータを全て取得して表示する
        for (int i = 0; i < scoreList.Count; i++)
        {
            Debug.Log(scoreList[i]);
        }
    }
}

Sortメソッドの後の23行目でReverseメソッドを使って、逆順にする処理を書いています。

今度は要素の値が大きい順に並んで表示させることができました。

まとめ

このページでは、Unityで使うC#のList型という仕組みについて、どういうものなのか、Listの作り方から様々な使い方までをまとめていきましたが、いかがでしたでしょうか?

C#のList型とは、配列のように複数の変数のデータをまとめて管理することができる仕組みです。

Listと配列を比較すると、配列は最初に要素数を決めるので増やしたりできませんが、Listは後から追加や削除を簡単に行うことができる、という大きな違いがあります。

また、Listの並び順を変えたり、特定のデータを検索することもできます。

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

コメント