效果:左边是背包,右边是商店
先创建一个商店,并添加脚本ShopPanel,并将子物体的Slot脚本替换为ShopSlot,继承自Slot:
再创建一个金币,在Player中对金钱进行管理,并声明获取和花费金钱的方法:
public class Player : MonoBehaviour
{
private Text moneyText;
private int money = 100;
void Start()
{
moneyText = GameObject.Find("Money/Text").GetComponent<Text>();
moneyText.text = money.ToString();
}
/// <summary>
/// 花钱
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
public bool ConsumeMoney(int amount)
{
if (money < amount) return false;
money -= amount;
moneyText.text = money.ToString();
return true;
}
/// <summary>
/// 赚钱
/// </summary>
public void EarnMoney(int amount)
{
money += amount;
moneyText.text = money.ToString();
}
在ShopPanel中初始化商店要卖出的物品:遍历数组调用StoreItem()--通过ID来存储物品(在脚本上写入要卖的物品的ID
/// <summary>
/// 这个上商店可以自己去扩展 比如物品的数量 有人购买可以减少,有人出售可以增加 或者就不改变数量,直接就是无限的物品
/// </summary>
public class ShopPanel : Inventory
{
public int[] commodity;
private Player _player;
public override void Start()
{
base.Start();
Init();
_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
}
private void Init()
{
foreach (int id in commodity)
{
StoreItem(id);
}
}
ShopSlot重写父类OnPointerDown方法:当点击鼠标左键且鼠标上无物品时,如果Shop物品槽有子物体,则获取该物体,并向父类的父类ShopPanel发送消息(通过名字调用方法)来调用购买物品的方法,当手上有东西且点击左键时,调用出售的方法;
public class ShopSlot : Slot
{
public override void OnPointerDown(PointerEventData eventData)
{
if (eventData.button == PointerEventData.InputButton.Left && InventoryManager.Instance.IsPickedItem == false)
{
if (transform.childCount > 0)
{
ItemUI currentItemUI = transform.GetChild(0).GetComponent<ItemUI>();
transform.parent.SendMessage("ButItem",currentItemUI.ItemInfo);
}
}
if (eventData.button == PointerEventData.InputButton.Left && InventoryManager.Instance.IsPickedItem == true)
{
transform.parent.SendMessage("SellItem");
}
}
}
购买物品方法:通过传入的Item获取买入价格,调用Player中的ConsumeMoney(花费金钱)的方法,当为True时,通过背包单例类调用Inventory中的存储物品方法(写在ShopPanel)
出售物品方法:先声明ItemUI类的PickedItem,当按下Ctrl时,一个一个的买出,反之全部卖出(更新鼠标上的物品--ReducePickedItem),然后调用Player中的获取金钱方法
/// <summary>
/// 购买物品
/// </summary>
/// <param name="itemInfo"></param>
public void ButItem(ItemInfo itemInfo)
{
int amount = itemInfo.BuyPrice;
if (_player.ConsumeMoney(amount))
{
KnapsackPanel.Instance.StoreItem(itemInfo.ID);
}
}
/// <summary>
/// 出售物品
/// </summary>
public void SellItem()
{
ItemUI currentItemUI = InventoryManager.Instance.PickedItem;
if (Input.GetKey(KeyCode.LeftControl))//按下鼠标左键 一个一个出售
{
int amount = currentItemUI.ItemInfo.SellPrice;
InventoryManager.Instance.ReducePickedItem(1);//鼠标上的物品减少1
_player.EarnMoney(amount);//赚钱
}
else//全部卖出
{
int amount = currentItemUI.ItemInfo.SellPrice * currentItemUI.Amount;
InventoryManager.Instance.ReducePickedItem(currentItemUI.Amount);//鼠标上的物品减少
_player.EarnMoney(amount);//赚钱
}
}