スポンサーリンク
Unity C#・スクリプト実装

Unity初心者でもできる!簡単インベントリシステムの作り方

Unity C#・スクリプト実装

【初心者向け】Unityでインベントリを作る方法|シンプル構成で動く基本実装を解説

Unityでゲームを作っていると、
「インベントリって結局どう作ればいいの?」と悩むことはありませんか?

RPGや脱出ゲーム、アクションゲームなど、
アイテム管理が必要な場面は多いものの、
調べてみると設計の話が難しかったり、
いきなり高度な実装例が出てきて戸惑うことも多いと思います。

この記事では、Unity初心者の方でも理解しやすいように、
ScriptableObjectを使いながら、
できるだけシンプルな構成でインベントリを実装する方法を解説します。

UI表示とアイテム管理に絞り、
「まずは動くインベントリを自分で作れるようになる」ことをゴールにしています。

チュートリアルを一通り終えたあと、
次に何を作ればいいか迷っている方にとって、
ちょうどよいステップアップになる内容です。

Unity(2022 / 2023 以降)で使える シンプルで拡張しやすいインベントリシステムの作り方を解説します。

初めてUnityでインベントリを作る方でも安心して取り組める内容になっています。一緒に簡単なインベントリシステムを作り上げていきましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!

  1. 1. Unityのインベントリとは?初心者向けに仕組みを解説
    1. インベントリでできること
    2. 初心者がつまずきやすいポイント
    3. 今回の記事で扱うインベントリの考え方
  2. 2. 準備:インベントリ用アイテムを作成しよう
    1. ステップ1:アイテム用画像を用意する
    2. ステップ2:画像の設定(Sprite設定)
    3. ステップ3:UIにアイテム画像を配置する
  3. 3. アイテムデータを管理する仕組みを作る
    1. ステップ1:アイテムデータをスクリプトで管理する考え方
    2. ステップ2:ScriptableObject用のスクリプトを作成
    3. ステップ3:スクリプトを編集
    4. ステップ4:アイテムデータを作成
  4. 4.アイテムに機能を追加する
    1. 1.アイテム用スクリプトを作成
    2. 2.スクリプトをアタッチする
    3. 3.ボタンでアイテムを使えるようにする
    4. 4.アイテムの動作確認
    5. 5.アイテムをPrefab化
  5. 5. インベントリシステムのUI作成
    1. ステップ1:インベントリの背景を作成
    2. ステップ2:スロットUIの作成
    3. ステップ3:スロットをPrefab化する
    4. ステップ4:スロットを整列させる
  6. 6. インベントリスクリプトの実装
    1. ステップ1:Inventoryスクリプトの作成
    2. ステップ2:InventoryUIスクリプトの作成
    3. ステップ3:Slotスクリプトの作成
    4. ステップ4:スクリプトをオブジェクトにアタッチ
  7. 7.インベントリの動作確認
  8. おすすめのアセット
  9. おわりに
  10. あわせて読みたい
  11. よくある質問(Q&A)
    1. 関連記事:

1. Unityのインベントリとは?初心者向けに仕組みを解説

Unityでゲームを作る中でよく登場する「インベントリ」とは、
プレイヤーが所持しているアイテムをまとめて管理する仕組みのことです。

RPGでの回復アイテム、脱出ゲームでの鍵やヒントアイテム、
アクションゲームでの装備品など、ジャンルを問わず多くのゲームで使われています。

インベントリでできること

インベントリがあることで、ゲーム内では次のようなことが可能になります。

  • アイテムを取得して一覧として保存する
  • 所持しているアイテムをUIで表示する
  • アイテムを使用・消費・削除する
  • 特定のアイテムを持っているかを判定する

「アイテムを取る → 持つ → 使う」という一連の流れを実現するための、
基盤となる仕組みがインベントリです。

初心者がつまずきやすいポイント

インベントリは便利な反面、初心者の方が最初につまずきやすい要素でもあります。

  • アイテムの情報をどこで管理すればいいか分からない
  • UIとデータの関係がイメージしづらい
  • 設計の話が急に難しく感じてしまう

