UE5 C++ 定时器使用

概念

  • 定时器在全局定时器管理器(FTimerManager类型)中管理。
  • 全局定时器管理器存在于 游戏实例 对象上以及每个场景中。
  • 有两个函数可以使用定时器管理器来设置定时器:SetTimerSetTimerForNextTick,它们各自都有一些重载,每个函数都可以连接到任意类型的对象或函数委托
  • 函数需要使用UFUNCTION()标识

使用

  • 访问定时管理器

    • Actor及其派生类中使用 GetWorldTimeManager函数
  • 访问全局定时器管理器

    • UGameInstance::GetTimerManager();
    • 全局管理器可以用于与任何特定场景的存在没有相关性或依赖性的函数调用
  • 定时器
    1.设置

    template<class UserClass>
    void SetTimer
    (
        FTimerHandle & InOutHandle,
        UserClass * InObj,
        typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod,
        float InRate,
        bool InbLoop,
        float InFirstDelay
    )
    

    2.清空:

    • 将 SetTimer 期间填充的 FTimerHandle 传递到 FTimerManager 函数 ClearTimer
      GetWorldTimerManager().ClearTimer(YourTimerHnadleInstance);
    • 使用现有定时器句柄调用 SetTimer 将清空该定时器句柄引用的定时器,并将它换成新定时器
    • 与特定对象关联的所有定时器都可以通过调用 GetWorldTimerManager().ClearAllTimersForObject(objectInstance);来清空

    3.暂停与恢复

    • FTimerManager::PauseTimer()使用定时器句柄来暂停正在运行的定时器。这样可阻止定时器执行其函数调用,但经过的时间和剩余时间将保持暂停时的状态
    • FTimerManager::PauseTimer()使暂停的定时器恢复运行

    4.定时器信息

    • FTimerManager::IsTimerActive()函数用于确定指定定时器当前是否活跃且未暂停。
    • FTimerManager::GetTimerRate()用于从定时器句柄获取定时器的当前速率(两次激活之间的时间)
    • FTimermanager::GetTimerElapsed()&GetTimerRemaining(),针对与所提供的定时器句柄关联的定时器,提供了返回经过时间和剩余时间的功能

    5.传递参数

    FTimerHandle UniqueHandle;
    FTimerDelegate RespawnDelegate = FTimerDelegate::CreateUObject( this, &AMyGameMode::RespawnPlayer, Player );
    GetWorldTimerManager().SetTimer( UniqueHandle, RespawnDelegate, Delay, false );
    
posted @ 2023-06-19 16:04  scyrc  阅读(1032)  评论(0编辑  收藏  举报