【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);
    

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM