PART 2 · 강의 2/3

Dynamic Input

고정 값 대신 동적으로 계산되는 입력을 활용하여 복잡한 이펙트 동작을 만듭니다.

01

Dynamic Input 개념

정적 값에서 동적 표현식으로

Niagara 모듈의 파라미터에 단순한 고정 값 대신 Dynamic Input을 설정할 수 있습니다. 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 중첩 가능.

02

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 색상, 초과 스케일 등
03

HLSL Expression

인라인 코드로 복잡한 표현식 작성

파라미터 드롭다운에서 Expression을 선택하면 인라인 HLSL 코드를 직접 작성할 수 있습니다. 별도의 Scratch Pad 모듈을 만들지 않고도 간단한 수학 연산을 적용할 수 있어 매우 편리합니다.

HLSL Expression 예제들
// 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)
Expression에서 접근 가능한 변수

HLSL Expression에서는 현재 스코프의 모든 파라미터에 접근 가능합니다. Particles.Position, Emitter.Age, Engine.DeltaTime 등을 네임스페이스 포함 전체 이름으로 사용하세요. VM(CPU)과 HLSL(GPU) 함수 모두 사용 가능합니다.

04

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을 설정할 수 있습니다.

중첩 Dynamic Input 구조
Spawn Rate: Float from Curve CurveIndex: Frac // 소수부 추출 Value: Multiply Float A: Emitter.Age B: 0.2 // 5초마다 한 주기 // 결과: 스폰율이 5초 주기로 커브 패턴을 반복
성능 고려사항

Dynamic Input은 편리하지만 과도한 중첩은 성능에 영향을 줄 수 있습니다. 복잡한 로직은 Scratch Pad 모듈로 분리하는 것이 디버깅과 성능 모두에 유리합니다.

SUMMARY

핵심 요약

  • Dynamic Input은 고정 값 대신 매 프레임 동적으로 계산되는 표현식입니다.
  • 주요 종류: Uniform Ranged(랜덤), Float/Color from Curve(커브), Expression(인라인 HLSL)
  • Curve는 NormalizedAge를 입력으로 시간에 따른 값 변화를 정의하는 핵심 도구입니다.
  • HLSL Expression은 파라미터 수준에서 직접 셰이더 코드를 작성할 수 있어 빠른 프로토타이핑에 유용합니다.
  • Dynamic Input은 중첩(Nesting)이 가능하여 복잡한 동작을 조합할 수 있습니다.
  • 과도한 중첩은 성능 저하의 원인이 될 수 있으므로, 복잡한 로직은 Scratch Pad 모듈로 분리하세요.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Dynamic Input으로 커브 구동

Scale Sprite Size 모듈에서 Uniform Ranged Float 대신 Float from Curve Dynamic Input을 사용하세요. NormalizedAge를 입력으로 받아 0에서 시작해 0.3에서 최대, 1.0에서 0이 되는 커스텀 커브를 만드세요.

실습 2: 조건부 Dynamic Input

Select Dynamic Input을 사용하여 파티클의 나이가 절반 이하일 때와 이상일 때 서로 다른 색상을 적용하세요. If 노드 대신 Select를 사용하면 Lerp 없이도 단계적 전환이 가능합니다.

심화 과제: 중첩 Dynamic Input 체인

Dynamic Input을 여러 단계로 중첩하여 복잡한 동작을 만드세요: Random Range -> Multiply by Curve -> Add Uniform Noise. 이를 활용하여 반딧불이 같은 불규칙한 발광 패턴을 구현하세요.