Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。
Posted cartzhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。相关的知识,希望对你有一定的参考价值。
UE 鼠标模拟按住按钮会自动释放的bug
遇到的问题
在UE4.26.2 版本上使用UMG作为按钮的时候,当在ProjetSettings的input中设置
bUseMouseForTouch=True
时候,奇怪的事情发生了,鼠标模拟按住按钮触发事件,会在一段时间后自动调用了释放release按钮。
同事找我来看看下,我就找找看。
查找
在网上溜达一圈,发现有类似问题:
https://answers.unrealengine.com/questions/278238/long-press-buttons-in-umg.html
说是虚幻的BUG,但是官方就是不修改。
是怎么造成的呢?
这个是在FSlateApplication中有给
void FSlateApplication::TickPlatform(float DeltaTime)
函数。
在函数最后调用了
// Generate any simulated gestures that we've detected.
ForEachUser([this](FSlateUser& User) {
User.GetGestureDetector().GenerateGestures(*this, SimulateGestures);
});
而GenerateGestures的代码里
void FGestureDetector::GenerateGestures(FGenericApplicationMessageHandler& MessageHandler, const TBitArray<FDefaultBitArrayAllocator>& EnabledGestures)
{
if ( EnabledGestures[(uint8)EGestureEvent::LongPress] )
{
const double CurrentTime = FPlatformTime::Seconds();
for ( int32 TouchIndex = 0; TouchIndex < EKeys::NUM_TOUCH_KEYS; TouchIndex++ )
{
if ( LongPressTrack[TouchIndex].Time.IsSet() )
{
const double DeltaTime = CurrentTime - LongPressTrack[TouchIndex].Time.GetValue();
if ( DeltaTime >= FGestureDetector::LongPressSeconds )
{
MessageHandler.OnTouchGesture(EGestureEvent::LongPress, FVector2D(0, 0), 0, false);
LongPressTrack[TouchIndex].Reset();
}
}
}
}
}
就是这里,有人发现是0.8s的时候,就是这里面写死的。
然后在
bool FSlateApplication::OnTouchGesture
来实现调用的。
有兴趣的可以跟踪下代码。
目前的解决方法
因为并没有打算修改引擎,所以还是用最简单方法来做。就是
就是把Is Focusable 勾选掉。
参考
https://answers.unrealengine.com/questions/278238/long-press-buttons-in-umg.html
以上是关于Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。的主要内容,如果未能解决你的问题,请参考以下文章
Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。
Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。