初心者必見!現場レベルの「ゲーム制作講座PDF」を無料プレゼント中!▶

UnityのC#辞書 | キーでデータを引く

Unity 基礎操作・設定

「アイテム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対応)

Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。

講座を見てみる \ゼロからでもスマホ対応RPGが作れる!/

憧れのアクションゲームに挑戦

Unity 2Dアクションゲーム
の作り方講座(ロックマン風)

★★★★★ (スマホ化・広告実装)

初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。

講座を見てみる \初心者でも本格ACTが完成する!/

3Dゲーム開発の入口はここ

ゼルダ風3Dアクションゲーム
の作り方講座

★★★★★ (スマホ化対応)

「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。

講座を見てみる \初心者でも全16回で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をスマホ向けに作れる!】

Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築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が作れる!】

Unity 2Dアクションゲームの作り方講座(ロックマン風)

  • ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
  • 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
  • スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
  • 敵AI15体・多彩なマップギミック・武器システムを完全実装
  • 完全オリジナルゲームをアセット不使用で素材提供付きで制作

Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。

全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。

「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。

スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!

ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

ゼルダ風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 を登録して引き出すところから試してみてください。

コメント

タイトルとURLをコピーしました