短編RPG制作(Unity2D)【第27回】メニューの作成その5


アイテムの重複処理

前回プレイヤーがアイテムを保持できるようにしました。今回は、同じアイテムを拾ったときに重ねて持つことができるようにします。

スクリプトの記述

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerStatus : MonoBehaviour
{
    [SerializeField] private Image _image;
    [SerializeField] private int maxHP = 10;
    [SerializeField] private int currentHP;
    [SerializeField] private int upHP = 10;
    [SerializeField] private int level = 1;
    [SerializeField] private int experience = 0;
    [SerializeField] private int needExperience = 100;
    [SerializeField] private int gold = 0;
    [SerializeField] private List<ItemData> itemList = new List<ItemData>(); // アイテムデータを格納
    [SerializeField] private List<int> itemPossessions = new List<int>(); // アイテム所持数を格納

    private int itemIndex;

    private void Start()
    {
        currentHP = maxHP;
    }

    // ダメージ計算・死亡判定
    public void Damage()
    {
        currentHP = Mathf.Clamp(currentHP - 1, 0, maxHP);    
        UpdateBar();

        // 死亡判定
        if (currentHP == 0)
        {
            Destroy(gameObject);
        }
    }

    // HPバーの更新
    private void UpdateBar()
    {
        _image.fillAmount = Mathf.Clamp01((float)currentHP / (float)maxHP);
    }

    // 報酬獲得処理
    public void Result(int Experience, int Gold, ItemData Item)
    {
        experience += Experience;
        gold += Gold;
        Debug.Log(experience);
        LevelUp();
        if (Item != null)
        {
            itemIndex = itemList.IndexOf(Item);
            if (itemIndex == -1)
            {
                itemList.Add(Item);
                itemPossessions.Add(1);
            }
            else
            {
                itemPossessions[itemIndex]++;
            }
            
        }        
    }

    // レベルアップ処理
    private void LevelUp()
    {
        while (experience >= needExperience)
        {
            level++;
            experience = experience - needExperience;
            maxHP += upHP;
            currentHP += upHP;
            UpdateBar();
        }
    }
}

PlayerStatusを更新していきます。
まず、アイテムの所持数を保持するリスト「itemPossessions」を作成しました。
次に、アイテムを重ねて持つための処理を実装します。具体的には、すでに持っているアイテムを拾ったときに「itemPossessions」の数値を増やし、それ以外のときは「itemList」と「itemPossessions」の要素を新しく増やします。
拾ったアイテムがリストの何番目にあるかの確認を"itemPossessions.IndexOf(Item)"で行いました。拾ったアイテムをまだ持っていない場合には-1が返されるので、アイテムの所持判定にも使えます。

実装結果

個数が増えるようになった

同じアイテムを拾うと、リストの要素ではなく個数が増えるようになりました。落とすアイテムの種類を2つにしてみても正常に動作したので、きっちり実装できたようです。

まとめ

アイテムを重ねて持てるようになりました。
最初は「ItemData」に個数の項目を追加するつもりだったのですが、Scriptableオブジェクトは変化しない値を保存する用らしいので、今回のように新たにリストを作る形を取りました。セーブする際を考えると、Scriptableオブジェクト内に保存するとリセットされてしまいそうな気がするのでこっちの方が良いのではないでしょうか。
もっといい方法があるかもしれませんが、とりあえずこれで進めようと思います。

次回は、アイテムメニューに拾ったアイテムを表示できるようにしたいです。

この記事が気に入ったらサポートをしてみませんか?