インベントリシステム(持ち物、買い物かご)


Unityのインベントリシステムは、プレイヤーがゲーム内でアイテムを保持、管理、使用するためのシステムです。アイテムは通常、リソース、武器、ツール、回復アイテムなど、さまざまなカテゴリに分類されます。このシステムは、アイテムの取得、所持、アップグレード、売買を容易にするUIと連動して機能します。プレイヤーはインベントリ画面を通じて所持品を確認し、使用または配置するアイテムを選択できます。システム設計はゲームのジャンルやメカニクスに応じて異なりますが、アイテムの管理とアクセスのしやすさが重要です。

インベントリシステムの定義

Unityでのシンプルなインベントリシステムのサンプルを示します。この例では、アイテムの追加、削除、表示ができる基本的なインベントリシステムを実装します。まず、アイテムを格納するためのクラスと、インベントリを管理するクラスを作成します。

アイテムクラス(持ち物袋に入っているアイテムのイメージ)

using System;

[Serializable]
public class Item
{
    public string itemName; // アイテムの名前を格納する変数
    public int quantity;    // アイテムの数量を格納する変数

    // コンストラクタ: アイテムの名前と数量を初期化する
    public Item(string name, int count)
    {
        itemName = name;  // 引数で受け取ったアイテム名をitemNameに設定
        quantity = count; // 引数で受け取った数量をquantityに設定
    }
}

インベントリクラス(持ち物袋のイメージ)

持ち物袋には、複数のアイテム(名前と数量で管理)が入っています
袋クラスでは、袋に入れる、袋から出す・・・の動作(振る舞い)を実装しています

using System.Collections.Generic;
using UnityEngine;

// インベントリシステムを管理するクラス
public class Inventory : MonoBehaviour
{
    // アイテムリストの定義
    public List<Item> items = new List<Item>();

    // アイテムを追加するメソッド
    public void AddItem(string name, int quantity)
    {
        bool itemExists = false;
        // 同名のアイテムがリスト内に存在するかチェック
        foreach (Item item in items)
        {
            if (item.itemName == name)
            {
                item.quantity += quantity;
                itemExists = true;
                break;
            }
        }
        // 存在しない場合、新しいアイテムをリストに追加
        if (!itemExists)
        {
            items.Add(new Item(name, quantity));
        }
    }

    // アイテムを削除するメソッド
    public void RemoveItem(string name, int quantity)
    {
        for (int i = items.Count - 1; i >= 0; i--)
        {
            Item item = items[i];
            if (item.itemName == name)
            {
                item.quantity -= quantity;
                // 数量が0以下になったらリストから削除
                if (item.quantity <= 0)
                {
                    items.RemoveAt(i);
                }
                break;
            }
        }
    }

    // インベントリの内容を出力するメソッド
    public void PrintInventory()
    {
        foreach (Item item in items)
        {
            Debug.Log($"アイテム: {item.itemName}, 数量: {item.quantity}");
        }
    }
}

このサンプルコードはUnityのプロジェクト内で使うことができ、アイテムを追加、削除、およびリスト表示が行えます。InventoryクラスのAddItemRemoveItemPrintInventoryメソッドを使用して、インベントリの管理を行います。

利用するには

インベントリシステムを操作するためのサンプルスクリプトを提供します。このスクリプトでは、ユーザーがアイテムを追加、削除、およびインベントリの内容を表示するコマンドを入力できるようにします。ここでは、UnityのUpdateメソッドを使用してキー入力をチェックし、適切なインベントリ操作を実行します。

InventoryControllerクラス

キーA:Add(加える)、キーR:Remove(取り外す)、キーP:Print(表示する)

バナナや、りんごなど、さらに追加したらどのようになるか考え、実際に実装してみましょう

using UnityEngine;

public class InventoryController : MonoBehaviour
{
    public Inventory inventory;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            // アイテム「Apple」を1つ追加
            inventory.AddItem("Apple", 1);
            Debug.Log("リンゴを1つもらった");
        }
        if (Input.GetKeyDown(KeyCode.R))
        {
            // アイテム「Apple」を1つ削除
            inventory.RemoveItem("Apple", 1);
            Debug.Log("リンゴを1つ取り出した");
        }
        if (Input.GetKeyDown(KeyCode.P))
        {
            // インベントリの内容を表示
            inventory.PrintInventory();
        }
    }
}

Unityプロジェクトでのセットアップ方法

  1. InventoryクラスとInventoryControllerクラスをそれぞれ新しいC#スクリプトとしてUnityプロジェクトに追加します。
  2. Unityエディタで新しいゲームオブジェクトを作成し、Inventoryスクリプトをアタッチします。
  3. 同じゲームオブジェクトにInventoryControllerスクリプトもアタッチし、インスペクターでInventoryフィールドに先ほど作成したインベントリのインスタンスをドラッグ&ドロップします。
  4. ゲームをプレイし、キーボードのARPキーを押して、それぞれの機能をテストします。

このシステムは非常に基本的なものですが、インベントリ管理の基礎として機能し、さらに複雑な機能やユーザーインターフェースに発展させることができます。アイテムの種類や数量を増やしたり、グラフィカルなインベントリUIを組み込むことも可能です。

参考

次のコードはLINQを使用してリファクタリングしたものです。特にAddItemRemoveItemメソッドに焦点を当てて、既存のアイテムがあるかどうかを効率的にチェックし、更新する方法を示します。コードの可読性を向上させ、より宣言的なスタイルにすることができます。

using System.Collections.Generic;
using System.Linq;
using UnityEngine;

// インベントリシステムを管理するクラス
public class Inventory : MonoBehaviour
{
    // アイテムリストの定義
    public List<Item> items = new List<Item>();

    // アイテムを追加するメソッド
    public void AddItem(string name, int quantity)
    {
        var item = items.FirstOrDefault(i => i.itemName == name);
        if (item != null)
        {
            item.quantity += quantity;
        }
        else
        {
            items.Add(new Item(name, quantity));
        }
    }

    // アイテムを削除するメソッド
    public void RemoveItem(string name, int quantity)
    {
        var item = items.FirstOrDefault(i => i.itemName == name);
        if (item != null)
        {
            item.quantity -= quantity;
            if (item.quantity <= 0)
            {
                items.Remove(item);
            }
        }
    }

    // インベントリの内容を出力するメソッド
    public void PrintInventory()
    {
        foreach (Item item in items)
        {
            Debug.Log($"アイテム: {item.itemName}, 数量: {item.quantity}");
        }
    }
}

こちらのリファクタリングでは、FirstOrDefaultメソッドを使ってリストからアイテムを検索し、アイテムが存在するかどうかを確認しています。これにより、foreachループを使う必要がなくなり、コードがよりシンプルで読みやすくなります。また、アイテムの追加と削除の処理がより簡潔に記述されています。

Unity

Posted by hidepon