特に調べてみると、
ScriptableObjectを前提とした高度な設計例や、
拡張性を重視した構成が紹介されていることも多く、
「いきなり全部理解するのは大変そう…」と感じる方も多いはずです。

今回の記事で扱うインベントリの考え方

この記事では、ScriptableObjectを使いながらも

  • アイテムの定義はScriptableObjectでシンプルに管理
  • 所持アイテムはListで分かりやすく扱う
  • Unity標準UIを使った基本的なインベントリ表示

といったように、
初心者でも全体の流れを追いやすい構成でインベントリを実装していきます。

ScriptableObjectを使っていますが、
複雑な設計パターンや抽象化は行っていません。

「ScriptableObjectってこうやって使えばいいんだ」
と感覚をつかむことを目的に、まずは動くインベントリを作っていきましょう。

次の章では、今回作成するインベントリが
どんな構成になっているのかを、全体像から整理していきます。


2. 準備:インベントリ用アイテムを作成しよう

インベントリシステムを作るには、まずゲーム内で扱う「アイテム」を準備する必要があります。このセクションでは、Unityでアイテムを作成する手順をわかりやすく解説します。


ステップ1:アイテム用画像を用意する

  1. アイテムとして使用する画像を用意します。
    • たとえば、ポーション、鍵、コインなどの画像を準備します。
    • いらすとやなどの無料素材サイトを活用するのもおすすめです!
  2. 用意した画像をUnityプロジェクトの「Assets」フォルダにドラッグ&ドロップしてインポートします。

ステップ2:画像の設定(Sprite設定)

インポートした画像の設定を変更して、ゲーム内で使用できるようにします。

  1. 画像を選択し、「Inspector」ビューで設定を確認します。
  2. Texture Typeを「Sprite(2D and UI)」に変更します。
  3. 右下の「Apply」ボタンをクリックして設定を保存します。

ステップ3:UIにアイテム画像を配置する

次に、UnityのUI機能を使って、画面にアイテムを表示できるようにします。

  1. Hierarchyビューで右クリックし、「UI」→「Image」を選択して画像を表示するためのUIを作成します。
  2. 作成したImageを選択し、「Inspector」ビューで「Source Image」に用意したアイテム画像を割り当てます。
    • ドラッグ&ドロップでも簡単に設定できます!
    • 今回は3種類分作成しました。



3. アイテムデータを管理する仕組みを作る

アイテムを効率よく管理するためには、UnityのScriptableObjectという便利な機能を使います。この方法を使うと、アイテムごとのデータ(名前や画像など)を簡単に管理できます。


ステップ1:アイテムデータをスクリプトで管理する考え方

ScriptableObjectは、アイテムやキャラクターの情報などを効率的に管理するためのデータ構造です。一度作成すれば、複数のアイテムで使い回しが可能で、プロジェクト全体を整理しやすくなります。


ステップ2:ScriptableObject用のスクリプトを作成

  1. Projectビューで右クリックし、「Create」→「C# Script」を選択します。
  2. 新しいスクリプトに「Item」と名前を付けて作成します。

ステップ3:スクリプトを編集

作成したスクリプトをダブルクリックして開き、以下のコードを入力します。

using UnityEngine;

[CreateAssetMenu(fileName = "New Item", menuName = "ScriptableObject/Create Item")]
public class Item : ScriptableObject
{
    // アイテムの名前(Object.name を隠す)
    public new string name = "New Item";

    // アイテムのアイコン
    public Sprite icon = null;

    // アイテムの使用
    public void Use()
    {
        Debug.Log(name + "を使用しました");
    }
}

コードのポイント

  • [CreateAssetMenu]
    • ScriptableObjectを簡単に作成できるメニューを追加する属性です。
    • menuNameでメニュー内の表示名を指定できます。
  • nameicon
    • アイテムの名前や画像を管理するプロパティです。
  • Use() メソッド:
    • アイテムを使用した際に実行される処理を記述します(この例ではコンソールにメッセージを表示)。

