레벨 시퀀스와 나이아가라 통합
Sequencer 트랙에 나이아가라 시스템을 배치하고 활성 구간·사용자 변수·이벤트 키를 애니메이션과 동기화합니다.
컷신에서 폭발이 캐릭터의 움직임과 정확히 같은 프레임에 터지고, 정해진 속도로 사그라들어야 한다면, 블루프린트의 이벤트보다 시간축 위에서 효과를 다루는 편이 편합니다. 언리얼 엔진의 시퀀서(Sequencer)에서는 시스템의 재생 구간과 사용자 파라미터의 키, 이벤트를 같은 시간축에 놓아 컷신을 제어할 수 있습니다. 다만 시퀀서의 시간과 시뮬레이션의 시간, 그리고 단순히 켜져 있는지는 서로 다른 개념이어서, 이를 구분해야 타임라인을 앞뒤로 끌어 볼 때와 실제 출력이 왜 다른지 설명할 수 있습니다. 이 글에서는 레벨 시퀀스에 나이아가라 시스템과 수명 트랙을 더하고, 사용자 파라미터를 키로 바꿔 크기와 발광이 줄어드는 폭발을 만든 뒤, 이벤트와 프리롤, 출력을 확인하는 방법을 정리합니다.
시스템과 수명 트랙 더하기
먼저 레벨 시퀀스(Level Sequence)를 만들거나 열고, 나이아가라 시스템 에셋을 레벨에 배치합니다. 효과가 블루프린트 안의 컴포넌트라면 그 컴포넌트를 가진 Actor를 배치합니다. 다음으로 그 Actor를 시퀀서에 추가하고 나이아가라 컴포넌트의 트랙을 더한 뒤, 그 아래에 나이아가라 시스템의 Life Cycle 트랙을 추가합니다. 섹션의 시작과 끝으로 재생 구간을 정하는데, 이때 Auto Activate나 게임 코드의 Activate가 따로 재생을 시작하지 않도록 재생을 제어하는 쪽을 하나로 정해 둡니다.
그다음 Life Cycle 섹션의 Age Update Mode를 확인합니다. Tick Delta Time은 엔진의 틱에 따라 시뮬레이션을 진행하고, Desired Age는 시퀀서가 정한 나이까지 시뮬레이션합니다. Desired Age에서 타임라인을 뒤로 끌면 처음으로 되돌려 다시 계산할 수 있습니다. Desired Age No Seek은 뒤로 옮겼다가 다시 앞으로 갈 때 되돌리는 방식이 다릅니다.
타임라인과 시뮬레이션을 맞추려는 이 글의 예제는 Desired Age를 기준으로 합니다. 그렇다고 같은 시각으로 옮기면 바깥의 상태나 난수, 충돌까지 포함한 모든 결과가 언제나 똑같다는 뜻은 아닙니다.
사용자 파라미터와 트랜스폼의 키
나이아가라 컴포넌트 트랙에서는 지원되는 Float, Color, Vector 같은 사용자 파라미터의 트랙을 더할 수 있습니다. 원하는 파라미터가 보이지 않는다면 먼저 나이아가라 시스템에서 노출하고 모듈의 입력에 연결해야 합니다. 메뉴의 위치는 버전에 따라 다르며, 이름에 Sequencer 같은 접두사를 붙인다고 지원되지 않는 타입이 키를 받을 수 있게 되지는 않습니다.
연속적인 값은 키 사이의 보간과 커브 편집기로 조절합니다. 켜고 끄는 Bool 같은 상태는 연속으로 보간되는 값과 다르게 다뤄집니다. Actor의 트랜스폼에 키를 주면 시스템의 위치와 회전을 바꿀 수 있지만, 이미 생긴 입자까지 따라갈지는 Local Space와 모듈의 좌표 공간을 확인해야 합니다.
크기와 발광이 줄어드는 폭발
이 예제는 크기와 발광의 배율을 Particle Update에서 계속 읽습니다. Spawn에서 읽는 초기 속도만 키로 줄여서는 이미 있는 입자가 저절로 멈추지 않기 때문입니다.
먼저 시스템을 준비합니다. 기본 스프라이트 시스템을 복제해 NS_SequencerExplosion으로 저장하고, 계속 만드는 Spawn Rate를 끈 뒤 0초의 Spawn Burst Instantaneous에 정수 100개를 지정합니다. Emitter State는 Life Cycle Mode를 Self, Loop Behavior를 Once로 두고, Particle State는 수명이 다하면 입자를 없애게 합니다. Particle Spawn에서는 Lifetime을 0.8초, 기준 스프라이트 크기를 10cm, 색을 주황색으로 두고, Add Velocity로 아무 방향의 단위 벡터에 100cm/s를 곱한 초기 속도를 줍니다. Particle Update에는 Gravity Force와 Drag 뒤에 Solve Forces and Velocity를 둡니다.
다음으로 Float 사용자 파라미터 User.ExplosionScale과 User.ExplosionIntensity를 만듭니다. Scale은 Particle Update의 Scale Sprite Size 배율에 연결합니다. Intensity는 Dynamic Material Parameter의 첫 채널에 쓰고, 렌더러의 바인딩과 머티리얼의 DynamicParameter를 거쳐 Particle Color의 RGB에 곱한 뒤 Emissive Color로 보냅니다. 이 경로는 커스텀 머티리얼과의 통합에서 만든 것을 그대로 씁니다.
그다음 레벨에 시스템을 배치하고, 시퀀서의 컴포넌트 아래에 Life Cycle 트랙과 두 Float 파라미터 트랙을 더합니다. Life Cycle 구간은 0.1초부터 1.0초까지로 두고, Age Update Mode는 Desired Age로 정합니다.
이어서 키를 둡니다. 0초에는 Scale과 Intensity를 모두 0으로, 0.1초에는 각각 5와 2로, 0.5초에는 둘 다 0으로 키를 놓고, 연속 값의 보간은 Linear로 정합니다. 시퀀스의 프레임률에 따라 정확히 그 시각을 나타낼 수 있는 프레임을 고르고, 실제로 키가 놓인 시각을 적어 둡니다.
마지막으로 시작 시점보다 앞에서부터 앞으로 재생해, 0.1초에 생긴 입자가 크기와 발광을 줄여 가다가 0.5초에 보이지 않게 되는지 확인합니다. 크기와 발광이 0이 되어도 입자는 수명이 다할 때까지 남아 있을 수 있으며, 1초에서 구간이 끝나는 것과 시스템이 완료되는 정책도 확인합니다.
폭발 크기·발광과 재생 구간
절대 시간 0.1초 최대 Scale 5/Intensity 2→0.3초 2.5/1→0.5초 0에서 표시 변화와 입자 나이/NormalizedAge/1초 재생 구간을 따로 추적할 수 있다.
NIAGARA · CH8-5
키 시간·재생 구간·입자 수명을 구분합니다
가로축은 Sequencer의 절대 시간(초)입니다. 크기와 발광은 서로 다른 최대값을 각각 100%로 정규화해 같은 선으로 표시했습니다.
서로 다른 실제 값
0.1초의 Scale은 5, Intensity는 2입니다. 초기 크기 10cm에 Scale 5를 적용하면 크기는 50cm가 됩니다. 둘 다 Linear 키로 0.5초에 0이 됩니다.
보이지 않는 시점
0.5초의 크기·발광 0은 입자 삭제를 뜻하지 않습니다. 예제 입자의 Lifetime은 0.8초이며, Life Cycle 트랙 끝은 1.0초입니다.
시간을 제어하는 방식
Life Cycle 트랙은 시스템 재생을 제어합니다. Desired Age로 되감아도 외부 이벤트·충돌·난수까지 항상 같은 결과가 되는 것은 아닙니다.
이 그래프의 시간은 Particles.NormalizedAge가 아닙니다. 키 프레임의 표현 가능한 시간과 실제 프레임을 확인합니다.
Scale은 Update의 크기 배율, Intensity는 머티리얼 발광 배율입니다. Linear 키를 읽는 예제이며 Intensity 0이 이동 속도 0을 뜻하지 않습니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 본문·주석 | 가로축은 Sequencer의 절대 시간(초)입니다. 크기와 발광은 서로 다른 최댓값을 각각 100%로 정규화해 같은 선으로 표시했습니다. |
| 노드·연결선 라벨 | 각 최댓값 = 100% |
| 노드·연결선 라벨 | 1.0 s |
| 노드·연결선 라벨 | 0.1 s 시작 |
| 노드·연결선 라벨 | 1.0 s 끝 |
| 관계·조건 설명 | Sequencer 절대 시간 0.1초에 최댓값→0.5초에 영으로 변한다. 최댓값 Scale 5/Intensity 2는 각각 100%로 정규화한다. 0.1→1.0초 Life Cycle은 별도 구간이다. 입자의 NormalizedAge 축이 아니다. |
| 본문·주석 | 0.1초의 Scale은 5, Intensity는 2입니다. 초기 크기 10 cm에 Scale 5를 적용하면 크기는 50 cm가 됩니다. 둘 다 Linear 키로 0.5초에 0이 됩니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 0.1초 키 Sequencer 절대 시간의 최댓값을 읽는다. |
|
|
| 0.3초 중간 Linear 감쇠 중간과 입자 나이를 구분한다. |
|
|
| 0.5초 가시성 두 배율이 0이 되어도 수명 종료와 구분한다. |
|
|
폭발 크기·발광과 재생 구간
절대 시간 0.1초 최대 Scale 5/Intensity 2→0.3초 2.5/1→0.5초 0에서 표시 변화와 입자 나이/NormalizedAge/1초 재생 구간을 따로 추적할 수 있다.
NIAGARA · CH8-5
키 시간·재생 구간·입자 수명을 구분합니다
가로축은 Sequencer의 절대 시간(초)입니다. 크기와 발광은 서로 다른 최대값을 각각 100%로 정규화해 같은 선으로 표시했습니다.
서로 다른 실제 값
0.1초의 Scale은 5, Intensity는 2입니다. 초기 크기 10cm에 Scale 5를 적용하면 크기는 50cm가 됩니다. 둘 다 Linear 키로 0.5초에 0이 됩니다.
보이지 않는 시점
0.5초의 크기·발광 0은 입자 삭제를 뜻하지 않습니다. 예제 입자의 Lifetime은 0.8초이며, Life Cycle 트랙 끝은 1.0초입니다.
시간을 제어하는 방식
Life Cycle 트랙은 시스템 재생을 제어합니다. Desired Age로 되감아도 외부 이벤트·충돌·난수까지 항상 같은 결과가 되는 것은 아닙니다.
이 그래프의 시간은 Particles.NormalizedAge가 아닙니다. 키 프레임의 표현 가능한 시간과 실제 프레임을 확인합니다.
Scale은 Update의 크기 배율, Intensity는 머티리얼 발광 배율입니다. Linear 키를 읽는 예제이며 Intensity 0이 이동 속도 0을 뜻하지 않습니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 본문·주석 | 가로축은 Sequencer의 절대 시간(초)입니다. 크기와 발광은 서로 다른 최댓값을 각각 100%로 정규화해 같은 선으로 표시했습니다. |
| 노드·연결선 라벨 | 각 최댓값 = 100% |
| 노드·연결선 라벨 | 1.0 s |
| 노드·연결선 라벨 | 0.1 s 시작 |
| 노드·연결선 라벨 | 1.0 s 끝 |
| 관계·조건 설명 | Sequencer 절대 시간 0.1초에 최댓값→0.5초에 영으로 변한다. 최댓값 Scale 5/Intensity 2는 각각 100%로 정규화한다. 0.1→1.0초 Life Cycle은 별도 구간이다. 입자의 NormalizedAge 축이 아니다. |
| 본문·주석 | 0.1초의 Scale은 5, Intensity는 2입니다. 초기 크기 10 cm에 Scale 5를 적용하면 크기는 50 cm가 됩니다. 둘 다 Linear 키로 0.5초에 0이 됩니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 0.1초 키 Sequencer 절대 시간의 최댓값을 읽는다. |
|
|
| 0.3초 중간 Linear 감쇠 중간과 입자 나이를 구분한다. |
|
|
| 0.5초 가시성 두 배율이 0이 되어도 수명 종료와 구분한다. |
|
|
위 그림의 가로축은 시퀀서의 절대 시간(초)입니다. 크기와 발광은 최댓값이 서로 다르므로, 각각의 최댓값을 100%로 정규화해 같은 선으로 나타냈습니다. 선은 0.1초에 최대가 되었다가 0.5초에 0까지 곧게 줄어들며, 그 아래의 막대는 0.1초에 시작해 1.0초에 끝나는 Life Cycle 구간입니다. 실제 값으로 보면 0.1초의 Scale은 5, Intensity는 2이므로, 초기 크기 10cm에 Scale 5를 적용하면 50cm가 됩니다.
그림의 오른쪽 설명은 세 가지 시간을 구분하라고 말합니다. 0.5초에 크기와 발광이 0이 되는 것은 입자가 지워진다는 뜻이 아니며, 예제 입자의 Lifetime은 0.8초이고 Life Cycle 트랙은 1.0초에 끝납니다. Life Cycle 트랙은 시스템의 재생을 제어하지만, Desired Age로 되감아도 바깥의 이벤트나 충돌, 난수까지 언제나 같아지지는 않습니다. 또 이 그래프의 시간은 Particles.NormalizedAge가 아닙니다. Scale은 Update의 크기 배율이고 Intensity는 머티리얼의 발광 배율이므로, Intensity가 0이라고 이동 속도가 0이 되는 것도 아닙니다. 입자가 얼마나 살아 있는지와 어떻게 움직이는지, 화면에 보이는지는 따로 봅니다.
같은 시각의 키 값과 입자의 나이를 나누어 계산해 봅니다. Linear 구간인 0.1초에서 0.5초 사이에서 0.3초는 한가운데이므로, Scale은 2.5, Intensity는 1이고, 초기 10cm의 크기 입력은 25cm입니다. 계산을 위해 입자가 시작 시점인 0.1초에 생기고 그 뒤 흐른 시간이 곧 입자의 나이라고 가정하면, 0.3초의 입자 나이는 0.2초이고 NormalizedAge는 0.2 ÷ 0.8 = 0.25입니다. 키의 시각 0.3과 정규화된 나이 0.25는 서로 다른 수입니다.
시퀀서 이벤트
특정 프레임에 명령을 실행하려면, Event Track의 Trigger 키에 디렉터 블루프린트(Director Blueprint)의 엔드포인트를 연결해 처리합니다. 대상 Actor나 컴포넌트를 넘겨받아, 그 참조로 Set Niagara Variable이나 Activate를 부릅니다. 이것은 나이아가라 안의 이미터 이벤트 핸들러로 블루프린트의 이벤트를 보내는 방식과는 다릅니다.
Life Cycle 트랙이 이미 재생을 제어하고 있다면, 같은 컴포넌트를 Event Track에서 다시 Reset하지 않습니다. 이벤트는 사운드나 카메라 흔들림처럼 따로 맞춰야 하는 동작에 쓰고, 앞으로 재생할 때와 거꾸로 재생할 때, 타임라인을 끌 때 이벤트가 어떻게 발생하는지 확인합니다.
프리롤과 출력
컷의 첫 프레임에 이미 연기나 잔상이 있어야 한다면 프리롤(pre-roll)을 확보합니다. 나이아가라의 Warmup만 진행하면, 바깥의 액터나 충돌 대상의 시간까지 함께 진행된다고 가정할 수 없습니다. 무비 렌더 큐(Movie Render Queue)의 엔진 Warm Up과 렌더 Warm Up은 역할이 다르며, 깊이 버퍼를 쓰는 충돌 같은 것은 실제 렌더링 준비가 필요할 수 있습니다.
마지막으로 앞으로 재생할 때, 되감았다가 재생할 때, PIE에서, 무비 렌더 큐로 출력할 때 효과의 시작과 감쇠, 잔상이 끝나는 모습을 비교합니다. 같은 효과를 여러 시퀀스에서 다시 쓰더라도, 각 컷의 키와 바깥 상태, 품질과 동시 효과 수를 함께 확인합니다.
정리
- 시퀀서에서는 나이아가라 컴포넌트 트랙 아래의 Life Cycle 트랙으로 재생 구간을 정하며, 재생을 제어하는 쪽은 하나로 둡니다.
- Age Update Mode의
Desired Age는 시퀀서가 정한 나이까지 시뮬레이션하지만, 바깥 상태나 난수, 충돌까지 늘 같아지지는 않습니다. - 사용자 파라미터는 시스템에서 노출하고 모듈의 입력에 연결해야 트랙으로 키를 줄 수 있으며, 계속 바뀌어야 하는 값은 Update에서 읽습니다.
- 시퀀서의 시간과 입자의 나이, 정규화된 나이는 서로 다른 수이며, 크기나 발광이 0이 되어도 입자는 수명이 다할 때까지 남습니다.
- 프레임에 맞춘 명령은 Event Track과 디렉터 블루프린트로 처리하고, 첫 프레임의 상태는 프리롤로 준비합니다.
연습 문제
1. 0.4초의 값
본문과 같은 가정에서 0.4초의 Scale과 Intensity, 크기, NormalizedAge를 계산해 보세요. 0.5초에 크기와 발광이 0이 된다는 이유로 입자의 수명이 0.4초에 끝났다고 판단해도 될까요?
해설 보기
감쇠 구간의 진행률은 (0.4 - 0.1) ÷ (0.5 - 0.1) = 0.75입니다. 그래서 Scale은 5 × (1 - 0.75) = 1.25, Intensity는 2 × (1 - 0.75) = 0.5, 크기는 10 × 1.25 = 12.5cm입니다. 입자의 나이는 0.4 - 0.1 = 0.3초이므로 NormalizedAge는 0.3 ÷ 0.8 = 0.375입니다.
그렇게 판단할 수 없습니다. 이 가정에서 0.5초의 입자 나이는 0.4초이며, 수명 0.8초가 끝나는 것과는 다릅니다. 크기와 발광이 0이 되어 보이지 않을 뿐 입자는 살아 있습니다. 트랙이 끝나거나 되돌려지거나 바깥의 충돌이 있을 때의 실제 결과는 따로 확인합니다.
2. 두 곳에서 시작되는 폭발
컷신을 재생하면 폭발이 레벨이 시작되자마자 한 번, 시퀀스의 0.1초에 또 한 번 터집니다. 무엇이 문제일 가능성이 클까요?
해설 보기
재생을 제어하는 쪽이 둘일 가능성이 큽니다. 나이아가라 컴포넌트의 Auto Activate가 켜져 있어 레벨이 시작될 때 한 번 재생되고, 시퀀서의 Life Cycle 트랙이 0.1초에 다시 재생을 시작한 것입니다.
Auto Activate를 끄고, 게임 코드에서도 같은 컴포넌트를 Activate하지 않는지 확인해 시퀀서만 재생을 제어하게 합니다. Event Track에서 같은 컴포넌트를 Reset하고 있지 않은지도 함께 봅니다.
3. 되감으면 달라지는 연기
Desired Age로 둔 연기 효과를 타임라인에서 뒤로 끌었다가 다시 앞으로 재생했더니, 처음 재생했을 때와 모양이 조금 다릅니다. 오류일까요?
해설 보기
꼭 오류라고 할 수는 없습니다. Desired Age는 정한 나이까지 다시 시뮬레이션하지만, 난수의 시드나 바깥 액터의 상태, 충돌 대상의 위치처럼 시뮬레이션 바깥의 조건까지 언제나 같게 맞춰 주지는 않습니다.
모양이 똑같아야 한다면 난수를 고정하는 설정과 바깥 상태가 시퀀스와 함께 움직이는지 확인하고, 최종 결과는 무비 렌더 큐로 앞으로 재생해 출력한 화면으로 판단합니다.
Life Cycle 트랙과 Age Update Mode는 Epic의 나이아가라 시스템 제어 문서에서, 프리롤은 프리롤 설정 문서에서 확인할 수 있습니다.
이것으로 8장을 마칩니다. 8장에서는 블루프린트로 나이아가라 컴포넌트를 켜고 끄는 방법에서 시작해, 플레이 중에 값을 갱신하는 주기, 사건이 일어난 순간에 효과를 만드는 순서, 게임플레이 요소와 효과를 연결하는 방법, 그리고 시퀀서의 시간축에서 효과를 제어하는 방법까지 블루프린트와 나이아가라를 잇는 방법을 살펴봤습니다. 다음 장의 기본적인 이펙트 제작 방법부터는 지금까지 익힌 기능을 모아 발자국과 물 튀김, 마법, 무기처럼 게임에서 자주 쓰는 효과를 직접 만들어 봅니다.