Files
UnrealEngine/Engine/Source/Runtime/UMG/Private/Animation/UMGSequencePlayer.cpp
2025-05-18 13:04:45 +08:00

266 lines
6.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Animation/UMGSequencePlayer.h"
#include "Animation/UMGSequenceTickManager.h"
#include "Animation/WidgetAnimation.h"
#include "Animation/WidgetAnimationState.h"
#include "EntitySystem/MovieSceneEntitySystemLinker.h"
#include "EntitySystem/MovieSceneEntitySystemRunner.h"
#include "IMovieScenePlaybackClient.h"
#include "MovieSceneFwd.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(UMGSequencePlayer)
UUMGSequencePlayer::UUMGSequencePlayer(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
void UUMGSequencePlayer::InitSequencePlayer(FWidgetAnimationState& InState)
{
WidgetAnimationHandle = InState.GetAnimationHandle();
RootTemplateInstance.Initialize(InState.GetSharedPlaybackState().ToSharedRef());
}
void UUMGSequencePlayer::InitSequencePlayer(UWidgetAnimation& InAnimation, UUserWidget& InUserWidget)
{
// Nothing, stubbed out.
ensureMsgf(false, TEXT("UUMGSequencePlayer shouldn't be doing anything except wrap a widget animation runner."));
}
void UUMGSequencePlayer::Tick(float DeltaTime)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->Tick(DeltaTime);
}
}
void UUMGSequencePlayer::Play(float StartAtTime, int32 InNumLoopsToPlay, EUMGSequencePlayMode::Type InPlayMode, float InPlaybackSpeed, bool bInRestoreState)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
FWidgetAnimationStatePlayParams PlayParams;
PlayParams.StartAtTime = StartAtTime;
PlayParams.NumLoopsToPlay = InNumLoopsToPlay;
PlayParams.PlayMode = InPlayMode;
PlayParams.PlaybackSpeed = InPlaybackSpeed;
PlayParams.bRestoreState = bInRestoreState;
AnimState->Play(PlayParams);
}
}
void UUMGSequencePlayer::PlayTo(float StartAtTime, float EndAtTime, int32 InNumLoopsToPlay, EUMGSequencePlayMode::Type InPlayMode, float InPlaybackSpeed, bool bInRestoreState)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
FWidgetAnimationStatePlayParams PlayParams;
PlayParams.StartAtTime = StartAtTime;
PlayParams.EndOffset = EndAtTime;
PlayParams.NumLoopsToPlay = InNumLoopsToPlay;
PlayParams.PlayMode = InPlayMode;
PlayParams.PlaybackSpeed = InPlaybackSpeed;
PlayParams.bRestoreState = bInRestoreState;
AnimState->Play(PlayParams);
}
}
void UUMGSequencePlayer::Pause()
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->Pause();
}
}
void UUMGSequencePlayer::Reverse()
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->Reverse();
}
}
void UUMGSequencePlayer::Stop()
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->Stop();
}
}
void UUMGSequencePlayer::SetCurrentTime(float InTime)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->SetCurrentTime(InTime);
}
}
FQualifiedFrameTime UUMGSequencePlayer::GetCurrentTime() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->GetCurrentTime();
}
return FQualifiedFrameTime();
}
const UWidgetAnimation* UUMGSequencePlayer::GetAnimation() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->GetAnimation();
}
return nullptr;
}
FName UUMGSequencePlayer::GetUserTag() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->GetUserTag();
}
return NAME_None;
}
void UUMGSequencePlayer::SetUserTag(FName InUserTag)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->SetUserTag(InUserTag);
}
}
void UUMGSequencePlayer::SetNumLoopsToPlay(int32 InNumLoopsToPlay)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->SetNumLoopsToPlay(InNumLoopsToPlay);
}
}
void UUMGSequencePlayer::SetPlaybackSpeed(float InPlaybackSpeed)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->SetPlaybackSpeed(InPlaybackSpeed);
}
}
bool UUMGSequencePlayer::IsPlayingForward() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->IsPlayingForward();
}
return true;
}
bool UUMGSequencePlayer::IsStopping() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->IsStopping();
}
return false;
}
FMovieSceneRootEvaluationTemplateInstance& UUMGSequencePlayer::GetEvaluationTemplate()
{
return RootTemplateInstance;
}
UMovieSceneEntitySystemLinker* UUMGSequencePlayer::ConstructEntitySystemLinker()
{
ensureMsgf(false, TEXT("This legacy player should never have to construct a linker."));
return nullptr;
}
UObject* UUMGSequencePlayer::AsUObject()
{
return this;
}
EMovieScenePlayerStatus::Type UUMGSequencePlayer::GetPlaybackStatus() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->GetPlaybackStatus();
}
return EMovieScenePlayerStatus::Stopped;
}
void UUMGSequencePlayer::SetPlaybackStatus(EMovieScenePlayerStatus::Type InPlaybackStatus)
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
AnimState->SetPlaybackStatus(InPlaybackStatus);
}
}
IMovieScenePlaybackClient* UUMGSequencePlayer::GetPlaybackClient()
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->GetSharedPlaybackState()->FindCapability<IMovieScenePlaybackClient>();
}
return nullptr;
}
FMovieSceneSpawnRegister& UUMGSequencePlayer::GetSpawnRegister()
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
if (FMovieSceneSpawnRegister* SpawnRegister = AnimState->GetSharedPlaybackState()->FindCapability<FMovieSceneSpawnRegister>())
{
return *SpawnRegister;
}
}
return IMovieScenePlayer::GetSpawnRegister();
}
UObject* UUMGSequencePlayer::GetPlaybackContext() const
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->GetUserWidget();
}
return nullptr;
}
void UUMGSequencePlayer::InitializeRootInstance(TSharedRef<UE::MovieScene::FSharedPlaybackState> NewSharedPlaybackState)
{
ensureMsgf(false, TEXT("The legacy player should never initialize sequences: it only wraps already initialized ones."));
}
void UUMGSequencePlayer::RemoveEvaluationData()
{
if (FWidgetAnimationState* AnimState = WidgetAnimationHandle.GetAnimationState())
{
return AnimState->RemoveEvaluationData();
}
}
void UUMGSequencePlayer::TearDown()
{
}
void UUMGSequencePlayer::BeginDestroy()
{
Super::BeginDestroy();
}
UUMGSequencePlayer::FOnSequenceFinishedPlaying& UUMGSequencePlayer::OnSequenceFinishedPlaying()
{
return OnSequenceFinishedPlayingEvent;
}
void UUMGSequencePlayer::BroadcastSequenceFinishedPlaying()
{
OnSequenceFinishedPlayingEvent.Broadcast(*this);
}