まだゲームプレイを時間管理する段階のものを作っているわけじゃないんだが、ちょっと必要かもしれない。
Timer Manager へのアクセスは、GetWorldTimerManager というAActor 関数を通して行われ、これは、UWorld で GetTimerManager 関数を呼び出します。グローバル Timer Manager にアクセスするには、UGameInstance 関数、`GetTimerManager’ を使用します。これは、何らかの理由でワールドに独自の Timer Manager がない場合に使われるフォールバックでもあり、特定のワールドの存在に関係なく、または依存せずに関数呼び出しをするために使用することができます。
これを見ると、GameInstanceのメンバーにFTimerManager *TimerManagerがあるが、こういうものは関数で取得できるなら関数を使っておきたい。
まだいまいちよく分からないんだが、というか漸く分かってきたかもしれないんだが、このGetTimerManagerとSetTimerをVS2022で見てみるとinline定義されている。こういうinline定義ものは普通に関数呼び出ししてAPIリファレンスにある通りに戻り値を左辺に代入してあげようとするとコンパイルエラーになったりする。俺にとっては分かり難いんだが、JavaScriptのように書いてあげる必要があるみたいだ。
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// 1秒に1回、今から2秒後に始まるRepeatingFunctionを呼び出します
GetWorldTimerManager().SetTimer(MemberTimerHandle, this, &AMyActor::RepeatingFunction, 1.0f, true, 2.0f);
}
関数の後に”->”を付けたり、”.”を付けたり。
functionA()->functionB();
functionC().functionD();
とか。
これの場合はfunctionA()がポインタを返すから -> になる。
functionC()は参照を返すから . になる。という理解で合っていてくれないと困るんだが、なんでこんなにややこしくしたんだか。こんなに凄いエンジンをタダで使わせてもらっているんだから文句が言えようはずもないんだが、頭がいい人たちが考えることはよく分からない。
コメント