UE4小地图插件Journeyman's Minimap中文编程参考
配套视频教程:RTS风格小地图(Journeyman's Minimap插件改造)鼠标点选定位和拖拽滑动镜头
鼠标点击小地图
WidgetBlueprint'/MinimapPlugin/Widgets/Minimap.Minimap'
EventDispatcher(事件分发器) - OnMapClicked
需要先通过Bind Event to绑定此事件
示例:Minimap蓝图类中 Functions-Interaction-ProcessBackgroundClick()函数
小地图框选开关

小地图视椎体线框显示

坐标转换说明:
1.将鼠标的屏幕位置ScreenSpacePosition转换为小地图UV
参考a:
C++文件\Source\MinimapPlugin\Private\MapRendererComponent.cpp:UMapRendererComponent::HandleClick()函数
参考b:
蓝图类MinimapInternal_BackgroundMouseCapture
Functions - Mouse - OnMouseButtonUp()函数

2.将鼠标在小地图上点击的UV转换为世界位置:

调用MapView组件的C++函数DeprojectViewToWorld()
几个节点含义:

返回是的是控件在屏幕上的长宽如(420,420)

所在蓝图类MinimapInternal_BoxSelect
返回的是当前鼠标屏幕坐标相对于控件的本地坐标(如控件覆盖全屏,则等于屏幕坐标)
蓝图类MinimapInternal_BoxSelect
变量说明
MapGeo:小地图控件
StartPos:鼠标点击位置相对于控件内左上角的本地坐标
StartOffset:当前鼠标位置减去鼠标初始点击位置
以上变量值来源:
蓝图类MinimapInternal_BackgroundMouseCapture
EventGraph – Start Drag – Create Widget(Minimap Internal Box Seclect) 初始化了这些变量。

此处还做了一件事,就是绑定了Minimap Internal Box Seclect控件的委托OnBoxSelect:

调用自身的委托OnBoxSelect,而其自己的委托是在
WidgetBlueprint'Minimap.Minimap'控件的Event Construction中被绑定的:

可见实际的小地图框选处理函数为ProcessBoxSelect()。
鼠标在小地图框选事件
蓝图类MinimapInternal_BoxSelect
函数 - OnMouseMove
鼠标滑动时绘制选择框
函数 – OnPaint
结论:
由以上知识我们得出当鼠标滑动时我们可以这样实时获取当前鼠标在小地图上所对应的世界位置。
案例:当鼠标在小地图拖拽(按住鼠标左键)时,同步移动摄相机(视口)位置
位置:蓝图类MinimapInternal_BoxSelect(因为我们仍然需要鼠标在拖拽状态才响应滑动)的OnMouseMove函数里

最后这个DeprojectViewToWorld节点返回的就是世界位置。
验证: 可以和Minimap.Minimap的OnMapClicked事件打印出的坐标比较,完全一致则说明正确。
验证2:MinimapInternal_Demo里也有鼠标左键点击小地图产生一个圆圈的例子处可以打印世界坐标位置,也可以与此处坐标进行比对,完全一致则说明正确。


