見出し画像

短編RPG制作(Unity2D)【第67回】装備その9


装備

購入機能の作成

デリゲートを実装して、購入ボタンを押した際にコールバック関数が起動するようにしました。
前回スクリプトが動かなかった原因は、リストに「=」で新しい要素を追加しようとしていたことでした……。バグって気づくとしょうもないミスなこと多いですよね……。
原因が分かったので、Addメソッドを使うことで解決しました。

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

public class ShopManager : MonoBehaviour
{
    // 参照
    private RectTransform _rectTransform; // 親要素の参照
    [SerializeField] private List<GameObject> _weaponPanelList; // 子要素の参照リスト
    [SerializeField] private List<BuyWeaponButton> _buyWeaponButtonList; // 購入ボタンの参照リスト

    // 武器一覧
    [SerializeField] private List<WeaponData> _weaponList;

    // UIのPrefub
    [SerializeField] private GameObject weaponPanel; // 子要素のプレハブ

    private void Start()
    {
        // 自身の参照を取得
        _rectTransform = GetComponent<RectTransform>();

        // リストに存在する武器の購入UIを生成
        for (int i = 0; i < _weaponList.Count; i++)
        {
            Instantiate(weaponPanel, _rectTransform);
            _weaponPanelList.Add(_rectTransform.GetChild(i).gameObject);
            WeaponSetting(_weaponPanelList[i], i);
        }

        //コールバック関数の設定
        foreach (BuyWeaponButton _buyWeaponButton in _buyWeaponButtonList)
        {
            _buyWeaponButton.onEquip = Equip;
        }       
    }

    // Shop UIに武器情報を反映
    private void WeaponSetting(GameObject weaponPanel, int i)
    {
        // 参照
        RectTransform _rectTransform; // weaponPanel(子要素)の参照
        RectTransform _rectTransform2; // weaponPanel(子要素)の参照

        // 子要素、孫要素の参照を取得
        _rectTransform = weaponPanel.GetComponent<RectTransform>(); // 子要素
        _rectTransform.GetChild(0).GetComponent<Text>().text = _weaponList[i].GetWeaponName();
        _rectTransform.GetChild(1).GetComponent<Image>().sprite = _weaponList[i].GetIcon();
        _rectTransform.GetChild(2).GetComponent<Text>().text = "ATK + " + _weaponList[i].GetStatus() + "%";
        _rectTransform.GetChild(3).GetComponent<Text>().text = _weaponList[i].GetContentText();
        _buyWeaponButtonList.Add(_rectTransform.GetChild(4).GetComponent<BuyWeaponButton>());
        _buyWeaponButtonList[i].SetValue(_weaponList[i].GetValue());
        _buyWeaponButtonList[i].SetId(i); // リストでの順番をIDとする

        _rectTransform2 = _rectTransform.GetChild(4).GetComponent<RectTransform>(); // 孫要素
        _rectTransform2.GetChild(0).GetComponent<Text>().text = _weaponList[i].GetValue() + " Gold";
    }

    private void Equip(int Id)
    {
        PlayerParameter.equipedWeapon = _weaponList[Id];
    }
}
using UnityEngine;
using UnityEngine.UI;

public class BuyWeaponButton : MonoBehaviour
{
    // 参照
    private Text _text;

    private int value; // 武器の価格
    private int id; // 武器のID(通し番号)

    // コールバック
    public delegate void DelegateButton(int i);
    public DelegateButton onEquip;

    private enum StateEnum
    {
        unpurchased,
        purchased,
        equiped
    }
    private StateEnum _state = StateEnum.unpurchased;

    public void SetValue(int Value)
    {
        this.value = Value;

    }
    public void SetId(int Id)
    {
        this.id = Id;

    }

    private void Start()
    {
        _text = GetComponentInChildren<Text>();
    }

    public void OnClickBuyButton()
    {
        // 購入処理
        if ( value <= PlayerParameter.gold && _state == StateEnum.unpurchased )
        {
            _state = StateEnum.purchased;
            _text.text = "装備する";
            PlayerParameter.gold -= value;
            return;
        }

        // 装備処理
        if (_state == StateEnum.purchased)
        {
            _state = StateEnum.equiped;
            _text.text = "外す";
            onEquip(id);
            return;
            // 他に装備している武器があったら、そのボタンを「装備する」に戻す必要あり
        }
    }
}

「BuyWeaponButton」を購入ボタンにアタッチし、装備処理を「ShopManager」で実行しています。

購入機能を実装

購入することができました。攻撃力にも反映されています。
しかし、前にも言いましたがボタンが「装備する」から元に戻らないので、装備を付け替えることができません。

最後に押した武器だけが反映

ここは次回修正します。
とりあえず、購入処理を実装できて安心しました。

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