이미터의 개념과 설정
이미터가 파티클의 생성·갱신·표현을 담당하는 범위를 이해하고 Spawn·Update·Render 모듈 스택을 구성합니다.
첫 번째 나이아가라 이펙트에서 템플릿으로 시스템을 만들 때, 시스템 개요에는 SimpleSpriteBurst라는 이미터가 하나 들어 있었습니다. 효과가 조금만 복잡해져도 이미터는 여러 개로 늘어나고, 이미터 안의 모듈도 어느 그룹에 넣느냐에 따라 실행되는 대상과 횟수가 달라집니다. 이 글에서는 나이아가라 시스템을 이루는 이미터(Emitter)가 무엇인지 살펴보고, 이미터 안의 실행 그룹이 각각 무엇을 대상으로 언제 실행되는지 정리한 뒤, 이미터를 더하고 지우는 방법을 익힙니다.
한 무리의 입자를 맡는 이미터
이미터는 나이아가라 시스템 안에서 한 무리의 파티클을 어떻게 만들고, 유지하고, 없애고, 그릴지를 정하는 독립된 단위입니다. 하나의 시스템은 이미터를 여러 개 담을 수 있습니다. 예를 들어 불꽃 효과를 만든다면 심지에서 피어오르는 연기, 터지며 흩날리는 불티, 그리고 바닥에 남는 재는 모두 성질이 다른 파티클입니다. 이 세 가지를 각각 이미터 하나가 맡으면, 연기의 생성량을 바꿔도 불티의 움직임에는 영향을 주지 않도록 따로 다룰 수 있습니다.
이미터는 저장되는 위치와 쓰이는 범위에 따라 두 가지로 나누어 생각할 수 있습니다. 이 구분은 이해를 돕기 위한 것이며, 모든 이미터를 공식적으로 두 유형으로 나눈다는 뜻은 아닙니다.
- 독립적인 이미터(Stand-alone Emitter): 그 자체가 하나의
.uasset파일로 저장되어 여러 나이아가라 시스템에서 다시 쓸 수 있습니다. 폭발의 섬광이나 연기 기둥처럼 자주 쓰는 효과를 표준으로 만들어 여러 시스템에 적용할 때 쓸모가 있습니다. - 시스템 내장 이미터(Embedded Emitter): 특정 나이아가라 시스템 안에서 만들어져 그 시스템에만 속하는 이미터입니다. 그 시스템의 한 부분을 이룰 때 씁니다.
이 장에서는 주로 시스템 안에 들어 있는 이미터를 기준으로 설명하지만, 독립적인 이미터도 같은 원리로 동작합니다.
이미터 안의 실행 그룹
시스템 개요(System Overview) 패널에서 이미터를 선택하면 그 안의 스택을 볼 수 있습니다. 기본 이미터 스택에는 Emitter Spawn, Emitter Update, Particle Spawn, Particle Update, Render 그룹이 있고, 설정에 따라 이벤트 핸들러(Event Handler)나 시뮬레이션 스테이지(Simulation Stage) 그룹이 더해집니다. 그룹마다 실행되는 대상이 이미터 하나인지 입자 하나하나인지, 그리고 한 번만 실행되는지 틱마다 실행되는지가 다릅니다.
NIAGARA · CH2-1
이미터 단위와 입자 단위의 실행을 구분합니다
System은 하나 이상의 Emitter를 포함할 수 있습니다. 생성량을 정하는 계산과 각 입자의 초기화·갱신은 대상과 빈도가 다릅니다.
System · 효과 묶음
연기·불꽃·재처럼 다른 입자 집단을 여러 Emitter로 구성할 수 있습니다.
Emitter · 입자 집단의 생성·갱신·표현
Emitter Spawn
이미터 생성 시 한 번 초기값을 설정합니다. 각 입자의 생성 순간과 다릅니다.
Emitter Update
이미터 단위로 시뮬레이션 틱마다 상태와 그 틱의 생성량을 계산합니다.
Emitter State · Spawn Rate · Spawn Burst
Particle Spawn
새로 생성되는 입자마다 초기 속성을 채웁니다.
Initialize Particle · 초기 위치/속도/수명
Particle Update
살아 있는 입자마다 시뮬레이션 틱마다 움직임과 속성을 갱신합니다.
힘·속도 통합 · 색/크기 · 나이/소멸 조건
Render · 계산된 속성을 읽습니다
Sprite · Mesh · Ribbon · Light 등 렌더러 설정으로 표현을 정합니다. 렌더러의 개수와 입자 수는 같은 개념이 아닙니다.
생성량 계산 ≠ 입자 초기화
Rate/Burst는 이미터 단위에서 생성할 개수를 정하고, Particle Spawn은 그 새 입자들의 초기값을 채웁니다.
이 포함 관계와 실행 범위 비교를 전체 엔진의 호출 순서로 읽지 않습니다. 설정에 따라 Event Handler·Simulation Stage도 추가됩니다. 반복 재생·리셋 등 구체적 수명 정책은 해당 이미터 설정에서 확인합니다.
위 그림은 이미터 단위의 실행과 입자 단위의 실행을 나누어 보여 줍니다. 가장 바깥의 System 영역이 Emitter 영역을 감싸고 있어, 시스템이 하나 이상의 이미터를 담는다는 것을 나타냅니다. Emitter 영역 안에서 Emitter Spawn은 이미터가 생길 때 한 번 이미터의 초기값을 정하고, Emitter Update는 이미터의 시뮬레이션 틱마다 이미터의 상태와 이번에 새로 만들 입자 수를 계산합니다. 그 수만큼의 새 입자마다 Particle Spawn이 초기 상태를 채우고, 살아 있는 입자마다 Particle Update가 틱마다 속성을 갱신하는데, Particle Update에 붙은 자기 화살표가 살아 있는 동안의 반복을 나타냅니다.
그림의 선은 두 종류입니다. 실선은 초기값이나 새 생성 수, 초기 상태 같은 데이터가 전달되는 관계이고, Renderer로 가는 점선은 렌더러가 바인딩된 속성을 읽어 화면에 출력하는 관계입니다. 그림 아래의 설명처럼 생성량을 계산하는 일과 입자를 초기화하는 일은 다릅니다. Rate나 Burst는 이미터 단위에서 만들 개수를 정하고, Particle Spawn은 그 새 입자들의 초기값을 채웁니다. 또 이 그림은 포함 관계와 실행 범위를 비교한 것이라 엔진 전체의 호출 순서로 읽으면 안 되며, 반복 재생이나 리셋 같은 구체적인 수명 정책은 해당 이미터의 설정에서 확인합니다.
Emitter Spawn
Emitter Spawn은 이미터가 만들어질 때 한 번 실행되는 그룹으로, 이미터 단위의 초기값을 정합니다. 이름이 비슷하지만 입자가 생길 때마다 실행되는 Particle Spawn과는 실행 대상과 횟수가 다릅니다.
Emitter Update
Emitter Update는 이미터 단위로 시뮬레이션 틱마다 실행됩니다. 이미터의 상태를 갱신하고, 이번 틱에 새로 만들 입자의 수를 계산합니다. 이 그룹의 대표적인 모듈은 다음과 같습니다.
Emitter State: 이미터의 반복 방식과 지속 시간, 켜지고 꺼지는 시점을 정합니다. 이미터가 계속 파티클을 만들지, 정해진 시간만 만들고 멈출지를 여기서 결정합니다.Spawn Rate: 초당 몇 개의 파티클을 만들지 정합니다. 계속 뿜어져 나오는 연기나 물줄기 같은 효과에 씁니다.Spawn Burst Instantaneous: 정해진 시점에 정해진 수의 파티클을 한꺼번에 만듭니다. 폭발처럼 짧은 순간에 많은 파티클이 필요한 효과에 알맞습니다.
Particle Spawn
Particle Spawn 그룹의 모듈은 입자 하나가 만들어지는 순간에 그 입자를 대상으로 한 번만 실행됩니다. 대부분의 이미터에는 생성되는 입자의 수명과 초기 색, 초기 크기 같은 기본 속성을 정하는 Initialize Particle이 들어 있습니다. 입자마다 값을 다르게 주고 싶다면 수명이나 속도 같은 입력에 그 자료형에 맞는 Random Range 동적 입력을 연결합니다. Add Velocity는 입자가 생길 때 초기 속도를 주어 정해진 방향으로 움직이게 합니다.
Particle Update
Particle Update 그룹의 모듈은 시뮬레이션 틱마다 살아 있는 입자 하나하나를 대상으로 실행됩니다. 입자의 움직임과 색, 크기처럼 시간에 따라 바뀌는 요소는 대부분 이 그룹에서 다룹니다.
- 힘(Force) 모듈:
Gravity Force나Wind Force처럼 바깥의 힘을 더해 입자의 움직임을 바꿉니다. Particle State: 입자의 나이를 세고, 수명이 다하면 입자를 없앱니다.Scale Color: 수명에 따라 색이 바뀌게 합니다. 뜨거울 때는 붉다가 식을수록 어두워지는 불티가 그 예입니다.Scale Sprite Size: 수명에 따라 크기가 바뀌게 합니다. 사라질수록 작아지는 연기가 그 예입니다.Solve Forces and Velocity: 앞에서 더한 힘과 속도 변화를 모아 입자의 최종 위치를 계산합니다.
Solve Forces and Velocity는 힘을 더하는 모듈들보다 뒤에 두어야 그 힘이 위치 계산에 반영됩니다. 그렇다고 무조건 스택의 맨 마지막으로 옮길 필요는 없습니다. 계산된 위치나 속도를 읽는 후처리 모듈이 그 뒤에 올 수도 있으므로, 각 모듈이 무엇에 의존하는지와 에디터의 오류 표시를 따라 순서를 정합니다.
Render
Render 그룹에는 파티클을 화면에 어떻게 그릴지 정하는 렌더러가 들어갑니다. 렌더러는 시뮬레이션을 바꾸지 않고, 계산된 속성을 읽어 화면에 표현합니다.
Sprite Renderer: 파티클을 2D 이미지인 스프라이트로 그립니다. 가장 흔히 쓰는 렌더러입니다.Mesh Renderer: 파티클을 3D 메시로 그립니다. 입자 하나하나를 작은 돌멩이나 캐릭터 모델로 표현할 때 씁니다.Ribbon Renderer: 같은 Ribbon ID를 가진 파티클들을 연결 순서에 따라 이어 띠로 그립니다. 입자 하나의 지나온 위치가 저절로 모두 저장되는 것은 아니며, 마법 주문의 궤적이나 물줄기 같은 효과에 알맞습니다.Light Renderer: 파티클마다 주변을 비추는 빛을 냅니다.
한 이미터에 렌더러를 여러 개 둘 수도 있으므로, 렌더러의 개수와 입자의 수는 서로 다른 개념입니다.
이번 틱의 새 입자와 갱신 대상
그룹마다 실행 대상이 다르다는 점을 숫자로 확인해 봅니다. 한 이미터가 이번 틱에 새 입자 4개를 만든다고 해 봅시다. Spawn Rate나 버스트 쪽 계산은 이미터의 생성량을 정할 뿐이고, Particle Spawn의 초기화는 그 새 입자 4개에 적용됩니다. 한편 Particle Update가 실행될 때 살아 있는 입자가 12개라면, 그 그룹의 모듈은 12개 모두의 상태를 갱신합니다.
즉 "새 입자 4개"와 "갱신 대상 12개"는 서로 다른 수입니다. 이 예는 각 그룹이 무엇을 대상으로 하는지 설명하기 위한 것이며, 생성 시점을 틱 사이에 나누어 보간하는 스폰처럼 엔진 내부에서 실제로 몇 번 호출되는지나 성능을 측정한 값은 아닙니다.
이미터 더하기와 지우기
시스템에 새 이미터를 더하려면 시스템 개요의 빈 곳을 오른쪽 클릭하고 Add Emitter를 고른 뒤, 나타나는 목록에서 이미터 에셋이나 템플릿을 선택합니다. 엔진 버전에 따라 메뉴 위치와 필터가 조금 다를 수 있습니다. 이미터를 지우려면 시스템 개요에서 그 이미터를 선택하고 Delete 키를 누릅니다.
이미터를 언제 더하고 언제 지울지도 기준을 세워 두면 좋습니다. 맡는 역할이 다르다면 이미터를 새로 더하고, 구조는 같고 색이나 생성량만 다르다면 이미터를 복제할지 파라미터를 공유할지 비교합니다. 여러 시스템에서 되풀이되는 패턴은 이미터 에셋으로 관리하고, 그 에셋을 부모로 삼는 상속 관계와 버전을 확인합니다. 역할이 겹치는 것 같은 이미터는 바로 지우지 말고, 먼저 꺼 보면서 화면에서 얼마나 차이가 나고 비용이 얼마나 줄어드는지 비교한 뒤 지웁니다.
정리
- 이미터는 한 무리의 파티클을 만들고 갱신하고 그리는 단위이며, 시스템은 여러 이미터를 담을 수 있습니다.
- Emitter Spawn은 이미터가 생길 때 한 번, Emitter Update는 이미터 단위로 틱마다 실행되어 상태와 새 생성 수를 정합니다.
- Particle Spawn은 새 입자마다 한 번 초기값을 채우고, Particle Update는 살아 있는 입자마다 틱마다 속성을 갱신합니다.
Solve Forces and Velocity는 힘을 더하는 모듈 뒤에 두되, 모듈 사이의 의존과 에디터의 오류 표시를 따라 순서를 정합니다.- 렌더러는 계산된 속성을 읽어 그리는 출력 설정이며, 이미터는 역할이 다를 때 더하고 겹치는 이미터는 꺼서 비교한 뒤 지웁니다.
연습 문제
1. 새 입자만 파랗게
새로 생기는 입자만 처음에 파란색으로 만들고, 이미 살아 있는 입자는 나이에 따라 크기를 줄이려 합니다. 각 처리를 어느 그룹에 두어야 할까요? 또 Spawn Rate를 두 배로 바꾸기만 하면 기존 입자의 색도 바로 바뀌는지 설명해 보세요.
해설 보기
초기 색은 입자가 생길 때 한 번 정하는 값이므로 Particle Spawn의 초기화 입력에 둡니다. 나이에 따른 크기 변화는 살아 있는 동안 계속 바뀌는 값이므로 Particle Update에 둡니다.
Spawn Rate를 바꾸면 앞으로 만들어질 입자의 수가 바뀔 뿐, 이미 살아 있는 입자에 새 초기 색을 다시 적용하지는 않습니다. 다만 Particle Update에서 색을 덮어쓰는 모듈이 있거나 시뮬레이션을 다시 시작하면 결과가 달라질 수 있으므로, 이 두 경우는 따로 구별해서 봅니다.
2. 새 입자 4개와 살아 있는 입자 12개
이번 틱에 새 입자 4개가 생기고, Particle Update가 실행될 때 살아 있는 입자는 12개입니다. Particle Spawn 그룹의 Initialize Particle과 Particle Update 그룹의 Scale Color는 이번 틱에 각각 몇 개의 입자를 대상으로 실행될까요?
해설 보기
Initialize Particle은 새로 생긴 입자에만 적용되므로 4개를 대상으로 실행됩니다. Scale Color는 살아 있는 입자 모두에 적용되므로 12개를 대상으로 실행됩니다.
생성량을 정하는 계산은 이미터 단위에서 한 번 이루어지고, 그 결과로 생긴 입자들이 Particle Spawn의 대상이 됩니다. 이 수는 실행 대상을 설명하는 값이며 엔진 내부의 호출 횟수를 측정한 것은 아닙니다.
3. 힘이 반영되지 않는 위치
Particle Update에서 Gravity Force를 Solve Forces and Velocity보다 아래에 두었더니 중력이 위치에 반영되지 않는 것처럼 보입니다. 왜 그럴까요?
해설 보기
같은 그룹 안의 모듈은 위에서 아래로 실행됩니다. Solve Forces and Velocity가 먼저 실행되어 위치를 계산한 뒤에 Gravity Force가 힘을 더하면, 그 힘은 이번 틱의 위치 계산에 들어가지 못합니다.
Gravity Force를 Solve Forces and Velocity보다 위로 옮기면 더한 힘이 위치 계산에 반영됩니다. 이때도 계산된 위치를 읽는 후처리 모듈이 있다면 그 모듈은 Solve Forces and Velocity 뒤에 둡니다.
각 실행 그룹과 이미터 설정은 Epic의 나이아가라 개요에서 확인할 수 있습니다.
다음 글 파티클 생성 및 기본 속성 설정에서는 Spawn Rate와 버스트로 생성량을 정하고, Initialize Particle로 수명과 색, 크기 같은 기본 속성을 설정합니다.