ステップ4:アイテムデータを作成

  1. Projectビューで右クリックし、「Create」→「ScriptableObject」→「Create Item」を選択します。
  2. 新しいアイテムデータが作成されます。
  3. 作成したアイテムを選択し、「Inspector」ビューで以下を設定します:
    • 名前(例:mikan)
    • アイコン(インポートしたみかんの画像)
  4. これを3つのアイテムの分作成します。



4.アイテムに機能を追加する

次にアイテムに取得する機能を追加して設定をしていきます。

1.アイテム用スクリプトを作成

  1. Projectビューで右クリックし、「Create」→「C# Script」を選択します。
  2. 新しいスクリプトに「PickUpItem」と名前を付けて作成します。
  3. スクリプトを開いて以下のコードを入力します。
using UnityEngine;
using UnityEngine.UI;
public class PickUpItem : MonoBehaviour
{
    //Itemデータを入れる
    public Item item;

    void Start()
    {
        //設定したアイコンを表示させる
        GetComponent<Image>().sprite = item.icon;
    }

    //インベントリにアイテムを追加
    public void PickUp()
    {   
        // スクリプト「Inventory」を作成するまでコメントアウトにしておく
        //Inventory.instance.Add(item);

        Debug.Log(item.name + "を入手しました");

        Destroy(gameObject);
    }
}

2.スクリプトをアタッチする

  • 作成したスクリプトを三種類のアイテムにアタッチします。
  • インスペクター画面からItem欄にスクリプタブルオブジェクトとして作成したデータをそれぞれアタッチします。

3.ボタンでアイテムを使えるようにする

  • 三種類のアイテムにインスペクター画面の「addComponent」から「Button」コンポーネントを追加します。
  • 「OnClick」に「PickUpItem」スクリプトの「PickUp」関数を設定します。

4.アイテムの動作確認

すべてのアイテムに設定が完了したら一度動作をチェックしてみましょう!

クリックするとログが表示されて、アイテムが消えるはずです。

5.アイテムをPrefab化

最後に、作成したアイテムをPrefab化して再利用しやすくします。

  1. Hierarchyビューで作成したImageを「Project」ビューの任意のフォルダにドラッグ&ドロップします。
  2. これでPrefabとして保存され、他のシーンやゲームオブジェクトで使い回せるようになります。
  3. これらのPrefabを再配置する場合は「Canvas」の子オブジェクトとして配置してください。



5. インベントリシステムのUI作成

次に画像のようなインベントリのUI作っていきます。まずインベントリの背景(画像の緑の部分)を作成します。

InventoryPanel緑色の部分(インベントリの背景)
UseButton白の部分(アイテムを使用するボタン)
IconImage灰色の部分(アイテムの画像)
RemoveButton赤の部分(アイテムを消去するボタン)

ステップ1:インベントリの背景を作成

  1. Hierarchyビューで「Canvas」を右クリックして「CreateEmpty」を作成して名前を「Inventory」にします。
  2. 「Inventory」を右クリックして「UI」→「Panel」を選択し名前を「InventoryPanel」にします。
  3. 「InventoryPanel」の色やサイズを調整して、インベントリ全体の背景を作成します。

ステップ2:スロットUIの作成

  1. スロット用の空オブジェクトを作成
    • Hierarchyビューで「InventoryPanel」を右クリック→「Create Empty」を選択し、名前を「Slot」に変更します。
  2. アイテムを使用するボタンを作成(白の部分)
    • 「Slot」を右クリック「UI」→「Button」を作成し、名前を「UseButton」にします。
    • 「UseButton」についている「Text」を消去してサイズを調整します。
  3. アイテムのイメージを表示するUIを作成(灰色の部分)
    • 「UseButton」の子オブジェクトとして「UI」→「Image」を作成し、名前を「IconImage」にします。
    • インスペクターからサイズを「UseButton」より一回り小さくなるように設定します。
  4. 削除ボタンの追加(赤の部分)
    • 「Slot」を右クリック→「UI」→「Button」を選択。
    • ボタンの名前を「RemoveButton」に変更し、サイズを調整します。
    • ボタンの「Text」オブジェクトを選択し、表示文字を「X」などに変更します。

