「アイテムIDが1001のとき、名前と効果をすぐ出したい」——RPGやインベントリを作り始めると、こんな要望が必ず出てきます。
そのとき役立つのが、C#のDictionary(辞書)です。
キーと値のペアでデータを登録し、キーを渡すだけで値を一瞬で取り出せます。
Listのように番号で順番に探す必要がありません。
この記事では、Dictionaryの基本操作、アイテムマスタの実装例、Listとの使い分けまで整理します。
セーブデータ設計の土台にもつながる内容です。
- アイテム名をif文の連続で管理していて、IDが増えるたびにコードが肥大化している
- DictionaryのAddとキー重複エラーで止まり、原因が分からない
- ListとDictionaryの違いが分からず、どちらを使えばいいか迷う
✨ この記事でわかること
- Dictionaryの基本とキー・値の考え方
- Add・TryGetValue・ContainsKeyの使い方
- アイテムIDから名前や効果を引く具体例
- Listとの使い分け
- よくあるエラーと対処法
- 初心者でも理解できる解説
\プログラミング未経験でも大丈夫!まずは1本作り切ろう/
初心者が最初に選ぶならコレ
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。
憧れのアクションゲームに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。
3Dゲーム開発の入口はここ
ゼルダ風3Dアクションゲーム
の作り方講座
「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。
Dictionaryとは何か
Dictionaryは、キーと値のペアを登録し、キーで値を検索するコレクションです。
System.Collections.Generic名前空間にあり、型を2つ指定して使います。
using System.Collections.Generic;
using UnityEngine;
public class ItemDatabase : MonoBehaviour
{
private Dictionary<int, string> itemNames = new Dictionary<int, string>;
void Start
{
itemNames.Add(1001, "回復ポーション");
itemNames.Add(1002, "鉄の剣");
string name = itemNames[1001];
Debug.Log(name); // 回復ポーション
}
}
Dictionary<int, string>は「int型のキー → string型の値」という意味です。
アイテムID(int)から名前(string)を引く、というゲームでよくある形にぴったり合います。
基本操作:Add・取得・削除
辞書操作で最初に覚えるのは、登録・取得・削除の3つです。
Dictionary<int, ItemData> items = new Dictionary<int, ItemData>;
// 登録
items.Add(1001, new ItemData { name = "回復ポーション", heal = 30 });
// キーが存在するか確認してから取得(安全)
if (items.TryGetValue(1001, out ItemData data))
{
Debug.Log(data.name);
}
// 存在確認だけ
bool exists = items.ContainsKey(1001);
// 削除
items.Remove(1001);
// 件数
int count = items.Count;
存在しないキーを items[key] で直接参照すると、KeyNotFoundExceptionが出ます。
ゲーム中はTryGetValueを使う習慣をつけると安心です。

