【背包系统】六.商店

效果:左边是背包,右边是商店

 

先创建一个商店,并添加脚本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);//赚钱
 }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity背包系统是一个游戏中常用的组件,用于管理玩家在游戏中所获得的道具。一个完整的背包系统通常由数据、逻辑和UI三部分组成。在设计过程中,我们首先进行UI设计,包括背包的标题、关闭键和背包内的格子容器。 背包系统的数据部分主要负责管理物品的信息,例如物品的名称、图片、数量等。逻辑部分负责实现将物品放置进背包、对背包内物品进行管理以及使用背包内物品等功能。实际上,当我们获取或移动物品时,我们会直接修改背包数据库中的物品信息。修改完成后,我们通过背包中的UI元素来获取背包数据库中相应索引的物品信息,并将物品栏中的UI信息更新为数据库中对应序号的物品的图片和数量。 通过将背包系统分解为数据、逻辑和UI三部分,我们可以有效地管理背包系统的复杂逻辑关系,并使代码更加清晰和易于维护。这种设计模式有助于提高游戏开发的效率和代码质量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity游戏开发:背包系统的实现](https://blog.csdn.net/float_freedom/article/details/126243888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Unity3D RPG实现 2 —— 背包系统](https://blog.csdn.net/weixin_43757333/article/details/123187025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DAGUNIANGZHOU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值