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();
}`