「キーがあるか分からない」ときは、いきなり角括弧 [] ではなく TryGetValue を選びましょう。
プレイヤーが持っていないアイテムIDを参照する場面で特に効きますよ。
アイテムIDからデータを引く実装例
実際のゲームでは、値に文字列だけでなくクラスや構造体を入れることが多いです。
public class ItemData
{
public string name;
public int heal;
public Sprite icon;
}
public class ItemMaster : MonoBehaviour
{
private Dictionary<int, ItemData> master = new Dictionary<int, ItemData>;
public void Register(int id, ItemData data)
{
if (master.ContainsKey(id))
{
Debug.LogWarning($"ID {id} は既に登録済みです");
return;
}
master.Add(id, data);
}
public bool TryGetItem(int id, out ItemData data)
{
return master.TryGetValue(id, out data);
}
}
起動時にCSVやScriptableObjectからRegisterで流し込み、戦闘やインベントリではTryGetItemで参照する——この形が定番です。
後からセーブデータ(JSONなど)に「所持アイテムIDのリスト」を載せる設計にもつながります。
Listとの使い分け
| 比較項目 | List(リスト) | Dictionary(辞書) |
|---|---|---|
| アクセス方法 | インデックス(0, 1, 2…)で順番に取り出す | キー(IDや名前)を指定して直接取り出す |
| 向いている場面 | 敵の一覧、弾の管理など「今いくつあるか」が変わる集合 | アイテムマスタ、設定テーブルなど「IDで引きたい」データ |
| 検索コスト | 目的の要素を探すにはループが必要 | キーが分かればほぼ一瞬で取得できる |
「フィールドに出ている敵10体」はList、「全アイテム定義100種」はDictionary、と用途で分けると迷いません。
両方を組み合わせて、所持品Listの各IDをDictionaryで名前表示に変換する、という使い方もよくあります。
よくあるつまずき
- キー重複でAdd失敗 → 同じIDを2回Addしない。
Register前にContainsKeyで確認 - using忘れ → using System.Collections.Generic; が必要
- 存在しないキー参照 → items[id] ではなく TryGetValue を使う
- キーの型ミス → Dictionary<int, T>なのに string で検索していないか確認
「アイテム名が表示されない」ときは、登録したIDと参照しているIDが一致しているか、Startの登録タイミングが参照より前かをDebug.Logで確認してください。
セーブデータ設計へのつながり
Dictionaryは、マスタデータ(全アイテム定義)の管理に向いています。
一方、プレイヤーの所持品は「今持っているIDのリスト」としてListで持つ構成がよく使われます。
セーブするときは、所持ListをJSONに変換して保存し、読み込み時にDictionaryで名前表示に変換する——この役割分担が定番です。
後からPlayerPrefsやファイル保存(記事083付近)を学ぶとき、辞書の理解があると設計が楽になります。
// 所持品は List<int>、表示は Dictionary で引く例
List<int> inventory = new List<int> { 1001, 1002 };
foreach (int id in inventory)
{
if (itemMaster.TryGetItem(id, out ItemData item))
{
Debug.Log($"所持: {item.name}");
}
}
マスタと所持を混ぜないこと。
Dictionaryに「プレイヤーが今持っている分だけ」を入れ直すと、定義データとプレイデータの境界が曖昧になり、バグの温床になります。
InspectorやScriptableObjectとの連携
DictionaryはInspectorにそのまま表示されません。
マスタデータの登録方法として、次のような選択肢があります。
- コードでAdd:小規模なテストやプロトタイプ向け。
変更のたびに再コンパイルが必要 - ScriptableObject:アイテム定義をアセット化。
企画者が数値を触りやすい - CSV読み込み:行数が多いマスタ向け。
起動時にDictionaryへ流し込む
どの方法でも、最終的にゲーム中はDictionaryで参照する形に揃えると、戦闘やショップのコードがシンプルになります。
ScriptableObjectのリストをAwakeでDictionaryに変換するパターンは、中規模RPGでよく使われます。
foreachでDictionaryを回すときは、KeyValuePairを使います。
全アイテムをデバッグ表示したいときに便利です。
foreach (var pair in itemNames)
{
Debug.Log($"ID:{pair.Key} 名前:{pair.Value}");
}
KeysやValuesプロパティで、キーだけ・値だけの一覧を取り出すこともできます。
UIのドロップダウンにアイテム名を並べるときなどに活用できます。
マスタ件数が多いゲームほど、Dictionaryの恩恵を実感しやすいです。

最初はアイテム3種類だけの小さな辞書を作り、IDを変えてTryGetValueが動くか試してみてください。
マスタデータの感覚が一気につかめますよ。
記事を読んで「作ってみたい!」と思ったら!初心者でも1本完成できる講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。プログラミング未経験からでも取り組める講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!初心者でもデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも迷わず進められる丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つをまとめて学べるセット講座
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、プログラミング未経験の初心者でも取り組みやすい、ステップバイステップ形式の講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「何から始めればいいかわからない…」という初心者が最初に選ぶ一本として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
ゼロからでもRPGを完成させよう
→ スレスパ風デッキ構築JRPG講座を見てみる
初心者でもスマホ対応のRPGが作れる!まずは1本完成を目指そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!初心者でもスマホ化・広告実装まで対応した本格横スクロールACTが作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。
全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。
「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 「3Dは難しそう」と感じている初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、「3Dゲームは難しそう…」と感じている初心者こそおすすめの入門講座です。
全16回の丁寧な解説で、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを確実に完成まで導きます。スマホ化対応で実機で動かせるため、初めて3Dゲームを作り上げた達成感がひときわ大きい講座です。
「3Dゲームを自分でも作れるか試してみたい」という初心者の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の壁を一気に突破しよう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
全16回でスマホで動くオリジナル3Dゲームを完成させよう!
まとめ
Dictionaryは、キーと値のペアでデータを管理し、キーを指定して素早く値を取り出すコレクションです。
アイテムIDから名前や効果を引く場面で威力を発揮し、Listの「順番・個数管理」と役割分担できます。
マスタデータの設計は、ゲームが大きくなるほど効いてきます。
Addで登録し、取得はTryGetValueを使う——この2点を押さえれば、if文の連鎖から解放できます。
C#のコレクションをゲーム制作と一緒に学びたい方は、Unity入門の森で実践的な流れを追いながら身につけられます。
今日はDictionary<int, string>を1つ作り、アイテムID 1001 を登録して引き出すところから試してみてください。



コメント