用Drag and Drop 和 Scroll Box 制作可以拖动的背包【UE4】【Blueprint】

第一步

创建一个名为的UserWidget,这个用于单个物品。创建两个分贝名为BackpackA和BackpackB的UserWidget,作为两个背包。在这两个背包中创建一个ScrollBox,改名为Content。

第二步:为两个背包创建subwidget_sigleitem

为了使这些物品具有辨识度,在subwidget_sigleitem中加了两个变量:Num(编号)ParentBag(父物体),将它们的expose-on-spawn

勾选上。

注意:如果只将Expose on Spawn 勾选上会报一个警告信息。

Expose on Spawn :当创建类的时候需要给变量赋予初始值的时候就要用到。

第三步:关键的一步

在subwidget_sigleitem中重载On Mouse Button Down函数

点击Override就能看到

这个函数表示当鼠标按下subwidget_sigleitem时触发的事情,内容如下:

Detect Drag if Pressed 表示监测是否有拖动现象(针对鼠标左键),将事件监测结果返回出去。

第四步

新建一个继承自DragDropOperation名为DragAndDrop的蓝图。

将DragAndDrop中的Pivot设为CenterCenter。

第五步

subwidget_sigleitem中重载On Drag Detected函数,表示当有拖拽被检测到时,执行如下过程:

Payload 表示拖拽后拖拽源将会损失这一物件(自动消失,不用做Remove From Parent的处理),Default Drag Visual表示拖动显示的样式,也就是粘着鼠标上的那个图标。

第六步

在BackpackB中重载On Drop函数。

 

这个函数表示当BackpackB被Drop(拖拽的最后一个瞬间,释放)时调用。

自己实现将物品按照鼠标位置所在地插入。

获取当前屏幕位置----->用"MyGeometry"翻译物理屏幕位置,得到本地位置(本地位置是指游戏窗口里的本地位置,是一个和窗体大小、窗体所处物理屏幕的位置无关的一个位置值)------>用这个本地位置获得鼠标所在处的排列序号,最后四舍五入添加到这个位置上面即可。

第七步 解释GetFocusIndex函数

以下列出一个方程组计算排序序列号和当前鼠标位的关系表达式:

当前鼠标的本地位置 = 当前鼠标的绝对位置经过窗口几何的Absolute to Local  也就是前面提到的:

当前鼠标的本地位置 - ScrollBox在画布上的偏移位置(下图中的红色箭头) = 鼠标相对于ScrollBox顶的位置

鼠标相对于ScrollBox顶的位置 + ScrollBox的拉动偏移(拉动偏移是指这个ScrollBox被拉拽了多少) = 鼠标相对于ScrollBox首个物体的理论位置的距离H,即下图中红色箭头的长度

 

上述的H   ÷  单个物体的长度   =   当前鼠标位置的序列号(类型为小数,将其用Round节点四舍五入就好)

GetFocusIndex函数体如下所示:

第八步 解释AddNewItem函数

如果在GetFocusIndex中得到的序列号大于当前的物品数,那就直接给ScrollBox添加一个子物体。

否则的话,就取出ScrollBox里面的子物体,然后insert这个物品(以Array的insert实现),清空ScrollBox在放置到ScrollBox中。

注意:每次进入函数后要将数组清空

AddNewItem函数如下图所示:

 

 

 

原文链接

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值