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這個事件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM