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释放按钮。

Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。

保持更长时间会跳得更高(C# winforms)

Unreal UMG 遍历所有控件

虚幻引擎UI组件开发快速入门UMG/Slate