PART 1 · 강의 2/3

트랙과 섹션

UMovieSceneTrack과 UMovieSceneSection의 구조를 이해하고, 빌트인 트랙 유형과 커스텀 트랙 생성 방법을 학습합니다

01

트랙 (Track) 개념

타임라인의 행(Row)을 구성하는 핵심 단위

트랙(Track)은 시퀀서 타임라인에서 하나의 행을 나타내며, 특정 프로퍼티나 동작을 제어하는 논리적 단위입니다. 모든 트랙은 UMovieSceneTrack을 상속합니다.

트랙의 구조

C++ - UMovieSceneTrack
class UMovieSceneTrack : public UMovieSceneSignedObject { // 이 트랙이 소유한 섹션 목록 virtual const TArray<UMovieSceneSection*>& GetAllSections() const; // 새 섹션 생성 virtual UMovieSceneSection* CreateNewSection(); // 트랙이 지원하는 블렌딩 타입 virtual FMovieSceneTrackRowSegmentBlenderPtr GetRowSegmentBlender() const; // 트랙 표시 이름 virtual FText GetDisplayName() const; };

빌트인 트랙 카테고리

카테고리트랙클래스
트랜스폼 위치, 회전, 스케일 UMovieScene3DTransformTrack
프로퍼티 Float, Bool, Byte, Enum, String UMovieScenePropertyTrack 계열
애니메이션 스켈레탈 메시 애니메이션 UMovieSceneSkeletalAnimationTrack
오디오 사운드 재생 UMovieSceneAudioTrack
카메라 카메라 컷 UMovieSceneCameraCutTrack
페이드 화면 페이드 인/아웃 UMovieSceneFadeTrack
서브시퀀스 다른 시퀀스 포함 UMovieSceneSubTrack
이벤트 BP/C++ 함수 호출 UMovieSceneEventTrack
머티리얼 머티리얼 파라미터 애니메이션 UMovieSceneComponentMaterialTrack
02

섹션 (Section) 구조

시간 범위와 데이터를 담는 컨테이너

섹션(Section)은 트랙 내에서 특정 시간 범위를 가지는 데이터 블록입니다. 하나의 트랙에 여러 섹션을 배치할 수 있으며, 섹션 간 블렌딩도 가능합니다.

C++ - UMovieSceneSection
class UMovieSceneSection : public UMovieSceneSignedObject { // 섹션의 시간 범위 TRange<FFrameNumber> SectionRange; // 블렌딩 타입 (Absolute, Additive, Relative) FOptionalMovieSceneBlendType BlendType; // Easing 설정 FMovieSceneEasingSettings Easing; // 행 인덱스 (같은 트랙 내 멀티 행) int32 RowIndex; // 이 섹션이 소유한 채널들 (키프레임 데이터) virtual void GetAllChannels( TArray<FMovieSceneChannelEntry>& OutEntries) const; };

섹션 블렌딩 타입

타입설명사용 예시
Absolute 값을 직접 설정 (기본값) 위치를 특정 좌표로 이동
Additive 기존 값에 더함 현재 위치에서 오프셋 적용
Relative 시작 값 기준 상대적 변화 초기 위치 대비 이동
Additive From Base 베이스 값에서의 차이를 더함 애니메이션 레이어링
섹션 Easing

섹션에 Ease In/Out을 설정하면 섹션의 시작과 끝에서 부드러운 전환이 적용됩니다. 이는 키프레임 보간과 별개로, 섹션 레벨의 블렌딩에 사용됩니다. 여러 섹션이 겹칠 때 자연스러운 전환을 만드는 데 유용합니다.

03

채널 (Channel) 시스템

키프레임 데이터를 저장하는 최하위 단위

채널(Channel)은 실제 키프레임 데이터를 저장하는 가장 낮은 레벨의 구조입니다. 예를 들어 Transform 트랙의 Location 섹션은 X, Y, Z 각각에 대한 Float 채널 3개를 포함합니다.

채널 타입

C++ - 주요 채널 타입
// Float 채널 - 가장 일반적 struct FMovieSceneFloatChannel : FMovieSceneChannel { TArray<FFrameNumber> Times; // 키프레임 시간 TArray<FMovieSceneFloatValue> Values; // 키프레임 값 ERichCurveInterpMode PreInfinityExtrap; // 시작 전 외삽 ERichCurveInterpMode PostInfinityExtrap; // 종료 후 외삽 }; // 기타 채널 타입 struct FMovieSceneBoolChannel; // Bool 값 struct FMovieSceneIntegerChannel; // 정수 값 struct FMovieSceneByteChannel; // Byte/Enum 값 struct FMovieSceneStringChannel; // 문자열 값 struct FMovieSceneObjectPathChannel; // 오브젝트 참조

트랙 - 섹션 - 채널 관계

Track
UMovieScene3DTransformTrack
Section
UMovieScene3DTransformSection
Channels
Location X,Y,Z / Rotation X,Y,Z / Scale X,Y,Z
채널 접근 패턴

C++에서 특정 채널의 키프레임에 접근하려면 Section->GetAllChannels()로 채널 목록을 얻은 후, FMovieSceneFloatChannel로 캐스팅하여 TimesValues 배열에 직접 접근할 수 있습니다.

04

커스텀 트랙 생성

나만의 시퀀서 트랙을 만드는 방법

프로젝트에 특화된 기능이 필요할 때 커스텀 트랙을 생성할 수 있습니다. 4개의 클래스를 구현해야 합니다.

필요한 클래스

클래스모듈역할
UMovieSceneMyTrack Runtime 트랙 데이터 정의
UMovieSceneMySection Runtime 섹션 데이터 정의
FMyTrackEditor Editor 에디터 UI 통합
FMySequencerSection Editor 섹션 UI 렌더링
C++ - 커스텀 트랙 예시 (Runtime)
// MyCustomTrack.h UCLASS() class UMovieSceneMyCustomTrack : public UMovieSceneTrack { GENERATED_BODY() public: virtual UMovieSceneSection* CreateNewSection() override { return NewObject<UMovieSceneMyCustomSection>(this); } virtual bool SupportsType(TSubclassOf<UMovieSceneSection> Type) const override { return Type == UMovieSceneMyCustomSection::StaticClass(); } };
C++ - 커스텀 TrackEditor 등록 (Editor)
// 에디터 모듈의 StartupModule에서 등록 void FMyEditorModule::StartupModule() { ISequencerModule& SequencerModule = FModuleManager::LoadModuleChecked<ISequencerModule>("Sequencer"); TrackEditorHandle = SequencerModule.RegisterTrackEditor( FOnCreateTrackEditor::CreateStatic( &FMyCustomTrackEditor::CreateTrackEditor)); }
모듈 분리 필수

TrackEditor와 SequencerSection은 반드시 에디터 전용 모듈에 배치해야 합니다. 런타임 모듈에서 Sequencer 모듈을 참조하면 패키징 시 빌드 오류가 발생합니다.

SUMMARY

핵심 요약

