Unityにおけるインベントリーシステムの実装方法

2024年10月10日

この技術資料では、Unityでインベントリーシステムを実装する基本的な手順と、オブジェクト指向プログラミングにおける「コンポジション」の概念を踏まえた設計方法について解説します。このシステムは、初学者でも理解しやすいように設計されていますが、柔軟で拡張性のある基盤となります。


1. インベントリーシステムの概要

インベントリーシステムは、ゲーム内でプレイヤーが収集したアイテムを管理するための重要な機能です。このシステムでは、プレイヤーがアイテムを追加・削除・表示することができ、ゲーム進行に伴い、アイテムを管理する機能を提供します。

このシステムの設計目標:

  • アイテムの管理:プレイヤーが拾ったアイテムをインベントリーに追加し、必要に応じて削除・表示できるようにします。
  • コンポジションの活用Inventory クラスが Item クラスのオブジェクトを所有する構造を持たせ、クラス間の関係を明確にします。

2. コンポジションの概念

コンポジションとは、あるクラスが別のクラスを所有し、これにより機能やデータを組み合わせて使う設計手法です。例えば、今回のインベントリーシステムでは、Inventory クラスが Item クラスを「所有」し、インベントリーが破棄されればその中のアイテムも破棄される関係にあります。

コンポジションの特徴

  • 所有関係Inventory クラスが Item クラスのオブジェクトを所有している。Inventory が破棄されると、アイテムも一緒に破棄されます。
  • クラス間の依存Inventory はアイテムを管理しますが、アイテムは独立して存在せず、インベントリーに依存してその存在が成り立っています。

3. アイテムクラスの実装

まずは、ゲーム内のアイテムを表現するための Item クラスを実装します。このクラスは、アイテムの名前や説明、IDなどを保持し、インベントリー内で管理される要素となります。

Item.cs

using UnityEngine;

public class Item
{
    public string itemName;  // アイテムの名前
    public string itemDescription;  // アイテムの説明
    public int itemID;  // アイテムの一意のID

    // コンストラクタでアイテムの情報を設定
    public Item(string name, string description, int id)
    {
        itemName = name;
        itemDescription = description;
        itemID = id;
    }
}

4. インベントリクラスの実装

次に、プレイヤーのインベントリーを管理する Inventory クラスを実装します。このクラスでは、アイテムをリストで保持し、追加・削除・表示の機能を提供します。

Inventory.cs

using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour
{
    // アイテムのリスト
    private List<Item> items = new List<Item>();

    // アイテムをインベントリーに追加する
    public void AddItem(Item newItem)
    {
        items.Add(newItem);
        Debug.Log(newItem.itemName + "をインベントリーに追加しました。");
    }

    // アイテムをインベントリーから削除する
    public void RemoveItem(Item itemToRemove)
    {
        if (items.Contains(itemToRemove))
        {
            items.Remove(itemToRemove);
            Debug.Log(itemToRemove.itemName + "をインベントリーから削除しました。");
        }
        else
        {
            Debug.Log("アイテムが見つかりません。");
        }
    }

    // インベントリー内のアイテムを表示する
    public void DisplayInventory()
    {
        foreach (Item item in items)
        {
            Debug.Log("アイテム: " + item.itemName + " - " + item.itemDescription);
        }
    }
}

5. インベントリーシステムの動作例

次に、Inventory クラスと Item クラスを使って、アイテムをインベントリーに追加したり、削除したりするサンプルコードを作成します。プレイヤーがゲーム開始時に「剣」と「盾」をインベントリーに追加し、その内容をコンソールに表示する例です。

ExampleScript.cs

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    public Inventory playerInventory;

    void Start()
    {
        // アイテムの作成
        Item sword = new Item("剣", "鋭い剣", 1);
        Item shield = new Item("盾", "頑丈な盾", 2);

        // インベントリーにアイテムを追加
        playerInventory.AddItem(sword);
        playerInventory.AddItem(shield);

        // インベントリーの内容を表示
        playerInventory.DisplayInventory();
    }
}

6. 今後の発展(UIやアイテム使用機能の追加)

今回のサンプルは、インベントリーシステムの基本的な機能のみを実装しています。次のステップとして、以下の機能を追加することで、インベントリーシステムをさらに発展させることが可能です。

発展のアイデア

  • UIとの連携:
    • UnityのUIを使って、プレイヤーが視覚的にインベントリーを操作できるようにします。
    • プレイヤーがアイテムをクリックして選択し、使用や削除を行えるようにするインターフェースを実装します。
  • アイテムの使用:
    • インベントリー内のアイテムをクリックして使用する機能を追加します。例えば、ポーションを使用してHPを回復させる機能や、武器を装備する機能などです。
  • インベントリの容量制限:
    • インベントリーに追加できるアイテム数に制限を設け、プレイヤーが容量を超えた場合にアイテムを追加できないようにします。

この技術資料では、基本的なインベントリーシステムの実装を通して、オブジェクト指向プログラミングの「コンポジション」を学び、簡単なシステムを設計・実装する方法を紹介しました。今後、UIやアイテム使用機能を追加することで、より高度なインベントリーシステムを構築していくことができます。

Unity

Posted by hidepon