이미터와 모듈 구조
Niagara의 Emitter 스택 구조와 모듈 실행 순서를 깊이 있게 이해합니다.
Emitter 스택 구조
6개의 그룹으로 구성된 실행 스택
Niagara Emitter는 6개의 그룹(Group)으로 구성된 스택 구조를 가집니다. 각 그룹은 특정 시점에 실행되며, 그룹 내부의 모듈은 위에서 아래로 순차 실행됩니다.
System에도 System Spawn과 System Update 그룹이 있습니다. 이 그룹은 모든 Emitter보다 먼저 실행되어, Emitter 간 공유 데이터를 설정하거나 시스템 전체의 동작을 제어합니다.
모듈 실행 순서와 데이터 흐름
프레임당 실행 흐름 이해하기
매 프레임마다 Niagara는 다음 순서로 모듈을 실행합니다.
Spawn/Update
Spawn/Update
Spawn
Update
실행 컨텍스트별 특징
| 그룹 | 실행 시점 | 반복 대상 | 접근 가능 데이터 |
|---|---|---|---|
| System Spawn | System 생성 시 1회 | 없음 | System 파라미터 |
| System Update | 매 프레임 | 없음 | System 파라미터 |
| Emitter Spawn | Emitter 시작 시 1회 | Emitter당 1회 | System + Emitter 파라미터 |
| Emitter Update | 매 프레임 | Emitter당 1회 | System + Emitter 파라미터 |
| Particle Spawn | 파티클 생성 시 | 새 파티클마다 | System + Emitter + Particle 파라미터 |
| Particle Update | 매 프레임 | 모든 활성 파티클 | System + Emitter + Particle 파라미터 |
같은 그룹 내의 모듈은 위에서 아래로 순차 실행됩니다. 예를 들어, Add Velocity를 Initialize Particle 위에 배치하면, 속도가 초기화에 의해 덮어쓰여질 수 있습니다. 드래그 앤 드롭으로 모듈 순서를 변경할 수 있습니다.
주요 내장 모듈 레퍼런스
자주 사용하는 기본 모듈 파라미터 정리
Emitter Update 모듈
| 모듈명 | 주요 파라미터 | 설명 |
|---|---|---|
Emitter State |
Life Cycle Mode, Loop Behavior |
이미터의 활성/비활성/루프 상태를 관리 |
Spawn Rate |
SpawnRate (float) |
초당 파티클 생성 수. Dynamic Input으로 시간에 따라 변경 가능 |
Spawn Burst Instantaneous |
SpawnCount (int) |
한 번에 지정된 수의 파티클을 즉시 생성 |
Spawn Per Frame |
SpawnCount (int) |
매 프레임마다 고정된 수의 파티클 생성 |
Particle Spawn 모듈
| 모듈명 | 주요 파라미터 | 설명 |
|---|---|---|
Initialize Particle |
Lifetime, Color, Sprite Size, Mass |
파티클의 초기 속성 일괄 설정 |
Add Velocity |
Velocity (Vector) |
초기 속도 벡터 추가. 여러 개 중첩 가능 |
Shape Location |
Shape Primitive, Radius |
Sphere, Box, Cylinder, Torus 등 스폰 영역 지정 |
Set (Variable) |
선택한 변수 | 특정 Particle Attribute를 직접 설정 |
Particle Update 모듈
| 모듈명 | 주요 파라미터 | 설명 |
|---|---|---|
Particle State |
Kill Particles When Lifetime Has Elapsed |
수명이 다한 파티클 자동 제거 |
Gravity Force |
Gravity (Vector, 기본: 0,0,-981) |
중력 가속도 적용 |
Drag |
Drag (float) |
속도에 비례하는 저항력 적용 |
Scale Color |
Scale Color (Color Curve) |
Normalized Age에 따라 색상/알파 변화 |
Solve Forces and Velocity |
- | 누적된 힘을 속도와 위치에 반영 (반드시 힘 모듈 뒤에 배치) |
힘(Force) 관련 모듈을 사용할 때는 반드시 Solve Forces and Velocity 모듈을 Particle Update 스택의 마지막(렌더러 전)에 배치해야 합니다. 이 모듈이 누적된 힘을 실제 위치 변화로 변환합니다. 빠뜨리면 힘이 적용되지 않습니다.
Module과 Item의 차이
편집 가능한 모듈과 고정된 아이템
Niagara 스택에 배치되는 요소는 크게 Module과 Item으로 나뉩니다. 모든 Module은 Item이지만, 모든 Item이 Module인 것은 아닙니다.
| 구분 | Module | Item (Non-Module) |
|---|---|---|
| 정의 | 사용자가 편집/생성 가능한 스크립트 | 시스템이 관리하는 고정 요소 |
| 편집 | 노드 그래프로 내부 로직 수정 가능 | 프로퍼티 값만 변경 가능 |
| 예시 | Add Velocity, Gravity Force, Scale Color | Emitter Properties, Sprite Renderer |
| 재사용 | 콘텐츠 브라우저에 에셋으로 저장 가능 | 해당 Emitter에 종속 |
Emitter Properties
{
Sim Target: CPUSim | GPUComputeSim
// CPU 시뮬레이션: 이벤트 지원, 적은 파티클에 적합
// GPU 시뮬레이션: 대규모 파티클, 이벤트 미지원
Calculate Bounds Mode: Dynamic | Fixed
// Dynamic: 매 프레임 바운드 계산 (정확하지만 비용 증가)
// Fixed: 고정 바운드 (성능 좋지만 잘릴 수 있음)
Local Space: true | false
// true: 이미터 위치 기준 로컬 좌표
// false: 월드 좌표 (기본값, 대부분의 경우 사용)
Determinism: true | false
// true: 동일한 시드에서 항상 같은 결과 보장
}
CPUSim: 이벤트 핸들러가 필요하거나, 파티클 수가 적은 경우 (수백~수천 개). GPUComputeSim: 파티클 수가 많거나 (수만~수백만 개), Simulation Stage/Neighbor Grid가 필요한 경우. GPU Sim에서는 이벤트가 동작하지 않으므로 Data Channel을 사용해야 합니다.
Emitter 재사용과 상속
Parent Emitter, Versioning, 에셋 관리
Niagara Emitter는 독립 에셋으로 저장할 수 있어, 여러 System에서 재사용이 가능합니다.
Parent Emitter (상속)
Emitter는 Parent Emitter를 지정하여 상속 관계를 만들 수 있습니다. Parent의 모듈과 설정을 그대로 가져오면서, 필요한 부분만 오버라이드할 수 있습니다.
BaseFireEmitter (Parent)
└ Emitter Update: Spawn Rate = 50
└ Particle Spawn: Initialize, Add Velocity
└ Particle Update: Gravity, Scale Color
└ Render: Sprite Renderer
SmallFireEmitter (Child - BaseFireEmitter 상속)
└ Override: Spawn Rate = 20 // 오버라이드
└ Override: Lifetime = 1.5 // 오버라이드
└ // 나머지는 Parent에서 상속
LargeFireEmitter (Child - BaseFireEmitter 상속)
└ Override: Spawn Rate = 200 // 오버라이드
└ Added: Point Attractor // 모듈 추가
└ // 나머지는 Parent에서 상속
Emitter Versioning
UE5.5+에서는 Emitter Versioning을 지원합니다. Emitter의 버전을 관리하여, 이미 배치된 System에 영향을 주지 않고 Emitter를 업데이트할 수 있습니다.
1) 공통 동작은 Parent Emitter로 추출하여 재사용합니다. 2) System은 특정 상황(폭발, 비, 불꽃 등)에 맞게 Emitter를 조합합니다. 3) 에셋 이름에 접두사를 사용합니다: NS_(System), NE_(Emitter), NM_(Module).
핵심 요약
- Emitter 스택은 6개 그룹으로 구성: Emitter Spawn/Update, Particle Spawn/Update, Event Handler, Render
- 모듈은 각 그룹 내에서 위에서 아래로 순차 실행되며, 순서가 결과에 영향을 줍니다.
- 실행 순서: System Spawn/Update → Emitter Spawn/Update → Particle Spawn → Particle Update → Render
- Module은 사용자가 편집/생성 가능한 스크립트이고, Item은 시스템이 관리하는 고정 요소입니다.
- Sim Target에서 CPU와 GPU 시뮬레이션을 선택할 수 있으며, GPU Sim은 이벤트를 지원하지 않습니다.
- Emitter는 Parent 상속과 Versioning으로 재사용과 관리가 용이합니다.
도전 과제
배운 내용을 직접 실습해보세요
빈 Emitter를 만들고 Emitter Spawn, Emitter Update, Particle Spawn, Particle Update 각 단계에 모듈을 하나씩 추가하며 실행 시점의 차이를 확인하세요. Spawn에서 색상 설정 vs Update에서 색상 변경의 차이를 관찰하세요.
Particle Update 스택에서 Gravity Force와 Drag 모듈의 순서를 바꿔보세요. Add Velocity 후 Scale Velocity를 추가할 때와 순서를 반대로 할 때의 파티클 궤적 차이를 비교하세요.
프로젝트에서 자주 사용할 기본 이미터 구성(Spawn Rate + Initialize + Gravity + Color Fade + Sprite Renderer)을 만들고, 에셋으로 저장하여 재사용 가능한 템플릿으로 등록하세요.