首发于 UE5开发
UE5中鼠标双击的实现方法

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;