UE4拖拽UI

16 篇文章 0 订阅
1 篇文章 0 订阅

前言

最近做开发,想到一个拖拽UI的功能,就去网上找了教程试一下,然后发现了一个挺有意思的现象。话不多说,直接上图。
在这里插入图片描述
首先一共有四个UI,HUD是主的UI(用来放置Chest和inventory两个UI)。然后chest和inventory两个UI为类似背包的UI。
在这里插入图片描述
在这里插入图片描述
大概就是这个样子。然后最后的singleitem就是我们要移动的UI啦。在这里插入图片描述
运行的效果大概就是这个样子。
在这里插入图片描述
我做的功能是要把singleitem从左边的UI移动到右边的UI(遗产)里面。

拖拽功能实现

  1. 重载函数。
    首先要实现拖拽,要重载一虚幻自己的函数。打开singleitem,因为我们要拖的是这个蓝图。然后重载如图的这两个函数
    在这里插入图片描述
    至于怎么重载,在UI蓝图的左边有一个函数,然后鼠标移动到图中的+号附近就会看到有重载了,找这两个函数的时候建议把语言改成英文,中文的翻译看着怪怪的哈哈。
    在这里插入图片描述
    在这里插入图片描述
    以上就是两个函数的截图。然后图中的createdrag大家可以右键搜索create drag &drop operation就会出现这个结点了。然后由于我自己新建了一个蓝图类drag所以会有item item_info index inventory 这些连接口。大家可以忽略。主要看playoad 以及 default dragvisual 这两个变量我的理解就是你想移动的是什么。比如说我想要移动的是整个singleitemUI,所以我就在playoad那里连接了一个自身的引用(这个逻辑是在singleitem里面写的)。然后default drag visual我的理解就是你以移动的时候是想在屏幕显示的形式,我想让鼠标拖着我的图标走,所以我就把UI里面的image控件连接上去了。

  2. drap and drop 蓝图类
    这个类就是我开始的图的那个drag。大家右键新建蓝图类,然后搜索drag就会有了
    在这里插入图片描述
    就是图中的dragdropoperation。(那个drag是我自己建的,不是蓝图默认的)。关于这个类,我觉得主要作用是用来传参。就比如说我这个singleitem相当于一个物品,然后这个物品有的属性,比如重量,名字啥的。这些属性就可以通过这个这个类进行传递。比如在我的drag类里面就有这样的设置。
    在这里插入图片描述
    我在里面添加了这些变量。将singleitem里面的一些信息传递出去。

  3. ondrop函数
    那么我们怎么响应鼠标放下的操作呢,就是你把UI拖到指定位置后放置的操作。比如我现在是想从inventory里面将singleitem拖进chest里面,那么我们就打开chest蓝图,然后重载ondrop函数
    在这里插入图片描述
    在这里插入图片描述
    大概就这这个样子。大家主要关注的就是ondrop后面的casttodrag这个结点,就是你在singgleeitem里面create那个结点选择了drag类后,在ondrop的这个函数里面将operation通过castto就可以获取我创建的那个drag类了,就可以获得里面的参数。然后就可以根据这个参数进行创建响应的UI加入chest里面。因为我这个项目是涉及到一些自己做的结构体,所以就不赘述。大概的添加操作就是那个update函数里面的addchild。或者大家也可以直接获取drag里面的playoad就可以获取到你之前在create里面连接的那个控件了。比如我这里create连接的是一个self我获取playoad后就以获得我拖动的那个singleitem控件了,然后可以通过addchild结点添加到chest;里面的那个UniformGrid控件下,这是一个网格控件好像,大家可以试试看。(如图)
    在这里插入图片描述

问题

现在我就来讲一下我发现的一个BUG,就是在ondrop那里。我发现,如果是将chest的singleitem从chest里面拖动并放回chest,这里的时候回触发ondrop但是castto结点会失败,但觉就像是这个操作不能转换为Drag,但是我没想明白为啥,我从inventory蓝图里面移动到chest蓝图有可以转换成功,所以想看看大佬有什么操作。

总结

大概的步骤就是,在你需要移动的UI蓝图里面,重载两个函数,然后在onDragdDetected函数里面create drag &drop operation,大家如果没有什么信息传递的话就不用创建draganddrop类的啦。用默认的也会有playoad和default两个点可以连接的。然后写完两个函数后,在你要拖拽到的那个UI,我这里是chest里面重载ondrop函数再实现添加UI进去的操作。就是这么个思路了。可能因为我的工程有自己的信息传递,所以会略显复杂,比如那个createdrag那里我做两个是我项目的需求,大家可以只写一个的。然后图片有点糊,,不知道是不是截图软件的问题,大家不要见怪,我也在想怎么把图片整的更清晰点。今天就分享这么多,如果有打大佬知道那个问题是怎么回事的话,还望大佬指教!!!

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值