unity 3D RPG高级教程(九)

目录

声明

1.Action Bar Stats 设置快捷栏和信息面板的UI

2.Begin Drag 实现拖拽物品

3.Swap Item 交换物品

4..Change Weapon 实现切换武器

5.Useable Item 可使用的物品

声明

本教程学习均来自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上 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

傻Q爱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值