タイマータイマースクラッチUE4プロファイル



Timer Timer Scratch Ue4 Profile



タイマー 一定期間後に操作を実行するために、単一または間隔を置いて繰り返すことができます。

タイマー管理

グローバルタイマー タイミングマネージャー (FTimerManager)管理。グローバルタイミングマネージャーに存在 アクター (()GetWorldTimerManagerによって取得)および UWorld In(GetTimerManager()によって取得)。タイマーは、タイマーマネージャーの2つの機能を使用して設定できます。 SetTimerSetTimerForNextTick それぞれにいくつかのバリエーションがあります。最も一般的に使用されるタイマーは次のとおりです。



void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TUObjectMethodDelegate::FMethodPtr InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)

時間の終了前にタイマーオブジェクト(アクターなど)を破棄すると、関連付けられたタイマーは自動的にキャンセルされます。この場合、タイマーハンドルは無効になり、関数を呼び出しません。

GetWorldTimerManager().SetTimer(TimeHandle, this, &ATestTimerActor::TimerCallback, 1.0, true, 3.0)

タイマーを設定して空にする

タイマーをクリアするために、SetTimer FTimerHandle中にfilledをFTimerManagerに渡すと、ClearTimerが機能し、タイマーハンドラーはこの時点で失敗し、新しいタイマーを再度管理するために使用できます。既存のタイマーハンドルを使用してSetTimerを呼び出すと、タイマーハンドルが参照しているタイマーがクリアされ、新しいタイマーに置き換えられます。さらに、特定のオブジェクトに関連付けられているすべてのタイマーは、ClearAllTimersForObjectを呼び出すことでクリアできます。



0以下のレートでは、SetTimerClearTimerを呼び出すことと同じです。

GetWorldTimerManager().ClearTimer(TimeHandle)

タイマーを一時停止して再開します

FTimerManager関数 PauseTimer タイマーを一時停止することができ、 UnPauseTimer 一時停止したタイマーを再開できます。

GetWorldTimerManager().PauseTimer(TimeHandle) GetWorldTimerManager().UnPauseTimer(TimeHandle)

タイマーステータス

  • 関数 IsTimerActive 指定されたタイマーの現在の状態を判別するには、アクティブで中断されていません。
  • 関数 IsTimerPaused 指定されたタイマーを決定するために、現在一時停止されています。
GetWorldTimerManager().IsTimerActive(TimeHandle); GetWorldTimerManager().IsTimerPaused(TimeHandle);

タイマー他にもたくさんの機能があります。例:GetTimerRate取得タイマーレート、GetTimerElapsedこのコールバックタイマー経過時間、GetTimerRemainingこのコールバックタイマー残り時間など。



テストコード

FTimerHandle TimeHandle void TimerCallback() FTimerHandle TimeHandle1 void TimerCallback1() #include 'TestTimerActor.h' // Sets default values ATestTimerActor::ATestTimerActor() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = false TimerCount = 10 } // Called when the game starts or when spawned void ATestTimerActor::BeginPlay() { Super::BeginPlay() GetWorldTimerManager().SetTimer(TimeHandle, this, &ATestTimerActor::TimerCallback, 1.0, true, 3.0) } void ATestTimerActor::TimerCallback() { UE_LOG(LogClass, Log, TEXT('I'm Timer Callback!')) --TimerCount if (TimerCount == 6) { GetWorldTimerManager().PauseTimer(TimeHandle) UE_LOG(LogClass, Log, TEXT('Timer is Paused')) UE_LOG(LogClass, Log, TEXT('IsTimerPaused? %s'), GetWorldTimerManager().IsTimerPaused(TimeHandle) ? TEXT('Paused') : TEXT('Running')) UE_LOG(LogClass, Log, TEXT('IsTimerPaused? %s'), GetWorldTimerManager().IsTimerActive(TimeHandle) ? TEXT('Running') : TEXT('Paused')) GetWorldTimerManager().SetTimer(TimeHandle1, this, &ATestTimerActor::TimerCallback1, 5.0, false) } else if (TimerCount <= 0) { GetWorldTimerManager().ClearTimer(TimeHandle) UE_LOG(LogClass, Log, TEXT('Timer is cleard')) UE_LOG(LogClass, Log, TEXT('IsTimerPaused? %s'), GetWorldTimerManager().IsTimerPaused(TimeHandle) ? TEXT('Paused') : TEXT('Running')) UE_LOG(LogClass, Log, TEXT('IsTimerPaused? %s'), GetWorldTimerManager().IsTimerActive(TimeHandle) ? TEXT('Running') : TEXT('Paused')) } } void ATestTimerActor::TimerCallback1() { GetWorldTimerManager().UnPauseTimer(TimeHandle) UE_LOG(LogClass, Log, TEXT('IsTimerPaused? %s'), GetWorldTimerManager().IsTimerPaused(TimeHandle) ? TEXT('Paused') : TEXT('Running')) UE_LOG(LogClass, Log, TEXT('IsTimerPaused? %s'), GetWorldTimerManager().IsTimerActive(TimeHandle) ? TEXT('Running') : TEXT('Paused')) }