UE4小地圖插件Journeyman's Minimap中文編程參考
配套視頻教程:RTS風(fēng)格小地圖(Journeyman's Minimap插件改造)鼠標(biāo)點(diǎn)選定位和拖拽滑動鏡頭
鼠標(biāo)點(diǎn)擊小地圖
WidgetBlueprint'/MinimapPlugin/Widgets/Minimap.Minimap'
EventDispatcher(事件分發(fā)器) - OnMapClicked
需要先通過Bind Event to綁定此事件
示例:Minimap藍(lán)圖類中 Functions-Interaction-ProcessBackgroundClick()函數(shù)
小地圖框選開關(guān)

小地圖視椎體線框顯示

坐標(biāo)轉(zhuǎn)換說明:
1.將鼠標(biāo)的屏幕位置ScreenSpacePosition轉(zhuǎn)換為小地圖UV
參考a:
C++文件\Source\MinimapPlugin\Private\MapRendererComponent.cpp:UMapRendererComponent::HandleClick()函數(shù)
參考b:
藍(lán)圖類MinimapInternal_BackgroundMouseCapture
Functions - Mouse - OnMouseButtonUp()函數(shù)

2.將鼠標(biāo)在小地圖上點(diǎn)擊的UV轉(zhuǎn)換為世界位置:

調(diào)用MapView組件的C++函數(shù)DeprojectViewToWorld()
幾個節(jié)點(diǎn)含義:

返回是的是控件在屏幕上的長寬如(420,420)

所在藍(lán)圖類MinimapInternal_BoxSelect
返回的是當(dāng)前鼠標(biāo)屏幕坐標(biāo)相對于控件的本地坐標(biāo)(如控件覆蓋全屏,則等于屏幕坐標(biāo))
藍(lán)圖類MinimapInternal_BoxSelect
變量說明
MapGeo:小地圖控件
StartPos:鼠標(biāo)點(diǎn)擊位置相對于控件內(nèi)左上角的本地坐標(biāo)
StartOffset:當(dāng)前鼠標(biāo)位置減去鼠標(biāo)初始點(diǎn)擊位置
以上變量值來源:
藍(lán)圖類MinimapInternal_BackgroundMouseCapture
EventGraph – Start Drag – Create Widget(Minimap Internal Box Seclect) 初始化了這些變量。

此處還做了一件事,就是綁定了Minimap Internal Box Seclect控件的委托OnBoxSelect:

調(diào)用自身的委托OnBoxSelect,而其自己的委托是在
WidgetBlueprint'Minimap.Minimap'控件的Event Construction中被綁定的:

可見實(shí)際的小地圖框選處理函數(shù)為ProcessBoxSelect()。
鼠標(biāo)在小地圖框選事件
藍(lán)圖類MinimapInternal_BoxSelect
函數(shù) - OnMouseMove
鼠標(biāo)滑動時繪制選擇框
函數(shù) – OnPaint
?
結(jié)論:
由以上知識我們得出當(dāng)鼠標(biāo)滑動時我們可以這樣實(shí)時獲取當(dāng)前鼠標(biāo)在小地圖上所對應(yīng)的世界位置。
案例:當(dāng)鼠標(biāo)在小地圖拖拽(按住鼠標(biāo)左鍵)時,同步移動攝相機(jī)(視口)位置
位置:藍(lán)圖類MinimapInternal_BoxSelect(因?yàn)槲覀內(nèi)匀恍枰髽?biāo)在拖拽狀態(tài)才響應(yīng)滑動)的OnMouseMove函數(shù)里

最后這個DeprojectViewToWorld節(jié)點(diǎn)返回的就是世界位置。
驗(yàn)證: 可以和Minimap.Minimap的OnMapClicked事件打印出的坐標(biāo)比較,完全一致則說明正確。
驗(yàn)證2:MinimapInternal_Demo里也有鼠標(biāo)左鍵點(diǎn)擊小地圖產(chǎn)生一個圓圈的例子處可以打印世界坐標(biāo)位置,也可以與此處坐標(biāo)進(jìn)行比對,完全一致則說明正確。
