Dynamic Input
고정 값 대신 동적으로 계산되는 입력을 활용하여 복잡한 이펙트 동작을 만듭니다.
Dynamic Input 개념
정적 값에서 동적 표현식으로
Niagara 모듈의 파라미터에 단순한 고정 값 대신 Dynamic Input을 설정할 수 있습니다. Dynamic Input은 매 프레임 또는 파티클 생성 시 동적으로 계산되는 표현식입니다.
// 모듈 파라미터 옆의 드롭다운 클릭
파라미터 값 옆 ▼ 클릭 → 다음 옵션 선택:
"Set a specific value" // 고정 값 직접 입력
"Link to parameter" // 다른 파라미터에 바인딩
"Dynamic Inputs" // 동적 표현식 선택
"Expression" // 인라인 HLSL 표현식
주요 Dynamic Input 종류
Uniform Ranged Float
지정된 최소~최대 범위에서 균일하게 랜덤 값 생성. 파티클마다 다른 수명/크기에 사용.
Uniform Ranged Vector
Vector의 각 컴포넌트별로 독립적인 랜덤 범위 지정. 초기 속도 분산에 유용.
Float from Curve
커브 에디터로 시간(NormalizedAge)에 따른 값 변화 정의. 페이드인/아웃에 필수.
Color from Curve
그래디언트 에디터로 시간에 따른 색상 변화 정의. 불꽃의 색 변화 등에 사용.
Vector from Curve
Vector의 각 컴포넌트를 개별 커브로 정의. 크기 변화에 활용.
Make Linear Color
RGBA를 개별 float으로 구성. 각 채널에 Dynamic Input 중첩 가능.
Curve와 Gradient 활용
시간에 따른 부드러운 값 변화
Curve는 Niagara에서 가장 자주 사용하는 Dynamic Input입니다. NormalizedAge(0~1)를 입력으로 받아 시간에 따른 값 변화를 정의합니다.
// Scale Color 모듈의 Color에 Color from Curve 적용
Color from Curve
Curve Index: Particles.NormalizedAge
// 커브 키프레임:
Time 0.0 → Color: (1.0, 1.0, 0.8, 0.0) // 밝은 흰색, 투명
Time 0.05 → Color: (1.0, 0.9, 0.3, 1.0) // 밝은 노란색, 불투명
Time 0.3 → Color: (1.0, 0.4, 0.0, 1.0) // 주황색
Time 0.6 → Color: (0.8, 0.1, 0.0, 0.8) // 짙은 빨간색
Time 1.0 → Color: (0.2, 0.0, 0.0, 0.0) // 어두운 빨간색, 투명
Curve 편집 팁
| 기능 | 조작 | 활용 |
|---|---|---|
| 키 추가 | 커브 위 우클릭 → Add Key | 중간 지점에 새로운 값 추가 |
| 탄젠트 조절 | 키 선택 후 핸들 드래그 | 완만한/급격한 변화 커브 조절 |
| 보간 방식 | 키 우클릭 → Interp Mode | Linear, Cubic, Constant 선택 |
| 범위 확장 | 커브에서 Y값을 1.0 이상 설정 | HDR 색상, 초과 스케일 등 |
HLSL Expression
인라인 코드로 복잡한 표현식 작성
파라미터 드롭다운에서 Expression을 선택하면 인라인 HLSL 코드를 직접 작성할 수 있습니다. 별도의 Scratch Pad 모듈을 만들지 않고도 간단한 수학 연산을 적용할 수 있어 매우 편리합니다.
// 1. 사인파 진동
sin(Emitter.Age * 3.14159 * 2.0) * 100.0
// 2. 랜덤 오프셋 (UniqueID 기반)
frac(sin(float(Particles.UniqueID) * 12.9898) * 43758.5453)
// 3. 거리 기반 페이드
saturate(1.0 - length(Particles.Position) / 500.0)
// 4. 시간 기반 펄스
smoothstep(0.0, 0.1, Particles.NormalizedAge) *
smoothstep(1.0, 0.8, Particles.NormalizedAge)
// 5. 나선형 위치 계산
float Angle = Particles.NormalizedAge * 6.28318 * 3.0;
float Radius = Particles.NormalizedAge * 200.0;
float3(cos(Angle) * Radius, sin(Angle) * Radius, Particles.NormalizedAge * 500.0)
HLSL Expression에서는 현재 스코프의 모든 파라미터에 접근 가능합니다. Particles.Position, Emitter.Age, Engine.DeltaTime 등을 네임스페이스 포함 전체 이름으로 사용하세요. VM(CPU)과 HLSL(GPU) 함수 모두 사용 가능합니다.
Dynamic Input 조합 패턴
실전에서 자주 사용하는 조합 기법
패턴 1: 랜덤 + 커브 조합
// Particle Spawn: Initialize Particle
Lifetime: Uniform Ranged Float
Min = 1.0, Max = 3.0 // 1~3초 랜덤 수명
// Particle Update: Scale Sprite Size
Scale Factor: Float from Curve
CurveIndex = Particles.NormalizedAge
// 0.0 → 0.2 (작게 시작)
// 0.3 → 1.0 (최대 크기)
// 1.0 → 0.0 (소멸 시 사라짐)
// 결과: 각 파티클의 수명은 다르지만,
// NormalizedAge로 크기 변화 패턴은 동일
패턴 2: 조건부 동작
// Scale Color 모듈의 Color 파라미터에 Expression 적용
float HeightFactor = saturate(Particles.Position.z / 500.0);
float4 LowColor = float4(1, 0.3, 0, 1); // 주황 (낮은 곳)
float4 HighColor = float4(0.5, 0.5, 1, 1); // 파랑 (높은 곳)
lerp(LowColor, HighColor, HeightFactor)
패턴 3: 중첩 Dynamic Input
Dynamic Input은 중첩(Nesting)이 가능합니다. 하나의 Dynamic Input의 파라미터에 다시 Dynamic Input을 설정할 수 있습니다.
Spawn Rate: Float from Curve
CurveIndex: Frac // 소수부 추출
Value: Multiply Float
A: Emitter.Age
B: 0.2 // 5초마다 한 주기
// 결과: 스폰율이 5초 주기로 커브 패턴을 반복
Dynamic Input은 편리하지만 과도한 중첩은 성능에 영향을 줄 수 있습니다. 복잡한 로직은 Scratch Pad 모듈로 분리하는 것이 디버깅과 성능 모두에 유리합니다.
핵심 요약
- Dynamic Input은 고정 값 대신 매 프레임 동적으로 계산되는 표현식입니다.
- 주요 종류: Uniform Ranged(랜덤), Float/Color from Curve(커브), Expression(인라인 HLSL)
- Curve는 NormalizedAge를 입력으로 시간에 따른 값 변화를 정의하는 핵심 도구입니다.
- HLSL Expression은 파라미터 수준에서 직접 셰이더 코드를 작성할 수 있어 빠른 프로토타이핑에 유용합니다.
- Dynamic Input은 중첩(Nesting)이 가능하여 복잡한 동작을 조합할 수 있습니다.
- 과도한 중첩은 성능 저하의 원인이 될 수 있으므로, 복잡한 로직은 Scratch Pad 모듈로 분리하세요.
도전 과제
배운 내용을 직접 실습해보세요
Scale Sprite Size 모듈에서 Uniform Ranged Float 대신 Float from Curve Dynamic Input을 사용하세요. NormalizedAge를 입력으로 받아 0에서 시작해 0.3에서 최대, 1.0에서 0이 되는 커스텀 커브를 만드세요.
Select Dynamic Input을 사용하여 파티클의 나이가 절반 이하일 때와 이상일 때 서로 다른 색상을 적용하세요. If 노드 대신 Select를 사용하면 Lerp 없이도 단계적 전환이 가능합니다.
Dynamic Input을 여러 단계로 중첩하여 복잡한 동작을 만드세요: Random Range -> Multiply by Curve -> Add Uniform Noise. 이를 활용하여 반딧불이 같은 불규칙한 발광 패턴을 구현하세요.