短編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」で実行しています。
購入することができました。攻撃力にも反映されています。
しかし、前にも言いましたがボタンが「装備する」から元に戻らないので、装備を付け替えることができません。
ここは次回修正します。
とりあえず、購入処理を実装できて安心しました。
この記事が気に入ったらサポートをしてみませんか?