【UE4 C++】定时器 Timer 与事件绑定

概念

  • 定时执行操作,可执行一次,或循环执行直到手动终止
  • 定时器在全局定时器管理器(FTimerManager 类型)中管理。全局定时器管理器存在于 游戏实例 对象上以及每个 场景 中
  • 定时器需要绑定委托或函数,作为执行体。这些函数将填充 FTimerHandle 定时器句柄
  • FTimerHandle 支持 暂停、恢复倒计时;查询或更改剩余时间;取消定时器
  • 设置定时器的函数
    • SetTimer 定时执行
    • SetTimerForNextTick 下一帧执行
  • 使用案例
    • 定时 SpawnActor
    • 定时销毁
    • buff持续,如霸体、持续伤害

设置定时器

  • SetTimer 方法

  • 支持 FTimerDelegate 委托,可以扩展使用 Lambda 表达式,可以带参数

  • GetWorldTimerManager() 等价于 GetWorld()->GetTimerManager()

    template<class UserClass>
    void SetTimer
    (
        FTimerHandle & InOutHandle,
        UserClass * InObj,
        typename FTimerDelegate::TUObjectMethodDelegate_Const< UserClass >::FMethodPtr InTimerMethod,
        float InRate,
        bool InbLoop,
        float InFirstDelay
    )
    
  • 代码实现

    FTimerHandle SpawnerHandle;
    
    GetWorldTimerManager().SetTimer(SpawnerHandle, this, &AEnenmySpawner::SpawnEnemy, 5.0f, true);	
    
    void AEnenmySpawner::SpawnEnemy()
    {
    	GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Red, "Spawn");
    }
    

清空定时器

  • ClearTimer

  • ClearAllTimersForObject 清空与特定对象关联的所有定时器

    GetWorldTimerManager().ClearTimer(SpawnerHandle);
    
    // 参数传入一个对象,本例以 this 举例
    GetWorldTimerManagerr().ClearAllTimersForObject(this);
    

暂停和恢复

  • PauseTimer

  • UnPauseTimer

    GetWorldTimerManager().PauseTimer(SpawnerHandle);
    GetWorldTimerManager().UnPauseTimer(SpawnerHandle);
    GetWorldTimerManager().IsTimerPaused(SpawnerHandle);
    

判断是否活跃且未暂停

  • IsTimerActive

    GetWorldTimerManager().IsTimerActive(SpawnerHandle);
    

获取定时器速率

  • GetTimerRate
    句柄若无效,返回-1

    GetWorldTimerManager().GetTimerRate(SpawnerHandle);
    

获取经过时间和剩余时间

  • GetTimerElapsed
    句柄若无效,返回-1

  • GetTimerRemaining
    句柄若无效,返回-1

    GetWorldTimerManager().GetTimerElapsed(SpawnerHandle);
    GetWorldTimerManager().GetTimerRemaining(SpawnerHandle);
    

参考

posted @ 2021-05-05 22:40  砥才人  阅读(3369)  评论(0编辑  收藏  举报