  • 트랙(Track)은 타임라인의 행으로, 특정 프로퍼티나 동작을 제어하는 논리적 단위이다
  • 섹션(Section)은 트랙 내에서 시간 범위를 가지는 데이터 블록이며, Absolute/Additive/Relative 블렌딩을 지원한다
  • 채널(Channel)은 실제 키프레임 데이터(시간 + 값 배열)를 저장하는 최하위 구조이다
  • Transform 트랙 하나에 9개의 Float 채널(Location XYZ, Rotation XYZ, Scale XYZ)이 포함된다
  • 커스텀 트랙 생성에는 Track, Section(런타임) + TrackEditor, SequencerSection(에디터) 4개 클래스가 필요하다
  • 런타임/에디터 모듈 분리를 반드시 지켜야 패키징 오류를 방지할 수 있다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 다양한 트랙 타입 실습

하나의 시퀀스에 Transform, Float, Bool, Event, Visibility Track을 각각 추가하세요. 각 트랙에 키프레임을 설정하고, 트랙 타입별 에디터 UI와 동작 차이를 이해하세요.

실습 2: 섹션 편집과 블렌딩

하나의 트랙에 여러 섹션을 배치하고 Ease In/Out 블렌딩을 설정하세요. When Finished 옵션(Restore State, Keep State)의 차이를 확인하세요.

심화 과제: 커스텀 트랙 타입 제작

C++에서 UMovieSceneTrack을 상속받아 게임 고유 데이터(날씨 강도, 시간대, 긴장감 수치)를 키프레임으로 애니메이션할 수 있는 커스텀 트랙을 만드세요.