ステップ3:スロットをPrefab化する

  1. SlotをPrefabにする
    • Hierarchyビューから「Slot」をProjectビューの適切なフォルダ(例:「Prefabs」フォルダ)にドラッグ&ドロップします。
    • これで、複数のスロットを再利用できるようになります。
  2. スロットの複製
    • Prefab化した「Slot」を複製して、InventoryPanel内に複数のスロットを配置します。

ステップ4:スロットを整列させる

  1. Grid Layout Groupの追加
    • 「InventoryPanel」を選択し、「Add Component」で「Grid Layout Group」を追加します。
    • 「Grid Layout Group」の設定で、以下を調整します:
      • Cell Size:スロットの大きさ(例:50×50)。
      • Spacing:スロット同士の間隔(例:5×5)。
  2. スロットの追加
    • 作成した「Slot」Prefabを「InventoryBackground」の子オブジェクトとして複数配置します。
    • Grid Layout Groupが自動的に整列してくれます。



6. インベントリスクリプトの実装

ここでは、インベントリを動かすためのスクリプトを実装します。以下の3つのスクリプトを作成し、それぞれの役割を説明します:

  1. Inventoryスクリプト:アイテムを管理する。
  2. InventoryUIスクリプト:UIを更新する。
  3. Slotスクリプト:個々のスロットを管理する。

ステップ1:Inventoryスクリプトの作成

  1. 新しいC#スクリプトを作成
    • Projectビューで右クリック→「Create」→「C# Script」を選択。
    • 名前を「Inventory」にします。
  2. コードを記述 以下のコードを入力します:
using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour
{
    public static Inventory instance; // シングルトンパターン
    private InventoryUI inventoryUI;  // UI更新用の参照

    // アイテムリスト
    public List<Item> items = new List<Item>();

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    private void Start()
    {
        inventoryUI = GetComponent<InventoryUI>();
        inventoryUI.UpdateUI();
    }

    // アイテムを追加
    public void Add(Item item)
    {
        items.Add(item);
        inventoryUI.UpdateUI();
    }

    // アイテムを削除
    public void Remove(Item item)
    {
        items.Remove(item);
        inventoryUI.UpdateUI();
    }
}

ポイント

  • instance:インベントリをどこからでも呼び出せるようにするためのシングルトンパターン。
  • AddRemove:アイテムの追加・削除時にUIを更新します。

ステップ2:InventoryUIスクリプトの作成

  1. 新しいC#スクリプトを作成
    • 名前を「InventoryUI」にします。
  2. コードを記述 以下のコードを入力します:
using UnityEngine;

public class InventoryUI : MonoBehaviour
{
    public Transform inventoryPanel;  // スロットを格納するパネル
    private Slot[] slots;             // スロットの配列

    private void Start()
    {
        slots = inventoryPanel.GetComponentsInChildren<Slot>();
    }

    // UIを更新
    public void UpdateUI()
    {
        Debug.Log("UIを更新中...");
        for (int i = 0; i < slots.Length; i++)
        {
            if (i < Inventory.instance.items.Count)
            {
                slots[i].AddItem(Inventory.instance.items[i]);
            }
            else
            {
                slots[i].ClearItem();
            }
        }
    }
}

ポイント

  • inventoryPanel:Grid Layout Groupで整理されたスロットを格納。
  • UpdateUI:アイテム数に応じてスロットを更新。

ステップ3:Slotスクリプトの作成

  1. 新しいC#スクリプトを作成
    • 名前を「Slot」にします。
  2. コードを記述 以下のコードを入力します:
using UnityEngine;
using UnityEngine.UI;

public class Slot : MonoBehaviour
{
    public Image icon;               // アイテムのアイコン
    public GameObject removeButton;  // アイテムを削除するボタン
    private Item item;               // スロットに格納されるアイテム

    // アイテムを追加
    public void AddItem(Item newItem)
    {
        item = newItem;
        icon.sprite = newItem.icon;
        icon.enabled = true;
        removeButton.SetActive(true);
    }

