UnityUnityメモ

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

Unity

はじめに

Unityでゲームを作るとき、アイテムを管理する「インベントリシステム」はとても便利な機能です。脱出ゲームやRPGなど、さまざまなジャンルで必要になることが多いですよね。

この記事では、初心者の方でも簡単に作れる「基本的なインベントリシステム」の作り方をわかりやすく解説します。

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

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

1. 準備:アイテムの作成

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


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

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

ステップ2:画像の設定を変更

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

  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種類分作成しました。



2. アイテムデータを管理するスクリプトの作成

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


ステップ1:ScriptableObjectの概要

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つのアイテムの分作成します。



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

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

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」の子オブジェクトとして配置してください。



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

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

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

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

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

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

  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が自動的に整列してくれます。



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

ここでは、インベントリを動かすためのスクリプトを実装します。以下の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」を設定します。

6.動作確認

  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を複製すれば簡単に増やせます。