Verwendung des UE C++ Timer-Timers

[UE C++] Timer-Timer

1. Kernpunkte:

  • Der Timer des UE umfasst zwei Funktionen, Verzögerung und Timing, die über bLoop eingestellt werden.
  • Der Timer wird in FTimerManager verwaltet , der in der UGameInstance-Instanz vorhanden ist und von jedem Szenenelement abgerufen werden kann.
  • Stellen Sie den Timer so ein, dass er zwei SetTimerund SetTimerForNextTickzwei Schnittstellen hat
  • Der Timer wird über ein FTimerHandle- Objekt verwaltet , einschließlich Vorgängen wie Anhalten, Fortsetzen und Abbrechen.

2. FTimerManager

Verwalten Sie alle Timer und existieren Sie in der UGameInstance-Instanz. Jedes Szenenelement kann abgerufen werden. Die Erfassungsmethode ist wie folgt:

GetGameInstance()->GetTimerManager();
GetWorld()->GetTimerManager();
GetWorldTimerManager();

Im Wesentlichen wird es über UGameInstance::GetTimerManager() abgerufen

inline FTimerManager& GetTimerManager() const
{
    return (OwningGameInstance ? OwningGameInstance->GetTimerManager() : *TimerManager);
}
FTimerManager& AActor::GetWorldTimerManager() const
{
	return GetWorld()->GetTimerManager();
}

3. FTimerHandle

Timer-Handle, das zum Anhalten, Fortsetzen, Abbrechen des Timers und zum Verwalten des Timers verwendet wird

3.1 Erklärung

FTimerHandle TestTimerHandle;

3.2 Anhalten und fortfahren

GetWorldTimerManager().PauseTimer(TestTimerHandle);

GetWorldTimerManager().UnPauseTimer(TestTimerHandle);

3.3 Abbrechen

GetWorldTimerManager().ClearTimer(TestTimerHandle);

//取消指定对象的所有Timer
GetWorldTimerManagerr().ClearAllTimersForObject(this);

3.4 Timer-Status abrufen

//Get Rate  TimerHandle无效返回-1
GetWorldTimerManager().GetTimerRate(TestTimerHandle);

//是否暂停
GetWorldTimerManager().IsTimerPaused(TestTimerHandle);

//是否活跃且未暂停
GetWorldTimerManager().IsTimerActive(TestTimerHandle);

//是否存在且等待运行
GetWorldTimerManager().IsTimerPending(TestTimerHandle);

//是否存在
GetWorldTimerManager().TimerExists(TestTimerHandle);

//剩余时间   TimerHandle无效返回-1
GetWorldTimerManager().GetTimerRemaining(TestTimerHandle);

//已运行时间 TimerHandle无效返回-1
GetWorldTimerManager().GetTimerElapsed(TestTimerHandle);

4. Stellen Sie den Timer ein

4.1 Timer einstellen

Es gibt 6 Überladungen

//Callback 类的成员函数
void SetTimer
(
    FTimerHandle& InOutHandle, 
    UserClass* InObj,

    typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr InTimerMethod,
    //typename FTimerDelegate::TUObjectMethodDelegate_Const< UserClass >::FMethodPtr 

    float InRate,
    bool InbLoop = false, 
    float InFirstDelay = -1.f
);

//Callback Delegate的Bind函数
void SetTimer
(
    FTimerHandle& InOutHandle, 

    FTimerDelegate const& InDelegate, 
    //FTimerDynamicDelegate const& InDynDelegate

    float InRate, 
    bool InbLoop, 
    float InFirstDelay = -1.f
);
DECLARE_DELEGATE(FTimerDelegate);//无法带参数
DECLARE_DYNAMIC_DELEGATE(FTimerDynamicDelegate);//无法带参数

//Callback空气,不知道有啥用
void SetTimer
(
    FTimerHandle& InOutHandle, 
    float InRate, 
    bool InbLoop, 
    float InFirstDelay = -1.f
);

