본문으로 건너뛰기

시퀀스 시스템

await/Coroutine 지옥 없이 게임 연출 흐름을 선언적 스텝 목록으로 구성합니다.

구조

SequenceAsset (ScriptableObject)
[SerializeReference] List<SequenceStep>

SequenceRunner (MonoBehaviour)
— 스텝을 순서대로 코루틴 실행

SequenceStep (abstract, [Serializable])
— 커스텀 스텝을 상속해서 구현

기본 제공 스텝

스텝설명
WaitStepN초 대기
MoveStepTransform을 목적지로 이동 (이징 지원)
FadeStepCanvasGroup 알파 애니메이션
ScaleStepTransform 스케일 애니메이션
SoundStepAudioClip 재생
CallbackStepUnityEvent 호출

빠른 시작

방법 A — SequenceAsset (에디터 설정)

Create → AchUtils/Sequence/Sequence Asset

인스펙터에서 스텝 추가 후 실행:

using AchUtils.Sequence;

[SerializeField] SequenceAsset introSequence;
[SerializeField] SequenceRunner runner;

void PlayIntro()
{
runner.Run(introSequence);
}

방법 B — 코드로 구성

var steps = new List<SequenceStep>
{
new FadeStep { Target = overlay, TargetAlpha = 1f, Duration = 0.3f },
new WaitStep { Duration = 0.5f },
new MoveStep { Target = boss, Destination = centerPos, Duration = 1f },
new ScaleStep { Target = boss, TargetScale = Vector3.one * 1.5f, Duration = 0.3f },
new SoundStep { Clip = bossRoar },
new FadeStep { Target = overlay, TargetAlpha = 0f, Duration = 0.5f },
};

runner.Run(steps);

API

SequenceRunner

// 실행
void Run(SequenceAsset asset)
void Run(IEnumerable<SequenceStep> steps)
void Stop()

bool IsRunning

event Action OnCompleted
event Action OnStopped

MoveStep

Transform Target
Vector3 Destination
float Duration // 초
AnimationCurve Ease // 기본: EaseInOut
bool UseLocalSpace // true면 localPosition 사용

FadeStep

CanvasGroup Target
float TargetAlpha // 0~1
float Duration
AnimationCurve Ease

ScaleStep

Transform Target
Vector3 TargetScale
float Duration
AnimationCurve Ease

SoundStep

AudioClip Clip
float Volume // 0~1
bool WaitUntilFinished // true면 클립 재생 완료 대기

SoundStepCamera.main에 의존하지 않고 SequenceRunner 위치에서 클립을 재생합니다.

CallbackStep

UnityEvent OnExecute // 인스펙터에서 연결

커스텀 스텝 만들기

[Serializable]
public class ShowPanelStep : SequenceStep
{
public GameObject Panel;
public float HoldDuration = 2f;

public override IEnumerator Execute(SequenceRunner runner)
{
Panel.SetActive(true);
yield return new WaitForSeconds(HoldDuration);
Panel.SetActive(false);
}
}

[Serializable]만 붙이면 [SerializeReference] 필드에서 인스펙터 선택이 가능합니다.

완료 이벤트

runner.OnCompleted += () =>
{
Debug.Log("인트로 연출 완료");
StartGameplay();
};

runner.Run(introSequence);

연출 예시 — 보스 등장

FadeStep 오버레이 Fade In (0.3s)
WaitStep 0.5s 대기
MoveCameraAction 보스 방향 이동 ← CameraDirector와 병행 가능
MoveStep 보스 등장 이동 (1.5s, EaseOut)
ScaleStep 보스 스케일 업 (0.5s, Bounce)
SoundStep 보스 포효
FadeStep 오버레이 Fade Out (0.5s)
CallbackStep UI 표시 이벤트