트랙과 섹션
UMovieSceneTrack과 UMovieSceneSection의 구조를 이해하고, 빌트인 트랙 유형과 커스텀 트랙 생성 방법을 학습합니다
트랙 (Track) 개념
타임라인의 행(Row)을 구성하는 핵심 단위
트랙(Track)은 시퀀서 타임라인에서 하나의 행을 나타내며, 특정 프로퍼티나 동작을 제어하는 논리적 단위입니다. 모든 트랙은 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 |
섹션 (Section) 구조
시간 범위와 데이터를 담는 컨테이너
섹션(Section)은 트랙 내에서 특정 시간 범위를 가지는 데이터 블록입니다. 하나의 트랙에 여러 섹션을 배치할 수 있으며, 섹션 간 블렌딩도 가능합니다.
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 | 베이스 값에서의 차이를 더함 | 애니메이션 레이어링 |
섹션에 Ease In/Out을 설정하면 섹션의 시작과 끝에서 부드러운 전환이 적용됩니다. 이는 키프레임 보간과 별개로, 섹션 레벨의 블렌딩에 사용됩니다. 여러 섹션이 겹칠 때 자연스러운 전환을 만드는 데 유용합니다.
채널 (Channel) 시스템
키프레임 데이터를 저장하는 최하위 단위
채널(Channel)은 실제 키프레임 데이터를 저장하는 가장 낮은 레벨의 구조입니다. 예를 들어 Transform 트랙의 Location 섹션은 X, Y, Z 각각에 대한 Float 채널 3개를 포함합니다.
채널 타입
// 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; // 오브젝트 참조
트랙 - 섹션 - 채널 관계
UMovieScene3DTransformTrack
UMovieScene3DTransformSection
Location X,Y,Z / Rotation X,Y,Z / Scale X,Y,Z
C++에서 특정 채널의 키프레임에 접근하려면 Section->GetAllChannels()로 채널 목록을 얻은 후,
FMovieSceneFloatChannel로 캐스팅하여 Times와 Values 배열에 직접 접근할 수 있습니다.
커스텀 트랙 생성
나만의 시퀀서 트랙을 만드는 방법
프로젝트에 특화된 기능이 필요할 때 커스텀 트랙을 생성할 수 있습니다. 4개의 클래스를 구현해야 합니다.
필요한 클래스
| 클래스 | 모듈 | 역할 |
|---|---|---|
| UMovieSceneMyTrack | Runtime | 트랙 데이터 정의 |
| UMovieSceneMySection | Runtime | 섹션 데이터 정의 |
| FMyTrackEditor | Editor | 에디터 UI 통합 |
| FMySequencerSection | Editor | 섹션 UI 렌더링 |
// 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();
}
};
// 에디터 모듈의 StartupModule에서 등록
void FMyEditorModule::StartupModule()
{
ISequencerModule& SequencerModule =
FModuleManager::LoadModuleChecked<ISequencerModule>("Sequencer");
TrackEditorHandle = SequencerModule.RegisterTrackEditor(
FOnCreateTrackEditor::CreateStatic(
&FMyCustomTrackEditor::CreateTrackEditor));
}
TrackEditor와 SequencerSection은 반드시 에디터 전용 모듈에 배치해야 합니다.
런타임 모듈에서 Sequencer 모듈을 참조하면 패키징 시 빌드 오류가 발생합니다.
핵심 요약
- 트랙(Track)은 타임라인의 행으로, 특정 프로퍼티나 동작을 제어하는 논리적 단위이다
- 섹션(Section)은 트랙 내에서 시간 범위를 가지는 데이터 블록이며, Absolute/Additive/Relative 블렌딩을 지원한다
- 채널(Channel)은 실제 키프레임 데이터(시간 + 값 배열)를 저장하는 최하위 구조이다
- Transform 트랙 하나에 9개의 Float 채널(Location XYZ, Rotation XYZ, Scale XYZ)이 포함된다
- 커스텀 트랙 생성에는 Track, Section(런타임) + TrackEditor, SequencerSection(에디터) 4개 클래스가 필요하다
- 런타임/에디터 모듈 분리를 반드시 지켜야 패키징 오류를 방지할 수 있다
도전 과제
배운 내용을 직접 실습해보세요
하나의 시퀀스에 Transform, Float, Bool, Event, Visibility Track을 각각 추가하세요. 각 트랙에 키프레임을 설정하고, 트랙 타입별 에디터 UI와 동작 차이를 이해하세요.
하나의 트랙에 여러 섹션을 배치하고 Ease In/Out 블렌딩을 설정하세요. When Finished 옵션(Restore State, Keep State)의 차이를 확인하세요.
C++에서 UMovieSceneTrack을 상속받아 게임 고유 데이터(날씨 강도, 시간대, 긴장감 수치)를 키프레임으로 애니메이션할 수 있는 커스텀 트랙을 만드세요.