//Callback TFunction,常用于Lambda函数(可捕获参数)
void SetTimer
(
    FTimerHandle& InOutHandle, 
    TFunction<void(void)>&& Callback, 
    float InRate, 
    bool InbLoop, 
    float InFirstDelay = -1.f 
);

Der Autor ist der Ansicht, dass die Verwendung in drei Kategorien unterteilt werden kann. Das Folgende ist ein Beispiel:
Definieren Sie zunächst eine Testfunktion

void ATimerHandleTest::TimerPrintTest()
{
	UE_LOG(LogTemp, Warning, TEXT("Timer Callback"));
}

Klassenmitgliedsfunktionen

GetWorldTimerManager().SetTimer(TestTimerHandle, this, &ThisClass::TimerPrintTest, 2.0f, true);

Delegieren

DECLARE_DELEGATE(FTestTimerHandle);

FTestTimerHandle TestTimerHandleDelegate;

TestTimerHandleDelegate.BindUObject(this, &ThisClass::TimerPrintTest);

GetWorldTimerManager().SetTimer(TestTimerHandle, TestTimerHandleDelegate, 2.0f, true);

TFunction

verwendet hier die Lambda-Funktion als Beispiel

float t = 10.f;
GetWorldTimerManager().SetTimer(
    TestTimerHandle,
    [t] {
        GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, FString::Printf(TEXT("Timer Callback:%f"), t));
    },
    2.f, true);

Weitere Parametererklärungen:

  • InRate: Schleifenrate. Wenn <= 0.f, werden vorhandene Timer gelöscht
  • InbLoop: Ob eine Schleife ausgeführt werden soll
  • InFirstDelay: Verzögerung für den ersten Trigger. Wenn < 0.f, wird InRate verwendet.

4.2 SetTimerForNextTick

Der Rückruf wird im nächsten Frame ausgelöst. Er wird nicht sehr häufig verwendet. Es gibt insgesamt 5 Überladungen, die im Grunde mit SetTimer identisch sind.

FTimerHandle SetTimerForNextTick
(
    UserClass* inObj, 
    typename FTimerDelegate::TUObjectMethodDelegate< UserClass >::FMethodPtr inTimerMethod
    //typename FTimerDelegate::TUObjectMethodDelegate_Const< UserClass >::FMethodPtr inTimerMethod
);

FTimerHandle SetTimerForNextTick(FTimerDelegate const& InDelegate);

FTimerHandle SetTimerForNextTick(FTimerDynamicDelegate const& InDynDelegate);

FTimerHandle SetTimerForNextTick(TFunction<void(void)>&& Callback);

Ich werde hier kein Beispiel nennen, es ist im Grunde dasselbe wie SetTimer.

5. Vorsichtsmaßnahmen

  • Der Timer ist nicht threadsicher und kann eine Behauptung auslösen, wenn von außerhalb des Spielthreads darauf zugegriffen wird.
  • Erstellen Sie einen Timer in einer von UObject geerbten Klasse in UE4. Wenn die Objektinstanz der Klasse zerstört wird, wird auch der Timer zerstört.
  • Es ist am besten, kein lokales TimerHandle in einer Funktion zu definieren. Obwohl der Timer normal läuft, können Programmierer den Timer nicht manuell verwalten.
  • Wenn beim Festlegen eines Timers bereits ein Timer für dieses TimerHandle festgelegt ist, ersetzt dieser den alten Timer
  • Die Timer-Rate kann nicht direkt geändert werden, aber ihr TimerHandle-Aufruf kann verwendet werden, SetTimerum den Timer zu löschen und einen neuen Timer zu erstellen

Referenzlink

GamePlay Timer

UE4 Essay: Gameplay Timer

Supongo que te gusta

Origin blog.csdn.net/qq_52179126/article/details/129834550
Recomendado
Clasificación