ue4 setTimer定时器传参数

本文详细介绍了在C++中如何通过两种不同的方式设置定时器。第一种方式直接在类AActor中定义并调用定时器,第二种方式通过AAdapterActor类使用UFUNCTION装饰器绑定特定值到函数,再调用定时器。每种方式都在.h和.cpp文件中给出了具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建一个c++类AActor

方式一

.h文件

void timer(int32 a);
void Calltimer();

.cpp文件

void AActor::Calltimer()
{
    int32 a = 3;
    FTimerHandle UniqueHandle;
    FTimerDelegate RespawnDelegate = FTimerDelegate::CreateUObject(this, &AActor::timer, a);
    GetWorldTimerManager().SetTimer(UniqueHandle, RespawnDelegate, 3.0f, false);

}
void AActor::timer(int32 a)
{
	
}

方式二

.h文件

void Calltimer();

UFUNCTION()
void timer(int32 a);

.cpp文件

void AAdapterActor::Calltimer()
{
    FTimerHandle TimerHandle;
    FTimerDelegate TimerDel;
    int32 a = 1;
    //Binding the function with specific values
    TimerDel.BindUFunction(this, FName(TEXT("timer")), a);
    //Calling MyUsefulFunction after 2 seconds without looping
    GetWorldTimerManager().SetTimer(TimerHandle, TimerDel, 2.0f, false);
}

void AAdapterActor::timer(int32 a)
{
	
}

 

在 Unreal Engine 中使用 C++ 创建定时器(`SetTimer`)是一种非常常见的方式,用于延迟执行某些任务或者定期触发特定的行为。你可以利用 `FTimerHandle` 来管理和取消这些计时器,并通过 `GetWorld()->GetTimerManager().SetTimer(...)` 函数设置它们。 下面是关于如何在 UE4/C++ 中创建和管理定时器的一个基本例子: ### 定义一个简单的定时器 首先,在你的 Actor 或其他类中声明一些必要的成员变量: ```cpp // 在头文件 (.h) 中添加以下内容: UPROPERTY() float MyTimeInterval; // 计时器间隔时间 FVector LocationOffset; // 示例数据:位置偏移量 FTimerHandle TimerHandle_SingleShot; // 单次定时器句柄 FTimerHandle TimerHandle_Periodic; // 循环定时器句柄 AFooCharacter(); // 构造函数声明 protected: virtual void BeginPlay() override; // 覆盖BeginPlay方法 private: UFUNCTION() void SingleShotTimerFunction(); // 单次定时器回调函数 UFUNCTION() void PeriodicTimerFunction(); // 周期性定时器回调函数 ``` 然后在 `.cpp` 文件里实现上述功能: ```cpp // .cpp 实现部分 AFooCharacter::AFooCharacter() { PrimaryActorTick.bCanEverTick = true; // 初始化默认值 MyTimeInterval = 5.0f; // 每隔五秒触发一次 LocationOffset.Set(100.f, 0.f, 0.f); } void AFooCharacter::BeginPlay() { Super::BeginPlay(); // 设置单次定时器,在三秒钟之后调用SingleShotTimerFunction函数 GetWorld()->GetTimerManager().SetTimer( TimerHandle_SingleShot, this, &AFooCharacter::SingleShotTimerFunction, 3.0f, false /*仅运行一次*/); // 设置周期性的定时器,每隔MyTimeInterval秒调用PeriodicTimerFunction函数 GetWorld()->GetTimerManager().SetTimer( TimerHandle_Periodic, this, &AFooCharacter::PeriodicTimerFunction, MyTimeInterval, true /*循环*/); } void AFooCharacter::SingleShotTimerFunction() { // 执行一次性动作,比如移动到新位置 FVector NewLocation = GetActorLocation() + LocationOffset; SetActorLocation(NewLocation); UE_LOG(LogTemp, Log, TEXT("Moved to new location after single shot timer.")); } void AFooCharacter::PeriodicTimerFunction() { // 这里的代码会在每个MyTimeInterval时间内被执行, // 可以在此处放置需要重复执行的任务逻辑。 static int Counter = 0; ++Counter; UE_LOG(LogTemp, Log, TEXT("Periodic action has been called %d times."), Counter); } ``` 在这个例子中我们做了两件事: - 此定时器将在初始化后的第三秒被激活,只运行一次; - **周期性定时器** (`PeriodicTimerFunction`) - 按照设定的时间间隔(由 `MyTimeInterval` 决定),每过这么长时间就会自动再次调用这个函数直到手动清除它为止; 为了安全地清理不再使用的定时器,应该始终记得释放或停用旧有的定时器实例。例如当你想提前终止某个活动时,可以这样做: ```cpp if (GetWorld()) { GetWorld()->GetTimerManager().ClearTimer(TimerHandle_Periodic); GetWorld()->GetTimerManager().ClearTimer(TimerHandle_SingleShot); } ``` 这将防止因未预期的状态变化而导致潜在的问题。 希望这对您有所帮助!如果您有任何更具体的场景需求或者其他相关疑问,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值