Level Sequence Actor
ALevelSequenceActor를 사용한 런타임 시퀀스 재생, 트리거 연동, 바인딩 관리를 학습합니다
ALevelSequenceActor 기초
월드에 시퀀스를 배치하는 방법
ALevelSequenceActor는 레벨에 배치되어
ULevelSequence 에셋을 참조하고 런타임 재생을 관리하는 액터입니다.
내부에 ULevelSequencePlayer를 생성하여 실제 재생을 수행합니다.
주요 프로퍼티
| 프로퍼티 | 타입 | 설명 |
|---|---|---|
| LevelSequenceAsset | ULevelSequence* | 재생할 시퀀스 에셋 |
| PlaybackSettings | FMovieSceneSequencePlaybackSettings | 자동 재생, 루프, 속도 등 |
| bAutoPlay | bool | 레벨 시작 시 자동 재생 |
| bOverrideInstanceData | bool | 인스턴스 데이터 오버라이드 |
| BindingOverrides | FLevelSequenceBindingReferences | 바인딩 오버라이드 맵 |
레벨 배치 방법
- Content Browser에서 Level Sequence 에셋을 레벨 뷰포트로 드래그
- 자동으로 ALevelSequenceActor가 생성됨
- 디테일 패널에서 PlaybackSettings 구성
- bAutoPlay를 체크하면 게임 시작 시 자동 재생
트리거 기반 재생
게임플레이 이벤트로 시퀀스 시작하기
Blueprint에서 트리거
// Trigger Volume의 OnActorBeginOverlap 이벤트
//
// [On Actor Begin Overlap]
// → [Cast to PlayerCharacter]
// → [Get Level Sequence Actor] (레벨에 배치된 참조)
// → [Get Sequence Player]
// → [Play]
//
// Sequence Player 주요 함수:
// - Play(): 정방향 재생
// - PlayReverse(): 역방향 재생
// - Pause(): 일시정지
// - Stop(): 정지 (처음으로)
// - GoToFrame(): 특정 프레임으로 이동
// - SetPlayRate(): 재생 속도 변경
C++에서 트리거
// 헤더에 LevelSequenceActor 참조
UPROPERTY(EditAnywhere)
ALevelSequenceActor* CutsceneActor;
// 트리거 시 재생
void AMyTrigger::OnOverlap(AActor* OtherActor)
{
if (CutsceneActor)
{
ULevelSequencePlayer* Player =
CutsceneActor->GetSequencePlayer();
if (Player)
{
Player->Play();
}
}
}
Player->OnFinished 델리게이트에 바인딩하면 시퀀스 재생 완료 시 콜백을 받을 수 있습니다. 컷씬 후 게임플레이로 복귀하거나 다음 시퀀스를 트리거하는 데 필수적입니다.
런타임 바인딩
동적으로 오브젝트 바인딩 변경하기
런타임에서 시퀀스의 Object Binding을 다른 액터로 오버라이드할 수 있습니다. 예를 들어, 동일한 컷씬을 서로 다른 캐릭터로 재생할 수 있습니다.
// 시퀀스 에셋에서 바인딩 ID 가져오기
ULevelSequence* Sequence = CutsceneActor->GetSequence();
UMovieScene* MovieScene = Sequence->GetMovieScene();
// 모든 바인딩 순회
for (const FMovieSceneBinding& Binding :
MovieScene->GetBindings())
{
if (Binding.GetName() == "MainCharacter")
{
// 바인딩 오버라이드
FMovieSceneObjectBindingID BindingID(
Binding.GetObjectGuid(),
EMovieSceneObjectBindingSpace::Local);
CutsceneActor->SetBinding(
BindingID,
{ MyPlayerCharacter } // 새로운 바인딩 대상
);
}
}
// 바인딩 리셋
CutsceneActor->ResetBindings();
바인딩 오버라이드는 Play() 호출 전에 설정해야 합니다. 재생 중 바인딩을 변경하면 예기치 않은 동작이 발생할 수 있습니다. 재생 중 바인딩을 변경해야 한다면 먼저 Stop()한 후 변경하고 다시 Play()합니다.
컷씬 매니저 패턴
프로덕션 레벨 시퀀스 관리 시스템
UCLASS()
class UCutsceneManager : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void PlayCutscene(ULevelSequence* Sequence,
AActor* BindTarget = nullptr);
UFUNCTION(BlueprintCallable)
void SkipCutscene();
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnCutsceneFinished);
UPROPERTY(BlueprintAssignable)
FOnCutsceneFinished OnCutsceneFinished;
private:
ALevelSequenceActor* ActiveSequenceActor;
void OnSequenceFinished();
void DisablePlayerInput(bool bDisable);
};
void UCutsceneManager::PlayCutscene(ULevelSequence* Sequence,
AActor* BindTarget)
{
// 기존 컷씬 정리
if (ActiveSequenceActor) SkipCutscene();
// 동적으로 LevelSequenceActor 생성
FMovieSceneSequencePlaybackSettings Settings;
Settings.bHidePlayer = true;
Settings.bHideHud = true;
ALevelSequenceActor* SeqActor;
ULevelSequencePlayer* Player =
ULevelSequencePlayer::CreateLevelSequencePlayer(
GetWorld(), Sequence, Settings, SeqActor);
ActiveSequenceActor = SeqActor;
// 완료 콜백
Player->OnFinished.AddDynamic(
this, &UCutsceneManager::OnSequenceFinished);
DisablePlayerInput(true);
Player->Play();
}
컷씬 스킵은 Player->GoToEndAndStop()으로 구현합니다. bRestoreState가 false인 경우 시퀀스의 최종 상태가 적용되므로, 스킵해도 게임 상태가 올바르게 설정됩니다.
핵심 요약
- ALevelSequenceActor는 레벨에 배치되어 ULevelSequence를 참조하고 런타임 재생을 관리한다
- ULevelSequencePlayer로 Play, Pause, Stop, SetPlayRate 등 재생을 프로그래밍으로 제어한다
- 트리거 기반 재생은 Overlap, 입력 이벤트 등에서
GetSequencePlayer()->Play()로 시작한다 - 런타임 바인딩 오버라이드로 동일 시퀀스를 다른 액터에 적용할 수 있다 (Play() 전에 설정)
- CreateLevelSequencePlayer로 동적 시퀀스 액터를 생성할 수 있다
- OnFinished 델리게이트로 시퀀스 완료 콜백을 받아 게임플레이 복귀를 처리한다
도전 과제
배운 내용을 직접 실습해보세요
Level Sequence Actor를 배치하고 Auto Play, Loop 설정을 조정하세요. 트리거 볼륨 진입 시 시퀀스가 재생되고, OnFinished 이벤트를 받는 블루프린트를 만드세요.
하나의 시퀀스를 3개의 다른 Actor에 바인딩 오버라이드하여 재사용하세요. NPC 등장 시퀀스를 만들고, 3명의 다른 NPC가 동일한 연출로 등장하도록 구현하세요.
여러 시퀀스를 순차적/병렬적으로 재생하는 Sequence Chain 시스템을 C++로 구현하세요. 이전 시퀀스 결과에 따른 조건부 분기와 병렬 재생을 모두 지원하세요.