【Unity入門】Unityで連想配列を使おう!Dictionary完全攻略

みなさんこんにちは!

フリーランスプログラマーのsatoです。

Unityでプログラムを組んでいくと、配列が登場してきますよね。

しかし配列は動的に要素数を増やしたりすることが、面倒です。

そこでListが登場したりするのですが、今回はもう一歩先に進みDictionaryについて見て行くことにします。

Dictionaryでは連想配列が扱えます。

連想配列は、好きな型でキーが設定できる配列です。

とても便利な配列なのですが、言葉で説明するのは難しいですね…

その有用性はこの先で、実戦形式で見ていきましょう。

今回は以下のような内容を順に見ていきましょう。

[基本] Dictionaryとは?
[基本] Dictionaryを使ってみよう!
[基本] foreachでループさせてみよう!
[応用] 要素の数を取得してみよう!
[応用] 要素を削除してみよう!

きっと使いたくなること請け合いですよ!

目次

Dictionaryとは?

先ほども記述した通り連想配列を扱える仕組みです。

「key(検索キー)」「value(値)」セットで保存することができます。

このkeyには数字以外の型を指定することも可能です。

例えばゲームを作っている時「item_id_array」というアイテムのIDが入った配列があったとしましょう。

配列でアクセスするときは以下のようにアクセスしていますよね。

int item_1 = item_id_array[0]; // 0番目の要素を取り出す
int item_2 = item_id_array[1]; // 1番目の要素を取り出す

これではどれが何のIDなのか、わけがわかりませんね…

しかしDictionaryを使えば、任意の型でキーを設定できます。

例えば文字列をキーとして設定していたら以下のように使用することも可能です。

int item_id_1 = item_id_array["yakusou"];      // キーが"yakusou"の要素を取り出す
int item_id_2 = item_id_array["dokukesisou"];  // キーが"dokukesisou"の要素を取り出す

なかなかわかりやすいんじゃないでしょうか。

これは使い方の一例ですが、キーに任意の型を指定できるというのは、なかなか便利なものですよ!

またListと同じく動的に「要素」と「キー」を追加することができる点もメリットです。

Dictionaryを使ってみよう!

では実際にDictionaryを使っていきましょう。

前は前準備からです。

まずは前準備!

まずDictionaryを使うには「System.Collections.Generic」へアクセスできるようにする必要があります。

難しいことは置いておいて、以下の一文がスクリプトファイルの頭に必要だということです。

using System.Collections.Generic;

とはいえUnityでファイルを新規作成した時には、基本以下の3行が記述されていますよね。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

すでに真ん中の行にありますね!

というわけで、実は基本的には新しく追加の必要はありません。

が、もし消してしまっていたりしている場合は追加をしておきましょう!

宣言してみよう!

では早速変数として宣言してみましょう。

Dictionary<string, int> item_id_array;

先ほどのitem_id_arrayを宣言してみました。

Dictionary<キーの型, 要素の型> 変数名;

キーの型、要素の型を<>の中で指定しているだけですね。

では早速使ってみましょう…と言いたいところですが、これではまだ宣言しただけです。

newして生成する必要があります!

生成しよう!

item_id_array = new Dictionary<string, int>();

他のオブジェクトでもよくnewをして生成しますよね。

Dictionaryも同じで newをして生成する必要があります。

ただしDictionaryを生成する場合、一つ注意点があります。

<>の中身は、宣言した時と同じものにしておきましょう。

これが違うとエラーで弾かれてしまいます。

また宣言と生成は合わせて一行でも行えるので、同時に行いたい時は以下のように記述しましょう。

Dictionary<string, int> item_id_array = new Dictionary<string, int>();

シンプルでいいですね!

要素を追加しよう!

では次に要素を追加します。

item_id_array.Add("yakusou", 1);

要素の追加にはAdd関数を利用することになります。

引数は第一引数にキーを、第二引数に要素を入れるだけです!

【おまけ】生成時に要素を追加したい時

生成時に以下のように初期値として、追加しておくこともできます。

便利な追加方法なので覚えておきましょう!

Dictionary<string, int> item_id_array = new Dictionary<string, int> () {
        {"yakusou", 1},
        {"dokukesisou", 2}
    };

要素を取り出してみよう!

追加が出来たら取り出したいですよね。

取り出すのは非常に簡単です。

int item_id_1 = item_id_array["yakusou"];      // キーが"yakusou"の要素を取り出す
int item_id_2 = item_id_array["dokukesisou"];  // キーが"dokukesisou"の要素を取り出す

「Dictionaryを使ってみよう!」の項目で見た時の通り、キーを[]に入れれば要素が取得することが可能です。

foreachでループさせてみよう!

やはり配列を使い始めて、すぐに必要になる知識はループ文ですよね。

次にforeach文でループさせる方法を見ていきましょう。

全部表示してみよう!

以下はキーも要素も全部取得するループ文です。

foreach (KeyValuePair<string, int> i in item_id_array) {
    string key_name = i.Key;    // キーを取得
    int item_id     = i.Value;  // 要素を取得
}

「KeyValuePair<string, int> i」で定義している変数iに、1ループ分の「キー・要素」を取得しています。

(もちろん、<>の中は、宣言時のものと合わせておきましょう。)

「Key」「Value」というパラメータで、キーと要素を取得することが可能です。

キーだけ取得するには?

キーだけ取得したい場合は以下のループ分を回しましょう。

foreach (string key in item_id_array.Keys) {
    string key_name = key:
}

要素だけ取得するには?

逆に要素だけ取得したい場合は以下の通りです。

foreach (string val in item_id_array.Values) {
    string key_name = val:
}

要素の数を取得してみよう!

要素数を取得したい場合は以下の通りです。

int count = item_id_array.count;

非常にシンプルですね!

for文で回す必要が出てきた場合などに力を発揮してくれるでしょう。

要素を削除してみよう!

全部削除しよう!

item_id_array.Clear();

これだけです。

Clear関数を使用するだけで、全部破棄することが可能です。

一つだけ削除しよう!

キーを指定して一つだけ削除したい時は、Remove関数を使用します。

item_id_array.Remove("yakusou");

キーを指定すれば簡単に削除できます。

Listも合わせて覚えよう!

また合わせてListの記事も読んで、理解を深めておくことをお勧めします。

ListはDictionaryと使い分けることで、さらにうまくデータを管理できるので有用ですよ!

まとめ

今回は、Dictionaryの使い方について、非常に簡単に見てきました。

Unityで色々とデータを管理するには、必須のテクニックです。

ぜひ学んだことを実践しマスターしましょう!

また今回はUnity初心者に向けて、需要の高い部分だけ説明しています。

より深い話を知りたい場合はC#記事で説明していますので、こちらもご覧ください。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次