技術資料: OwnedItemsData クラスについて
この資料では、OwnedItemsData クラスの役割とその機能について解説します。Unity 内で使用するクラスで、アイテムの所持データを管理し、シングルトンパターンを使ってインスタンスを扱います。プレイヤーが所有しているアイテムの追加や消費、保存の方法を学びます。
概要
OwnedItemsData クラスは、以下の主要な機能を提供します:
- 所持アイテムのデータ管理
- アイテムの追加・消費
- 所持データの保存と読み込み
- アイテムの種類と所持数の管理
このクラスは、シングルトンパターン を使用しているため、常に1つのインスタンスしか存在しません。ゲーム内で所持アイテムのデータを保存したり、呼び出したりする際に役立ちます。
1. OwnedItemsData クラスの構造
1.1 フィールドとプロパティ
- PlayerPrefsKey
 所持アイテムデータを保存するために使用する PlayerPrefs のキーです。データを保存する際にこのキーを使用してデータを特定します。
- Instanceプロパティ
 シングルトンパターンに基づき、OwnedItemsData の唯一のインスタンスを取得します。初めて呼び出されたときにインスタンスが生成され、データが PlayerPrefs に存在する場合は、それを読み込んで返します。
- OwnedItemsプロパティ
 現在所持しているアイテムを配列として取得します。
1.2 コンストラクタ
private OwnedItemsData() は、クラスの外部からこのクラスを直接インスタンス化できないようにするために private として定義されています。これにより、シングルトンパターンを実現します。
1.3 メソッド
Save()
所持しているアイテムデータを JSON 形式に変換し、PlayerPrefs に保存します。プレイヤーの進行状況を保存するのに使用します。
Add(Item.ItemType type, int number = 1)
指定した種類のアイテムを追加します。すでにそのアイテムが所持されている場合は、追加で個数を増やし、持っていない場合は新たにアイテムを追加します。
- 引数
- type: 追加するアイテムの種類
- number: 追加する個数(デフォルト値は1)
 
Use(Item.ItemType type, int number = 1)
指定した種類のアイテムを消費します。アイテムの数が足りない場合は例外をスローします。
- 引数
- type: 消費するアイテムの種類
- number: 消費する個数(デフォルト値は1)
 
- 例外処理
- アイテムの数が指定された個数より少ない場合、Exceptionがスローされます。
 
