アヒルのある日

株式会社AHIRUの社員ブログです。毎週更新!社員が自由に思いついたことを書きます。

UnrealEngineのTick系が走らなくて躓いた話

こんにちは、かたいプログラマーです。
本日はタイトルにもありますが、UnrealEngineを使用した際にTickなどの毎フレーム通ってほしい処理が通らないことがあったのでその話をします。

①ActorのTickが通らない


まずはシンプルにTickが通らなかった件について。
いきなり原因ですが

PrimaryActorTick.bCanEverTick = false;

この一文…Tick止めてます
通るわけないですね。ただし、頻繁に起きるかというとそんなことはなくて、デフォルトがtrueなので明示的にfalseにしない限り気にしなくて問題ありません

ただ、自分や他人が過去にfalseにする処理挟んでたりすると気づきにくいです。 

ちなみにBeginPlay()で親のBeginPlay()を呼ばなかった場合もTickは動かないようです。 Super::BeginPlay() は必要…( ..)φメモ

②UserWidgetのNativeTickが通らない


はい、見出しの通りUserWidgetのNativeTickが通りませんでした。

ちなみに原因は初期化系の処理を呼んでいなかったからでした。
上に書いたSuper::BeginPlay()の話とほぼ同じです。
この時点でSuper::BeginPlay()を呼ぶ必要があるのは知っていましたが、UserWidgetにはBeginPlay()がありませんでした。

TickもWidgetだとNativeTickって感じで若干Actorとは名前が違うので別の名前で存在していると予想できる話ではありますが、この時は全然気づけませんでした…。

UserWidgetの初期化系の関数は3つあります。
NativeOnInitialized()
NativePreConstruct()
NativeConstruct()
非常にややこしいですね…。

加えて破棄時の関数
NativeDestruct()
もoverrideする必要があります。
それぞれ呼ばれるタイミングは

NativeOnInitialized()
 →Widgetの作成時
NativePreConstruct()
 →ビューポートへの追加時とエディターで表示したとき
NativeConstruct()
 →ビューポートへの追加時、NativePreConstruct()の後に呼ばれる
NativeDestruct()
 →ビューポートから削除された時

のようです。間違えていたらすみません…。 指摘していただけると助かります! 以上が自分が躓いた箇所になります。
少しでも困っている人の助けだったり、参考になると嬉しいです。
といった感じで今回はここまで…また次回👋