在Unreal Engine 4.26.2版本中,使用UMG按钮时,如果在项目设置中的输入部分设置了bUseMouseForTouch=True,可能会遇到一个奇怪的现象:鼠标模拟按住按钮触发事件后,会在一段时间后自动调用释放按钮的操作。
问题描述
当在项目设置中启用鼠标模拟触摸功能时,UMG按钮在被长时间按住后会自动释放。这一问题在某些场景下可能导致用户体验不佳,需要进行处理。
问题原因
该问题的根本原因是Unreal Engine的内部机制。具体来说,FSlateApplication类中的TickPlatform函数会定期调用GenerateGestures方法来生成模拟的手势事件。在GenerateGestures方法中,有一个长按手势检测逻辑,当检测到长按时会触发释放按钮的操作。
以下是相关代码片段:
void FSlateApplication::TickPlatform(float DeltaTime) { // 其他代码 ForEachUser([this](FSlateUser& User) { User.GetGestureDetector().GenerateGestures(*this, SimulateGestures); }); }
在GenerateGestures方法中:
void FGestureDetector::GenerateGestures(FGenericApplicationMessageHandler& MessageHandler, const TBitArray& EnabledGestures) { if (EnabledGestures[(uint8)EGestureEvent::LongPress]) { const double CurrentTime = FPlatformTime::Seconds(); for (int32 TouchIndex = 0; TouchIndex = FGestureDetector::LongPressSeconds) { MessageHandler.OnTouchGesture(EGestureEvent::LongPress, FVector2D(0, 0), 0, false); LongPressTrack[TouchIndex].Reset(); } } } } }
长按时间默认为0.8秒,这是硬编码在引擎中的。
解决方法
由于修改引擎源码较为复杂且不推荐,我们可以采用一种简单的方法来解决这个问题:取消按钮的焦点捕获功能。具体步骤如下:
- 打开UMG按钮的属性面板。
- 找到“交互”选项卡。
- 取消勾选“可聚焦”(Is Focusable)选项。
通过这种方式,按钮将不会响应长按手势,从而避免自动释放的问题。
参考链接
如果您想了解更多关于此问题的信息,可以参考以下链接:
https://answers.unrealengine.com/questions/278238/long-press-buttons-in-umg.html