目錄
記錄一個學習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這個事件