- アイテムの数が指定された個数より少ない場合、
GetItem(Item.ItemType type)
指定された種類のアイテムを返します。該当するアイテムがない場合は null を返します。
2. OwnedItem クラスについて
2.1 概要
OwnedItem クラスは、プレイヤーが持っているアイテムの種類と数を管理するためのクラスです。これにより、各アイテムの種類ごとに所持数を追跡できます。
2.2 プロパティ
- Type: アイテムの種類を表すプロパティです。
- Number: 現在所持しているアイテムの個数を表すプロパティです。
2.3 メソッド
Add(int addNumber = 1)
指定した数のアイテムを追加します。デフォルトでは1個追加します。
Use(int useNumber = 1)
指定した数のアイテムを消費します。デフォルトでは1個消費します。
3. シングルトンパターンについて
このクラスでは シングルトンパターン を使用しています。シングルトンパターンは、クラスのインスタンスが常に1つだけであることを保証する設計パターンです。これにより、グローバルなアクセスを提供し、複数のインスタンスが生成されるのを防ぎます。
シングルトンの主なポイント
- 静的フィールド
private static OwnedItemsData _instance;でインスタンスを保持します。
- インスタンスは Instanceプロパティから取得し、未生成の場合は生成されます。
4. PlayerPrefs を使用したデータの保存と読み込み
このクラスでは PlayerPrefs を使用して、プレイヤーの所持アイテムデータを保存・読み込みします。PlayerPrefs とは、キーと値のペアを使ってデータを永続化するUnityの機能です。ここでは、アイテムデータを JSON 形式に変換して保存しています。
保存の流れ
- JsonUtility.ToJson()でクラスのデータをJSON形式に変換。
- PlayerPrefs.SetString()を使用して保存。
- 必要に応じて PlayerPrefs.Save()を実行。
読み込みの流れ
- PlayerPrefs.HasKey()でデータが存在するか確認。
- データが存在すれば、JsonUtility.FromJson()でデータをオブジェクトに復元。
まとめ
この技術資料では、OwnedItemsData クラスとその機能について説明しました。このクラスは、Unityのゲーム開発においてアイテムの所持データを効率的に管理するための仕組みを提供します。また、シングルトンパターンを活用し、所持データの一貫性を確保しています。シンプルなアイテム管理から拡張することも容易なので、さまざまなゲーム開発で応用可能です。
この技術資料を基に、コードを実際に使ってみてください。さらなる機能追加や最適化も可能ですので、学習を進める際の参考にしてください。
using System;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class OwnedItemsData
{
    /// <summary>
    /// PlayerPrefsに保存する際のキー
    /// </summary>
    private const string PlayerPrefsKey = "OWNED_ITEMS_DATA";
    /// <summary>
    /// シングルトンパターンでインスタンスを取得します。
    /// 既にデータが保存されていれば読み込み、新しく作成します。
    /// </summary>
    public static OwnedItemsData Instance
    {
        get
        {
            if (null == _instance)
            {
                if (PlayerPrefs.HasKey(PlayerPrefsKey))
                {
                    _instance = JsonUtility.FromJson<OwnedItemsData>(PlayerPrefs.GetString(PlayerPrefsKey));
                }
                else
                {
                    _instance = new OwnedItemsData();
                }
            }
            return _instance;
        }
    }
    /// <summary>
    /// シングルトンインスタンスを保持するためのフィールド
    /// </summary>
    private static OwnedItemsData _instance;
    /// <summary>
    /// 所持しているアイテムの配列を取得します。
    /// </summary>
    public OwnedItem[] OwnedItems => ownedItems.ToArray();
    /// <summary>
    /// 所持しているアイテムを格納するリスト
    /// </summary>
    [SerializeField] private List<OwnedItem> ownedItems = new List<OwnedItem>();
    /// <summary>
    /// コンストラクタ
    /// シングルトンパターンのため外部からのインスタンス生成を制限しています。
    /// </summary>
    private OwnedItemsData()
    {
    }
    /// <summary>
    /// 所持アイテムデータをJSON形式に変換してPlayerPrefsに保存します。
    /// </summary>
    public void Save()
    {
        var jsonString = JsonUtility.ToJson(this);
        PlayerPrefs.SetString(PlayerPrefsKey, jsonString);
        PlayerPrefs.Save();
    }
    /// <summary>
    /// 指定されたアイテムを追加します。
    /// アイテムが存在しない場合は新しく追加し、既に存在する場合は個数を増やします。
    /// </summary>
    /// <param name="type">追加するアイテムの種類</param>
    /// <param name="number">追加する個数(デフォルトは1)</param>
    public void Add(Item.ItemType type, int number = 1)
    {
        var item = GetItem(type);
        if (null == item)
        {
            item = new OwnedItem(type);
            ownedItems.Add(item);
        }
        item.Add(number);
    }
    /// <summary>
    /// 指定されたアイテムを消費します。
    /// アイテムが足りない場合は例外をスローします。
    /// </summary>
    /// <param name="type">消費するアイテムの種類</param>
    /// <param name="number">消費する個数(デフォルトは1)</param>
    /// <exception cref="Exception">アイテムが不足している場合にスローされます。</exception>
    public void Use(Item.ItemType type, int number = 1)
    {
        var item = GetItem(type);
        if (null == item || item.Number < number)
        {
            throw new Exception("アイテムが足りません");
        }
        item.Use(number);
    }
    /// <summary>
    /// 指定されたアイテムの種類を基にアイテムデータを取得します。
    /// 該当するアイテムがない場合はnullを返します。
    /// </summary>
    /// <param name="type">検索するアイテムの種類</param>
    /// <returns>該当するアイテムデータ</returns>
    public OwnedItem GetItem(Item.ItemType type)
    {
        return ownedItems.FirstOrDefault(x => x.Type == type);
    }
    /// <summary>
    /// アイテムの所持数を管理するクラスです。
    /// </summary>
    [Serializable]
    public class OwnedItem
    {
        /// <summary>
        /// アイテムの種類を返します。
        /// </summary>
        public Item.ItemType Type => type;
        /// <summary>
        /// 現在所持している個数を返します。
        /// </summary>
        public int Number => number;
        /// <summary>
        /// アイテムの種類
        /// </summary>
        [SerializeField] private Item.ItemType type;
        /// <summary>
        /// 所持しているアイテムの個数
        /// </summary>
        [SerializeField] private int number;
        /// <summary>
        /// コンストラクタ
        /// 新しいアイテムを指定された種類で作成します。
        /// </summary>
        /// <param name="type">作成するアイテムの種類</param>
        public OwnedItem(Item.ItemType type)
        {
            this.type = type;
        }
        /// <summary>
        /// アイテムの個数を追加します。
        /// </summary>
        /// <param name="addNumber">追加する個数(デフォルトは1)</param>
        public void Add(int addNumber = 1)
        {
            number += addNumber;
        }
        /// <summary>
        /// アイテムの個数を消費します。
        /// </summary>
        /// <param name="useNumber">消費する個数(デフォルトは1)</param>
        public void Use(int useNumber = 1)
        {
            number -= useNumber;
        }
    }
}




ディスカッション
コメント一覧
まだ、コメントがありません