【UE4】PIE外のエディター上でアクターのTickを走らせる

アクターの 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"));
}

f:id:shuntaendo:20190529190753g:plain

アクター配置時に Tick が走るようになりました。

エディター上での Tick 処理は扱いが難しいですが、プレビュー機能が充実したり利点も多いので活用していきましょう。

UE Version : 4.22.3-7053642