keyword: UE4, Mobile, Joystick, UMG Button, OnClick, OnTouch, OnRelease

Issues

问题1:UMG widget 遮挡 joystick,导致joystick只显示无法使用的问题。
原因:UMG的Canvas Panel组件的Visibility属性被修改了。
解决办法:打开UMG蓝图,设置Canvas Panel的Visibility为:Self Hit Test Invisible。

问题2:joystick摇杆和UMG button在移动端冲突的问题:按住摇杆时,UMG button按了不起作用。
原因:UMG button的Is Focusable属性设置为了true。
解决办法:UMG button的Is Focusable属性设置为false。

问题3:按住摇杆不放,UMG button点击事件中,摇杆的InputValue被引擎值为0,Button Release后InputValue才恢复为原有值。
原因:同上。
解决办法:同上。

问题4:Widget的Visibility属性默认为Self Hit Test Invisible,这样,每当有新的Widget AddToViewport时,当前Widget会被自动隐藏。但是默认的Visibility无法响应Widget之外的鼠标或touch事件(比如一个UButton,如果按住UButton不放,然后鼠标或者手指拖拽到UButton之外,那么当松开鼠标或手指时,该button的Release事件无法响应),但是Visibility属性如果设置成Visible,那么就可以响应,但是当新的Widget添加Viewport时,当前Widget不会自动隐藏。

参考:Virtual Joystick conflicts UMG Buttons
https://answers.unrealengine.com/questions/211064/virtual-joystick-conflicts-umg-buttons.html

以上问题在4.18到4.21版本中验证过,不保证后续新版本仍存在。

Examples

基于HUD实现的技能摇杆系统:SkillJoystick for UE4
缺点:没有UMG Button完善的交互功能,只有拖拽和摇动;
优点:避开了UMG的所有潜规则,且性能远超UMG。

ESlateVisibility

\Engine\Source\Runtime\UMG\Public\Components\SlateWrapperTypes.h

/** Is an entity visible? */
UENUM(BlueprintType)
enum class ESlateVisibility : uint8
{
    /** Default widget visibility - visible and can interact with the cursor */
    Visible,
    /** Not visible and takes up no space in the layout; can never be clicked on because it takes up no space. */
    Collapsed,
    /** Not visible, but occupies layout space. Not interactive for obvious reasons. */
    Hidden,
    /** Visible to the user, but only as art. The cursors hit tests will never see this widget. */
    HitTestInvisible,
    /** Same as HitTestInvisible, but doesn't apply to child widgets. */
    SelfHitTestInvisible
};
How to set visibility of Virtual Joystick at run-time
void APlayerController::SetVirtualJoystickVisibility(bool bVisible);

念念不忘,必有回响。----陈念萱