目录
声明
本教程学习均来自U3D中文课堂麦扣老师
1.Action Bar Stats 设置快捷栏和信息面板的UI
和Inventory Bag一样先做一个Action Bar:新建一个Panel
添加Layout Group
这样Action Bar就已经做好了,接下来添加和Slot Holder一样的功能,也就是Update自己本身的UI,为了实现这个功能,我们方便的做法是复制 ItemSlot到Action Button下面,且挂在了ItemUI代码.
Action Button需要哪些功能?首先是一个按钮,鼠标点击的时候可以使用这个物品,比如是一个回血的蘑菇,然后也希望像Container一样去控制、匹配里面的数据库,所以给它添加ContainerUI
这里的Slot Holders就是下面的6个Action Button,在添加之前Action Button保存为Prefab,添加Slot Holder:
将Action Button添加到Action Bar:
接下来设置人物的属性面板:
新建一个Panel命名为CharacterStats
创建Imager命名为Weapon,在下方创建image命名为EquipmentSlot,下方添加预制体ItemSlot
复制Weapon,命名为Shield
这样就设置好了装备,还需要一个区域用来显示玩家基本的属性,在目前的项目中只有最基础的防御力、血量、攻击力,那么就简单设置一个,可以根据需要在里面添加更多的属性。
这样就设置快捷栏和信息面板的UI了
2.Begin Drag 实现拖拽物品
创建对应的数据库,也就是ScriptableObject的那个库,先为CharacterStats添加Container UI脚本,添加2个Slot Holders
然后回到我们的总控制,InventoryCanvas也就是Inventory的总控制,InventoryManager,在这里面也添加对应的ActionBar的数据库,Stats的数据库以及他们的Container。
InventoryManager:
public class InventoryManager : Singleton<InventoryManager>
{
//TODO:最后添加模板用于保存数据
[Header("Inventory Data")]
public InventoryData_SO InventoryData;
public InventoryData_SO actionData;
public InventoryData_SO equipmentData;
[Header("Containers")]
public ContainerUI inventoryUI;
public ContainerUI actionUI;
public ContainerUI equipmentUIl;
private void Start()
{
inventoryUI.RefreshUI();//刷新UI
}
}
回到Canvas选好Data
开始就刷新UI,
public class InventoryManager : Singleton<InventoryManager>
{
//TODO:最后添加模板用于保存数据
[Header("Inventory Data")]
public InventoryData_SO InventoryData;
public InventoryData_SO actionData;
public InventoryData_SO equipmentData;
[Header("Containers")]
public ContainerUI inventoryUI;
public ContainerUI actionUI;
public ContainerUI equipmentUI;
private void Start()
{
inventoryUI.RefreshUI();//刷新UI
actionUI.RefreshUI();//刷新UI
equipmentUI.RefreshUI();//刷新UI
}
}
接下来就要实现拖拽物品的功能了:
使用接口的方式来实现拖拽:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class DragItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public void OnBeginDrag(PointerEventData eventData)//一开始拖拽要使用的方法
{
//记录原始数据
}
public void OnDrag(PointerEventData eventData)//拖拽过程当中要执行的内容
{
//跟随鼠标位置移动
}
public void OnEndDrag(PointerEventData eventData)//结束拖拽
{
//放下物品 交换数据
}
}
eventData里有鼠标的坐标,所以先来执行跟随鼠标的移动,
public void OnDrag(PointerEventData eventData)//拖拽过程当中要执行的内容
{
//跟随鼠标位置移动
transform.position = eventData.position;
}
然后这个DragItem也要获得当前挂载的ItemUI里面相关的一些数据,所以一开始也要创建这个变量:
然后创建2个变量用来交换数据,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
[RequireComponent(typeof(ItemUI))]
public class DragItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
ItemUI currentItemUI;//拿到ItemUI组件
SlotHolder currentHolder;//拿到父级的SlotHolder组件
SlotHolder targetHolder;
private void Awake()
{
currentItemUI = GetComponent<ItemUI>();//拿到ItemUI组件
currentHolder = GetComponentInParent<SlotHolder>();//拿到父级的SlotHolder组件
}
public void OnBeginDrag(PointerEventData eventData)//一开始拖拽要使用的方法
{
//记录原始数据
}
public void OnDrag(PointerEventData eventData)//拖拽过程当中要执行的内容
{
//跟随鼠标位置移动
transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData)//结束拖拽
{
//放下物品 交换数据
}
}
现在拖拽物品会显示在后面,接下来创建一个Canvas,专门用来接收拖拽的东西,每次拖拽的时候就将父级调用到更高的这个Canvas上