UE4拖拽功能的蓝图基础实现
记录一个学习UE官方拖拽UI过程,指出一个层级结构问题
1、点击时记录鼠标点击位置为被拖拽UI 局部坐标下的偏移量#
2、触发DragDetected事件#
这个事件里创建被拖拽的预览物体
预览物体可以用一个被sizebox包裹的border色块来表示
这个预览物体创建时需要传入被拖拽的UI的引用,从中获取UI的大小,然后基于这个预览对象创建继承了DragDropOperation的对象(这里就叫WidgetDrag对象)
创建这个对象时的pivot选择mouse down,最下面的offset是pivot的offset
一次dragdrop是独立的,通过这个dragdropoperation的对象可以传递DragDrop数据
3、预览对象的蓝图就是创建时给sizebox的宽高赋值#
expose on spawn可以当生成一个这个对象时让外界对这个对象赋值(WidgetDrag对象也用了这个来创建时候给要传递的数据赋值)
4、drop后计算拖拽的位置#
UE原本的版本#
使用了SetPositionInViewPort
这样会产生一个问题:先removefromparent导致被拖的UI原有的widgettree被打乱,重新addtoViewport后会被添加在别的层,使用widgetReflector查看
原本的层级:
拖动后的层级:
改进版#
可以保留widgettree的结构,需要指定出是在哪个canvas的geometry,就是保持着原有的tree结构在parent的canvas局部坐标下进行位置改变,注意只有canvas slot可以直接SetPosition
这样就可以自由的拖拽普通的UI了
而对于Button这类UI,他们会吃掉OnMouseButtonDown这个事件
作者:FlyingZiming
出处:https://www.cnblogs.com/FlyingZiming/p/14549338.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
但行好事,莫问前程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示