UE5中鼠标双击的实现方法
在前面的章节中,我们讨论了鼠标的左键点击与悬停事件的监听与响应。同样地,游戏中也经常会通过鼠标的左键(或右键)双击来实现玩家对游戏的控制。下面,我们将讨论鼠标的左键双击的实现方法。
鼠标双击是指连续两次点击了鼠标,并且两次点击的时间间隔足够短,第二次点击时才触发双击事件。鼠标双击是在鼠标点击的基础上实现的,UE 没有提供现成的实现方法。实现逻辑说起来也简单,但其实里面存在一个难以解决的问题。
一,一种实现方法
一种实现方法是:当鼠标点击时,如果此时不处于双击测试阶段,则进入双击测试阶段;如果已经处于双击测试阶段,则比较此刻与上一次鼠标点击时的时间间隔,如果间隔足够小,就触发双击事件并退出双击测试阶段,如果间隔较大,则什么也不用干。
代码实现如下:
首先声明三个变量:触发双击事件的时间间隔的临界值 DoubleClickTestPadding、记录上一次点击时刻的 LastClickTime、记录是否在双击测试阶段的 bInDoubleClickTest。
private:
// 触发双击事件的时间间隔的临界值
static const float DoubleClickTestPadding;
// 记录上一次的点击时刻
UPROPERTY()
float LastClickTime = 0;
// 记录是否在双击测试阶段
UPROPERTY()
bool bInDoubleClickTest = false;
其次在触发鼠标点击事件时,判断是否应该触发鼠标双击事件,判断算法如下:
const float ACylindricalWall::DoubleClickTestPadding = 0.3f;
void ACylindricalWall::NotifyActorOnClicked(FKey ButtonPressed)
Super::NotifyActorOnClicked(ButtonPressed);
GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, TEXT("Click"));
double NowTime = FDateTime::Now().GetTimeOfDay().GetTotalSeconds();
// 是否处于双击测试阶段
if (bInDoubleClickTest) {
// 如果已经处于双击测试阶段,则比较此刻与上一次鼠标点击时的时间间隔
if (NowTime - LastClickTime < DoubleClickTestPadding) {
//如果间隔足够小,就触发双击事件并退出双击测试阶段
OnLeftDoubleClick();
bInDoubleClickTest = false;
else {
// 如果不处于双击测试阶段,则进入双击测试阶段
bInDoubleClickTest = true;
// 每次鼠标点击,都要记录点击的时刻
LastClickTime = NowTime;