UE4 Timer

Timer这个东西在游戏开发里太常用了,大到游戏世界的驱动,小到物体的状态变迁,均有timer的身影。游戏世界虽说是个虚拟世界,但总归是需要时间维度的。在UE4中,Timer的基本作用就是在固定间隔内重复或单次执行某些操作。具体到应用,常见的就是Delay、固定频率刷新某个操作。

UE4中所有的Timer都是由全局类FTimerManager管理。在AActor之外,可以指定任意类型的委托。FTimerManager提供一些函数用来操作Timer,同时这些函数也能用于Timer的委托中,比如可以在一个Timer的委托里新建(删除)另一个Timer。

AActor::GetWorldTimerManager()用来获取当前世界的TimerManager实例。然后通过这个实例调用函数就可以控制Timer了。

一般来讲,你可能还需要一个FTimerHandle来指定具体的Timer。

  • SetTimer

为Timer指定回调函数、间隔时间,是否循环等参数,并启动该Timer,使其开始计时。该函数也可用来重设已有的Timer,此时,计时也将重新开始。

在Blueprint中常见的Delay节点在C++就需要用这个函数指定一个一次性的Timer。

  • ClearTimer

销毁清理指定的Timer,使其不再计时,当然也不会再回调。将SetTimer的间隔时间参数设为<0.f有同样的效果。

  • PauseTimer

暂停指定的Timer,此时Timer停止计时但会保存已经过的时间和剩余时间,直到恢复计时。

  • UnPauseTimer

激活已暂停的Timer。

  • IsTimerActive

获取指定Timer的当前状态(运行/暂停)

  • GetTimerRate

获得指定Timer的当前频率(就是时间间隔参数)。

  • GetTimerElapsed

获得指定Timer的当前间隔内已经计时的时长

  • GetTimerRemaining

获得指定Timer当前间隔内的剩余时长

已经计时的时长 + 剩余时长 = 间隔时间

常用的接口差不多就这些,更多更详细的可以参阅API文档。比如各种SetTimer的重载,更多Timer的状态信息。

### 使用C++在Unreal Engine 4中实现计时器功能 在Unreal Engine 4 (UE4) 中,可以通过 `FTimerHandle` 和 `GetWorldTimerManager()` 实现定时器功能。以下是详细的说明以及代码示例。 #### 定义和设置计时器 通过调用 `GetWorldTimerManager().SetTimer()` 方法来创建并启动一个计时器。此方法接受四个参数: 1. **FTimerHandle&**:用于存储计时器句柄以便稍后取消或管理它。 2. **TFunction<void()>&&** 或类成员函数指针:定义每次触发时执行的操作。 3. **float TimeDelay**:指定两次连续回调之间的时间间隔(秒)。 4. **bool bLooping**:决定计时器是一次性还是循环运行[^5]。 下面是一个简单的例子展示如何每两秒钟打印一条消息到日志: ```cpp #include "Kismet/GameplayStatics.h" #include "Engine/World.h" // 声明一个 FTimerHandle 成员变量用来保存我们的计时器实例. private: FTimerHandle MyTimerHandle; public: void StartMyTimer() { // 设置一个重复的计时器,每隔 2 秒钟调用 PrintMessage 函数一次. GetWorld()->GetTimerManager().SetTimer(MyTimerHandle, this, &UYourClass::PrintMessage, 2.0f, true); } void StopMyTimer() { // 如果计时器正在运行,则停止它. if (GetWorld()->GetTimerManager().IsTimerActive(MyTimerHandle)) { GetWorld()->GetTimerManager().ClearTimer(MyTimerHandle); } } void PrintMessage() { UE_LOG(LogTemp, Warning, TEXT("This message prints every 2 seconds!")); } ``` 上述代码片段展示了如何初始化、启动以及终止一个周期性的计时器。注意这里使用了 `this` 关键字绑定当前对象作为目标,并提供了指向具体处理逻辑的方法地址[^6]。 #### 取消计时器 当不再需要某个特定计时器的时候,应该及时清除掉以释放资源。这可通过 `ClearTimer(FTimerHandle)` 方法完成。如果尝试清理未激活的计时器不会引发错误;因此,在实际应用前通常会先验证其状态是否处于活动之中[^7]。 另外需要注意的是,所有的这些操作都依赖于有效的世界上下文 (`UWorld`) 存在才能正常工作。所以在任何可能丢失有效世界的场景下都要格外小心,比如销毁Actor或者切换Level期间等等情况下的特殊处理需求[^8]。 #### 计时器精度调整 默认情况下,引擎会对所有类型的更新频率做一定的优化限制从而提高性能表现。对于那些对时间敏感的应用程序来说可能会觉得不够精确。此时可以考虑修改项目的配置文件(Project Settings),找到“General Settings -> Tick Frequency”,将其设为更高的数值即可获得更精细控制的能力[^9]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值