思路:重载Actor的单击事件,通过计时器判断时间段内鼠标惦记的次数
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestActor.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FPlottingOnClicked, AActor*, TouchedActor);
/**
* 标绘对象基类
*/
UCLASS(BlueprintType, Blueprintable)
class TEST_API TestActor: public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
TestActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
public:
//鼠标点击次数,判断单击双击事件
int clickedNum = 0;
// 事件
//单击事件
UPROPERTY(BlueprintAssignable, BlueprintCallable)
FPlottingOnClicked EventDispatcher_PlottingOnClicked;
//双击事件
UPROPERTY(BlueprintAssignable, BlueprintCallable)
FPlottingOnClicked EventDispatcher_PlottingOnDoubleClicked;
//重写Actor的点击事件
virtual void NotifyActorOnClicked(FKey ButtonPressed = EKeys::LeftMouseButton) override;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "TestActor.h"
// Sets default values
TestActor::TestActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void TestActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void TestActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
//单击、双击事件
void TestActor::NotifyActorOnClicked(FKey ButtonPressed)
{
Super::NotifyActorOnClicked(ButtonPressed);
if (ButtonPressed == EKeys::LeftMouseButton)
{
clickedNum++;
// 设置计时器来判断单击或双击
FTimerHandle timerHandle;
GetWorldTimerManager().SetTimer(timerHandle, [this](void)
{
if (clickedNum == 1)
{
UE_LOG(LogTemp, Log, TEXT("single"));
EventDispatcher_PlottingOnClicked.Broadcast(this);
}
else if (clickedNum == 2)
{
UE_LOG(LogTemp, Log, TEXT("double"));
EventDispatcher_PlottingOnDoubleClicked.Broadcast(this);
}
else
{
UE_LOG(LogTemp, Error, TEXT("invalid clickedNumber"));
}
clickedNum = 0; // 重置点击计数器
}, 0.25f, false); // 设置计时器的时间间隔为0.25秒,并且只触发一次
}
}