アクターの Tick は基本的にはプレイ(Play In Editor)しないと処理は走りません。
アクターの Tick 処理は ExecuteTick という関数で実行されており、以下のようになっている。
void FActorTickFunction::ExecuteTick(float DeltaTime, enum ELevelTick TickType, ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) { if (Target && !Target->IsPendingKillOrUnreachable()) { if (TickType != LEVELTICK_ViewportsOnly || Target->ShouldTickIfViewportsOnly()) { FScopeCycleCounterUObject ActorScope(Target); Target->TickActor(DeltaTime*Target->CustomTimeDilation, TickType, *this); } } }
.
.
.
アクターの "ShouldTickIfViewportsOnly()" は基本的に false を返します。(シーケンサー関連のアクターは true を返すようになってたりします)
プレイしていない時は、TickType が LEVELTICK_ViewportsOnly なので Tick は実行されません。
Tick を実行させるには "ShouldTickIfViewportsOnly()" を上書きし、true を返すようにしてあげます。
// .h UCLASS() class TEST_4_22_API AEditorTickActor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AEditorTickActor(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; virtual bool ShouldTickIfViewportsOnly() const override; // ←ココ }; // .cpp bool AEditorTickActor::ShouldTickIfViewportsOnly() const { return true; }
Tick で ログを出すようにしました。
// Called every frame void AEditorTickActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); UE_LOG(LogTemp, Log, TEXT("tick")); }
アクター配置時に Tick が走るようになりました。
エディター上での Tick 処理は扱いが難しいですが、プレビュー機能が充実したり利点も多いので活用していきましょう。
UE Version : 4.22.3-7053642