Editor時でのLevel Sequence(アニメーション)の終了時のコールバッグ関数の実装について

Blueprintからインスタンス化をして、LevelSequenceをSetLevelSequence関数の中で再生まで行い、アニメーションが終了したときに、CallBackFinishedを呼び出したいです。

その呼び出しtが行われません。

再生は正しく行われ、Tickの中のログも再生中はPlaying, 終了時はStoppedと表示されます。

また、AddDynamicを実行後にBreakPointを貼ってみても、m_LevelSequencePlayer->OnFinished->InvocationList[0]->FunctionNameはCallBackFinishedとなっていたことから、AddDynamicの登録自体は正しく行われていると推測しました。

EUW開発のため、Playモードでは実行せずEditorを拡張する形でアニメーションの終了を検知したいです。

また、BluePrintではBindOnFinishedにカスタムイベントを追加する形で実装できました。

IsPlaying自体は正しく取得できているため、回避策としてTickを使って終了を検知すること自体は可能ですが、下記のコードのように終了をCallbackで呼び出すことはできますでしょうか?

`TestClass.hのソースコード

#pragma once

include “CoreMinimal.h”
include “GameFramework/Actor.h”

include “TestClassSuper.h”
include “LevelSequence.h”
include “LevelSequencePlayer.h”
include “MovieSceneSequencePlayer.h”

include “TestClass.generated.h”

/**
*
*/
UCLASS()
class TEST_ANIMATION_API ATestClass: public ATestClassSuper
{
GENERATED_BODY()
public:
ATestClass: ();

virtual void Destroyed() override;

// ActorTickがEditorをEditorで動かす
virtual bool ShouldTickIfViewportsOnly() const override { return true; };

UFUNCTION(BlueprintCallable)
void SetLevelSequence(ULevelSequence* LevelSequence);

// Called every frame
virtual void Tick(float DeltaTime) override;

UFUNCTION(BlueprintCallable)
void CallBackFinished();

protected:
TWeakObjectPtr m_LevelSequencePlayer = nullptr;
};`//TestClass.cppのソースコード

`#include “TestClass.h”
include “Kismet/KismetSystemLibrary.h”

ATestClass::ATestClass: ()

{
}

void ATestClass: ::Destroyed()

{
}

void ATestClass: ::Tick(float DeltaTime)

{
Super::Tick(DeltaTime);

if (m_LevelSequencePlayer.IsValid())
{
UE_LOG(LogTemp, Log, TEXT(“Seq, %s.”), m_LevelSequencePlayer.Get()->IsPlaying() ? TEXT(“Playing”) : TEXT(“Stopped”));
}
}

void ATestClass: ::CallBackFinished()
{
// ここに入らない
UE_LOG(LogTemp, Log, TEXT(“Finished animation”));
}

void ATestClass: ::SetLevelSequence(ULevelSequence* LevelSequence)

{
ALevelSequenceActor* OutActor;
FMovieSceneSequencePlaybackSettings Settings;

// アニメーションPlayerを作成
m_LevelSequencePlayer = ULevelSequencePlayer::CreateLevelSequencePlayer(this->GetWorld(), LevelSequence, Settings, OutActor);

// アニメーション終了時のイベントをバインド
m_LevelSequencePlayer.Get()->OnFinished.AddDynamic(this, &ATestClass: ::CallBackFinished); // デバッガによると、登録はされてそう

// アニメーションを再生
m_LevelSequencePlayer.Get()->Play();
//OutActor->Destroy();

}`

再現手順
特になし

お世話になっております。

お問い合わせありがとうございます。

エディタ状態では、コールバックされる関数にCallInEditorというメタ情報を追加しておかなければ、最後の段階でAActor::ProcessEvent()内のbAllowScriptExecutionチェックで蹴られてしまいます。

頂戴したテストコードのヘッダ部を、

// UFUNCTION内にCallInEditorを追加 UFUNCTION(BlueprintCallable, CallInEditor) void CallBackFinished();のように改修すれば動作するはずですので、一度お試しください。念のため、当方で動作確認をとったプロジェクトを本返信に添付いたします。

以上、よろしくお願いいたします。

ご回答いただき、ありがとうございます!

こちらでも期待値通りの挙動することを確認できました。

そのためこちらに関してはクローズにさせて頂ければと思います

ご確認ありがとうございました。

それでは本件は解決済みとしてCloseさせていただきます。

以上よろしくお願いいたします。