언리얼 5

231026 시네마틱 시퀀서 연출

슬뷔 2023. 10. 26. 10:37

https://docs.unrealengine.com/5.0/ko/cinematics-and-movie-making-in-unreal-engine/

 

시네마틱과 시퀀서

시퀀서는 언리얼 엔진의 멀티 트랙 에디터로, 시네마틱 시퀀스를 실시간으로 제작하고 미리보는 데 사용됩니다.

docs.unrealengine.com

 

연출용 몬스터 배치

캐릭터를 상속 받은 BPC_LSActor 생성해서 아무 메시나 입혀준다.

 


https://m.blog.naver.com/chvj7567/222763211445

 

언리얼(Unreal) - 레벨 시퀀스(Level Sequence)

레벨 시퀀스를 통해 애니메이션을 작동시키는 방법을 알아보겠다. 트리거에 닿으면 문이열리고 트리거를 벗...

blog.naver.com

트리거 박스에 들어오면 레벨 스퀀스 재생되게 만들기

 

Unreal_3th.Build.cs 에 모듈 추가

public class Unreal_3th : ModuleRules
{
	public Unreal_3th(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { 
			  "MovieScene"
			, "LevelSequence"
		});
}

C++ TriggerBox 상속받아서 LevelSequenceTrigger 생성

#include "../Header/global.h"
#include "LevelSequence/Public/LevelSequence.h"
#include "LevelSequence/Public/LevelSequencePlayer.h"
#include "LevelSequence/Public/LevelSequenceActor.h"

#include "CoreMinimal.h"
#include "Engine/TriggerBox.h"
#include "LevelSequenceTrigger.generated.h"

UCLASS()
class UNREAL_3TH_API ALevelSequenceTrigger : public ATriggerBox
{
	GENERATED_BODY()
	
private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	int32			m_PlayCount;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	ULevelSequence* m_LvSeq;


	ULevelSequencePlayer*	m_SequencePlayer;
	ALevelSequenceActor*	m_SequenceActor;

public:
	virtual void BeginPlay() override;

public:
	// OverlapDelegate
	UFUNCTION()
	void BeginTrigger(AActor* _TriggerActor, AActor* _OtherActor);

	UFUNCTION()
	void EndTrigger(AActor* _TriggerActor, AActor* _OtherActor);

public:
	UFUNCTION()
	void EndLevelSequence();

public:
	ALevelSequenceTrigger();
	~ALevelSequenceTrigger();
};
#include "LevelSequenceTrigger.h"

ALevelSequenceTrigger::ALevelSequenceTrigger()
	: m_PlayCount(1)
{
}

ALevelSequenceTrigger::~ALevelSequenceTrigger()
{
}

void ALevelSequenceTrigger::BeginPlay()
{
	Super::BeginPlay();
    
	OnActorBeginOverlap.AddDynamic(this, &ALevelSequenceTrigger::BeginTrigger);
	OnActorEndOverlap.AddDynamic(this, &ALevelSequenceTrigger::EndTrigger);
}

void ALevelSequenceTrigger::BeginTrigger(AActor* _TriggerActor, AActor* _OtherActor)
{
	LOG(LogTemp, Warning, TEXT("LevelSequence Trigger BeginOverlap"));

	if (IsValid(m_LvSeq))
	{
		if (!IsValid(m_SequencePlayer))
		{
			m_SequencePlayer 
				= ULevelSequencePlayer::CreateLevelSequencePlayer(GetWorld()
				, m_LvSeq, FMovieSceneSequencePlaybackSettings{}, m_SequenceActor);

			// 레벨시퀀스 종료시 호출할 Delegate 등록
			m_SequencePlayer->OnFinished.AddDynamic(this, &ALevelSequenceTrigger::EndLevelSequence);
		}

		m_SequencePlayer->Play();
	}		
}

void ALevelSequenceTrigger::EndTrigger(AActor* _TriggerActor, AActor* _OtherActor)
{
	LOG(LogTemp, Warning, TEXT("LevelSequence Trigger EndOverlap"));
}

void ALevelSequenceTrigger::EndLevelSequence()
{
	--m_PlayCount;

	LOG(LogTemp, Warning, TEXT("Trigger EndLevelSequence"));

	if (m_PlayCount <= 0)
	{
		Destroy();
	}
}

레벨에 트리거 박스 배치

EndLevelSequence 가 호출되어 플레이 카운트가 줄어들어 Destroy 되기 때문에, 같은 곳을 다시 가도 Trigger 가 작동하지 않는다.

 

HUD Hide 만들기

UCLASS()
class UNREAL_3TH_API ALevelSequenceTrigger : public ATriggerBox
{
	GENERATED_BODY()
	
private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
	bool			HideHUD;
}

========================================================================================

void ALevelSequenceTrigger::BeginTrigger(AActor* _TriggerActor, AActor* _OtherActor)
{
	LOG(LogTemp, Warning, TEXT("LevelSequence Trigger BeginOverlap"));

	if (IsValid(m_LvSeq))
	{
		// HUD 끄기
		if (HideHUD)
		{
			AUnreal_3thGameModeBase* GameMode = Cast<AUnreal_3thGameModeBase>(UGameplayStatics::GetGameMode(GetWorld()));
			if (IsValid(GameMode))
			{
				GameMode->GetMainHUD()->SetVisibility(ESlateVisibility::Hidden);
			}
		}
	}		
}

void ALevelSequenceTrigger::EndLevelSequence()
{
	// HUD 켜기
	if (HideHUD)
	{
		AUnreal_3thGameModeBase* GameMode = Cast<AUnreal_3thGameModeBase>(UGameplayStatics::GetGameMode(GetWorld()));
		if (IsValid(GameMode))
		{
			GameMode->GetMainHUD()->SetVisibility(ESlateVisibility::Visible);
		}
	}
}

이벤트 활용

언바운드 -> 새 엔드포인트