    // アイテムをクリア
    public void ClearItem()
    {
        item = null;
        icon.sprite = null;
        icon.enabled = false;
        removeButton.SetActive(false);
    }

    // アイテムの削除
    public void OnRemoveButton()
    {
        Inventory.instance.Remove(item);
    }

    // アイテムを使用
    public void UseItem()
    {
        if (item == null) return;
        item.Use();
    }
}

ポイント

  • AddItem:アイテムをスロットに追加。
  • ClearItem:スロットを空にする。
  • UseItem:アイテムの使用処理を呼び出す。

ステップ4:スクリプトをオブジェクトにアタッチ

  • Inventoryスクリプト
    • インベントリの背景オブジェクト(Inventory)にアタッチします。
  • InventoryUIスクリプト
    • 同じオブジェクト(Inventory)にアタッチします。
    • Inspectorで「inventoryPanel」にスロットを格納したパネルを設定します。

  • Slotスクリプト
    • スロットPrefabを編集してアタッチします。
    • Inspectorで以下を設定:
      • icon」にスロット内のアイコンイメージを設定。
      • removeButton」に削除ボタンを設定。

  • ボタンの設定
    • RemoveButtonの「OnClick」に「Slot.OnRemove Button」を設定します。
    • UseButtonの「OnClick」に「Slot.UseItem」を設定します。

7.インベントリの動作確認

  1. ゲームを実行して、アイテムをインベントリに追加・削除できるか確認します。
  2. アイテムの使用やUIの更新が正しく動作するかテストします。
  3. PickUpItemスクリプトの//を外してコメントアウトを解除するのを忘れずに!

これでインベントリの基本的な機能が完成です!次は、さらなるカスタマイズや機能追加(例:アイテムの説明表示など)を考えてみるのも良いでしょう。


おすすめのアセット

もし、より高機能なインベントリシステムを手軽に実装したいなら、以下のUnity Asset Storeの有料アセットを検討してみてください:

  • Ultimate Inventory System
    RPGやアクションゲームなど、幅広いジャンルに対応可能な高性能インベントリシステムです。アイテム管理だけでなく、装備やクラフト機能も一括でカバーできます。
  • Inventory Plus: Inventory System
    シンプルで軽量な設計が特徴で、初心者にも扱いやすいのが魅力です。小規模プロジェクトやプロトタイプ制作にもぴったりです。
  • Easy Save
    データの保存や読み込みを簡単に行えるツールです。インベントリの状態を保存し、ゲームを再開してもそのまま使える仕組みを手軽に追加できます。

これらのアセットを導入することで、開発の手間を大幅に削減し、より洗練されたインベントリシステムを短期間で構築できます。Unityでの開発がさらに楽しく、効率的になるので、ぜひ一度チェックしてみてくださいね!


おわりに

この記事では、Unity初心者の方でも簡単に作れるインベントリシステムの基本を紹介しました。アイテムの取得や管理、使用、削除といった基本的な機能を実装するだけでも、ゲームのプレイ体験は大きく向上しますよね!

今回の解説をベースに、もっと高度なインベントリシステムを目指すのも良いでしょう。たとえば、複雑なクラフトシステムやアイテムの分類機能、保存・ロードの仕組みを取り入れることで、さらにリッチなゲームを作ることができます。

インベントリシステムの完成、おめでとうございます!これからのゲーム制作も楽しんでください!🎮✨


あわせて読みたい

インベントリシステムをさらに便利に・実用的に発展させたい方は、以下の記事もぜひご覧ください!


よくある質問(Q&A)

Q
ScriptableObjectとは何ですか?
A

Unityでデータを管理するための特別なクラスです。同じデータを複数のオブジェクトで使い回せるので便利です。

Q
アイテムを使うときに他の処理を追加できますか?
A

はい、ItemスクリプトのUse()メソッドを拡張すれば、好きな処理を追加できます。

Q
スロットを増やしたい場合はどうすればいいですか?
A

Grid Layout Groupの設定を変更し、スロットPrefabを複製すれば簡単に増やせます。


※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク