Quick Reference
Timeline 1.8.12와 Unity 6.5 기준입니다. Timeline Asset은 Track·Clip·Marker라는 시간 설계를 저장하고, 씬의 PlayableDirector는 그 Asset을 어떤 오브젝트에 바인딩해 언제 재생할지 정합니다. 같은 Asset도 Director와 binding이 달라지면 다른 씬에서 재사용할 수 있습니다.
Timeline Asset
Animation / Audio / Activation / Signal Track과 Clip의 시간
↓
PlayableDirector (씬)
Playable, Update Method, Wrap Mode, Generic Bindings
↓
특정 Animator, AudioSource, GameObject, Cinemachine Brain/Camera| 확인할 질문 | 볼 대상 | 빠른 판단 |
|---|---|---|
| 무엇을 언제 재생하는가 | Timeline Asset의 Track·Clip·Marker | Asset에 둠 |
| 어느 씬 오브젝트를 움직이는가 | Director Bindings | Director마다 지정 |
| pause에서도 계속 진행할 것인가 | Director Update Method | Game Time / Unscaled / DSP / Manual 선택 |
| 끝 프레임을 남길 것인가 | Director Wrap Mode | Hold / Loop / None의 상태 복귀 차이 확인 |
Playable Director Inspector
| 항목 | 기본 의미 | 언제 바꾸는가 | 잘못 선택하면 |
|---|---|---|---|
Playable | 이 Director가 인스턴스로 만들 Timeline Asset | 씬에서 재생할 시퀀스를 정할 때 | Asset이 없으면 Track·binding·재생 대상이 없음 |
Play On Awake | 씬 시작 시 자동 재생 | 오프닝처럼 시작 즉시 필요한 연출 | 로드 직후 원치 않는 컷신·오디오가 재생 |
Initial Time | 재생 시작 시간(초) | 체크포인트·resume처럼 중간에서 시작 | Clip의 선행 상태를 기대했는데 시작 지점만 평가되어 어긋남 |
Update Method: Game Time | Time.timeScale 영향을 받는 게임 시간 | 일반 gameplay 연출 | pause에서 멈춰야 하는데 unscaled가 필요했던 경우 |
Update Method: Unscaled Game Time | timeScale과 무관한 시간 | pause 메뉴·UI 위 연출 | 게임 정지 중 컷신이 계속 진행 |
Update Method: DSP | 오디오 DSP clock 기반 | sample-accurate audio scheduling이 필요한 시퀀스 | 일반 게임 시간을 기대한 로직과 시간 축이 달라짐 |
Update Method: Manual | 자동 clock 없이 코드가 평가 | replay, deterministic simulation, 외부 clock | Evaluate()를 호출하지 않아 화면이 정지 |
Wrap Mode: Hold | 끝 프레임 상태를 유지 | 컷신 끝 자세·Camera를 다음 상태가 넘겨받을 때 | 다음 시스템이 값을 덮기 전까지 연출 값이 남음 |
Wrap Mode: Loop | 끝나면 반복 | 반복 배경·루프 연출 | Signal·Activation이 반복되어 게임 상태를 중복 변경 |
Wrap Mode: None | 끝난 뒤 Timeline이 바꾼 값을 재생 전 값으로 되돌림 | 일시적 preview·효과 | 끝 프레임이 남아야 할 줄 알았는데 원상복귀 |
Bindings | Track과 씬 객체의 연결 | Asset을 여러 씬에서 재사용 | 누락된 Track은 조용히 기대한 대상에 적용되지 않음 |
Initial Time은 "N초 기다린 뒤 시작" 옵션이 아니라 재생을 시작할 타임라인 위치입니다. 중간부터 재생할 때 필요한 활성화·게임 상태를 Track 이전 구간이 자동으로 모두 재현한다고 가정하지 않습니다.
Binding과 재생 제어
Asset은 씬 객체를 직접 소유하지 않고, Director가 Generic Binding으로 Track의 대상 객체를 제공합니다. Animation Track에는 보통 Animator, Audio Track에는 AudioSource, Activation Track에는 GameObject처럼 Track이 요구하는 타입을 연결합니다. Prefab과 additive scene에서 binding 대상이 나중에 생성된다면 Director가 재생되기 전에 할당하는 순서를 보장해야 합니다.
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public sealed class CutscenePlayer : MonoBehaviour
{
[SerializeField] private PlayableDirector director;
[SerializeField] private TimelineAsset timeline;
[SerializeField] private AnimationTrack actorTrack;
public void PlayFor(Animator target)
{
director.playableAsset = timeline;
director.SetGenericBinding(actorTrack, target);
director.time = 0d;
director.Play();
}
public void PauseAtCurrentFrame()
{
director.Pause();
director.Evaluate();
}
}Play()은 자동 clock을 쓰는 Director의 재생을 시작하고, Pause()는 현재 시간을 유지한 채 진행만 멈춥니다. Stop() 이후의 최종 상태는 Wrap Mode와 Track 종류에 따라 다를 수 있으므로, "Stop하면 언제나 원래 상태"라고 가정하지 않습니다. time만 바꾼 다음 즉시 장면 상태를 반영해야 하면 Evaluate()를 호출합니다. Manual update에서는 원하는 시간값을 정하고 Evaluate()로 반영하는 것이 재생 루프입니다.
시간과 상태의 경계
Timeline은 시간 배치와 표현을 잘 다루지만, 저장되는 퀘스트 단계, 보상 지급, 네트워크 권한처럼 한 번만 보장되어야 하는 영속 게임 상태의 소유자가 되면 재생·seek·loop에서 결과가 중복되기 쉽습니다. 그런 상태 변화는 Signal 또는 코드 호출을 경계로 넘기고, 수신한 게임 로직이 "이미 완료됐는가"를 확인하도록 만듭니다.
Director를 중첩하거나 Control Track으로 다른 Director를 구동할 때도 부모·자식 중 누가 시작·중지·binding 해제를 소유하는지 정합니다. 씬 unload 뒤에도 Director가 파괴된 binding을 참조하면 다음 재생에서 Missing Reference나 비어 있는 연출로 나타납니다.
자주 틀리는 부분
| 증상 | 원인 | 수정 |
|---|---|---|
| 같은 Asset인데 씬마다 다르게 실패 | Director Bindings가 누락되었거나 잘못된 타입 | 재생 전 binding 대상과 Track 요구 타입을 검사 |
| pause 중 컷신이 계속 진행 | Unscaled Game Time 또는 DSP clock 사용 | gameplay pause 정책에 맞는 Update Method 선택 |
| 끝난 후 캐릭터·Camera가 돌아감 | Wrap Mode: None | 끝 상태를 이어받을 것이면 Hold 또는 후속 시스템의 명시적 상태 설정 |
| 중간 시작에서 오브젝트 상태가 이상함 | Initial Time 이전의 Signal/Activation을 이미 실행했다고 가정 | 시작 지점의 필수 상태를 코드로 준비하고 Evaluate()로 확인 |
director.time을 바꿨는데 화면이 안 바뀜 | 다음 자동 update를 기다리거나 Manual 모드 | 즉시 확인은 Evaluate(), Manual은 평가 루프 구현 |
참고 링크
3 sources