いんでぃーづ

ゲームいろいろ、いろいろ自由

知らないと損する! Unityで使えるC#の配列リスト型4種類

各種データをまとまりで保存しておく場合、まっさきに思いつくのが配列ですが、Unityでは(というか.NETでは)用途別に便利な型を使うことができます。


配列

整数のインデックスに対し一つデータを持っておく、オーソドックスなデータ形式。多くのプログラミング言語にある機能です。
変数を確保するときに素数を決めておく必要があり、存在しないインデックスにアクセスすると実行時エラーが出ます。

Transform[] simpleArray = new Transform[3];

Transform[] array = new Transform[]
{
    transform1,
    transform2,
    transform3
}; 

List

配列と同じような感覚で使えるオブジェクト型です。

何より、要素数に応じて変数を確保しなおす必要がありません

List<Transform> list = new List<Transform>();
list.Add(transform1);
list.Add(transform2);
list.Add(transform3);

Transform target = list[1];    // = transform2 

list.Count;  // = 3

Addメソッドで要素を追加し、配列と同様 [ ] で要素にアクセスします。
素数Countプロパティで取得可能。

配列とList型は、publicにするか[SerializeField]属性をつけることで、インスペクタで値を設定することができます。

public class ListTest : MonoBehaviour {

    public int[] testArray;

    [SerializeField]
    List<Transform> testList;
…

f:id:sugar_affordance:20170118095123p:plain

インスペクタで値を設定することができます。

Dictionary

配列やListはインデックスが整数値のみですが、Dictionary型は好きな型をインデックスとして使うことができます。

Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();

dictionary.Add("item1", transform1);
dictionary.Add("target2", transform2);
dictionary.Add("enemy3", transform3);

Transform target = dictionary["item1"]; // = transform1

例ではstringですが、floatやenumやTransform型さえもKeyとして指定可能。

ValueにもList型などを指定できるので、

Dictionary<int, List<Transform>> dic = new Dictionary<int, List<Transform>>();

のように変則的なリストを作れます。

また、以下のような foreach文 ですべての要素のKey, Valueを列挙することができます。

foreach (KeyValuePair<string, Transform> pair in dictionary)
{
    var key = pair.Key;         // string
    var val = pair.Value;   // Transform
} 

Queue

キューという単語はよく聞くと思います。いわゆる先入れ先出し型のリストです。

Queue<Transform> queue = new Queue<Transform>();

queue.Enqueue(transform1);
queue.Enqueue(transform2);
queue.Enqueue(transform3);

Transform target = queue.Dequeue(); // = transform1 

Enqueueで要素を追加し、Dequeueすると一番最初に追加した要素から取得します。

Dequeueすると取得した要素はリストから取り除かれるので注意。

Stack

Queueとは逆の先入れ後出しリストです。後に入れた要素から取得します。

Stack<Transform> stack = new Stack<Transform>();
stack.Push(transform1);
stack.Push(transform2);
stack.Push(transform3);

Transform target = stack.Pop(); // = transform3 

Pushで追加し、Popで取得。
Queueと同様に、取得した要素はリストから取り除かれます。


今回紹介した型はジェネリックと呼ばれ、使用する場合はソースの先頭に一行追加しておく必要があります。

using System.Collections.Generic;

※参考 https://msdn.microsoft.com/ja-jp/library/system.collections.generic.aspx


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。