背包是游戏中经常使用的一个组件,它负责管理玩家在游戏中所获得的道具。一个完整的背包系统应当具有将物品放置进背包、对背包内物品进行管理和使用背包内物品等功能。而往往一个背包系统的逻辑关系较为复杂,如果把所有功能都放在一个脚本中实现会使代码显得十分冗杂且缺乏逻辑。所以在背包系统的设计过程中,我们常将其分解为数据、逻辑和UI三部分分别来进行完成。
一、UI设计

以Cotton Puzzle中的背包设计为例,我们需要有物品展示栏、物品切换按键和物品提示信息等部分。

在Canvas中创建ItemHolder,在ItemHolder中创建LeftButton和RightButton控制物品的左右切换、Slot来控制物品的显示以及ItemToolTip来显示物品的提示信息。
二、UI
创建InventoryUI脚本并挂在ItemHolder上以对整个背包UI进行管理。
首先,确定InventoryUI可以控制的组件并定义当前所显示的物品序号,由于ItemToolTip的显示与否和Slot直接相关联,所以可以通过控制Slot间接控制ItemToolTip,在InventoryUI中便不再单独对其进行控制。
//InventoryUI.cs
public Button leftButton;
public Button rightButton;
public SlotUI slotUI;
public int currentItemIndex;//当前物品序号
2.1 Slot中的物品显示
//InventoryUI.cs
/// <summary>
/// 更新Slot中物品图片
/// </summary>
/// <param name="itemDetails"></param>
/// <param name="index"></param>
private void OnUpdateUIEvent(ItemDetails itemDetails, int index)
{
if (itemDetails == null)//当前物品为空
{
slotUI.SetEmpty();
currentItemIndex = -1;
leftButton.interactable = false;
rightButton.interactable=false;
}
else
{
currentItemIndex = index;
slotUI.SetItem(itemDetails);
if (index > 0)
leftButton.interactable = true;
if (currentItemIndex == -1)
{
leftButton.interactable = false;
rightButton.interactable = false;
}
}
}
定义UpdateUIEvent事件来实时管理Slot中显示的物品(通过调用SlotUI中实现的SetEmpty()和SetItem(itemDetails)方法实现)和左右按钮的可使用情况。
//InventoryUI.cs
private void OnEnable()
{
EventHandler.UpdateUIEvent += OnUpdateUIEvent;
}
private void OnDisable()
{
EventHandler.UpdateUIEvent -= OnUpdateUIEvent;
}
2.2 物品切换
//InventoryUI.cs
/// <summary>
/// 左右按钮使用事件
/// </summary>
/// <param name="amount"></param>
public void SwitchItem(int amount)
{
var index = currentItemIndex + amount;
if(<

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



