週刊SleepNel新聞

SleepNel所属のぽうひろが日々の個人開発で気になったことを綴ります。

Unity C# DictionaryとListの使いかた(ざっくり)

みなさん、こんにちは。ぽうひろです。

今日はC#プログラミングで役に立つDictionaryとListについて説明します。
f:id:pouhiroshi:20160725171234p:plain:w300

どちらもメモリにデータを保存する入れ物になりますが、
Dictionaryは key(検索キー)とvalue(値)をセットで保存するもの。
Listは順序を持った配列のようなものになります。

Dictionary作成の例

public class Field
{
  //ステージ番号
  public int stageNo;
  //フィールド番号
  public int fieldNo;
  //位置
  public Vector3 pos;
  //角度
  public float rot;
  //ボス名
  public int bossNo = 0;
  //セリフシーンNo
  public int sceneNo = 0;
  //ボス
  public bool isBoss = false;

  public static void InitDic(){
    //Dictionary初期化
    Dictionary<int,Field> dic = new Dictionary<int,Field> ();
    //データ2件登録
    dic.Add (1, new Field{stageNo = 1, fieldNo=1, pos = new Vector3 (-15.0f, 0f, 5.0f), rot = -90f, bossNo = 0 , sceneNo = 1});
    dic.Add (2, new Field{stageNo = 1, fieldNo=2, pos = new Vector3 (-35.0f, 0f, 5.0f), rot = -90f, bossNo = 0 , sceneNo = 0});
    }
}

InitDicというメソッドでDictionaryを初期化し(new)ています。
<int, Field>となっている部分はジェネリックと呼ばれ、最初がキーの型、2つ目がValueの型を指し示しています。
Addでデータを登録していますが、第一引数がキーになる値、第二引数がValueになるFieldクラスのデータを登録しています。
データの取り出しはdic[キー]で取得できます。1と2をキーにして登録しましたので、dic[1]、dic[2]などで取り出せます。
キーはstringも使えますので、dic["field1"]のようにPHP連想配列っぽく使うこともできます。

続いてListの例です。

//リスト初期化
List<Field> fields = new List<Field>();
//データ2件登録
fields.Add (new Field{stageNo = 1, fieldNo=1, pos = new Vector3 (-15.0f, 0f, 5.0f), rot = -90f, bossNo = 0 , sceneNo = 1});
fields.Add (new Field{stageNo = 1, fieldNo=2, pos = new Vector3 (-35.0f, 0f, 5.0f), rot = -90f, bossNo = 0 , sceneNo = 0});

Listもジェネリックで登録する値の型を指定できます。
keyはありませんので、ジェネリックは1つだけです。
Addはリストの先頭(インデックス番号は0)から追加されていきます。
データの取り出しはインデックス番号指定になります。
上記の例ですとfields[0]、fields[1]のように指定して取得できます。

これらを応用して、Dictionaryに登録したデータから条件にマッチするデータだけをListで取り出すメソッドを書いてみると、こうなります。(stageNoにマッチするFieldデータをリストで取り出す)

public static List<Field> getFieldList(int stageNo){
	List<Field> result = new List<Field>();
	foreach (Field field in fieldDic.Values) {
		if (field.stageNo == stageNo) {
			result.Add (field);
		}
	}
	return result;
}

foreach (Field field in fieldDic.Values) の部分で、Dictionaryに登録されたデータをループ処理することができます。
if (field.stageNo == stageNo) { でstageNoが引数と同じ時、resultリストにAddしています。

駆け足ですが、DictionaryとListの使い方についてまとめてみました。
この2つを使いこなすと、いろいろなデータを扱いやすくなりますので、ぜひトライしてみてください。

それでは、良いインディー開発ライフを!