Dynamic parameter contract

블루프린트 값과 Niagara 업데이트 책임을 분리해서 설계한다

원본 속도, 매핑된 스케일, Niagara 내부 모듈 입력을 같은 이름으로 섞으면 튜닝 기준이 흔들린다. Blueprint는 필요한 값을 계산해 User Parameter에 전달하고, Niagara는 Spawn과 Update 단계에서 그 값을 소비한다.

Blueprint 노드는 값의 출처를 만들고, Niagara는 소비 위치를 나눈다

node pipeline
Character Speed

Blueprint Event

캐릭터 이동 값, 타격 이벤트, 거리 같은 게임 상태를 읽는다.

Map / Clamp

Effect Scale 변환

원본 값을 화면 효과 단위로 줄이고 범위를 고정한다.

Set Niagara Variable

User.DustScale

Blueprint가 정확한 이름과 타입으로 User Parameter를 갱신한다.

User Parameter Store

Niagara Graph 입력

모듈은 같은 값을 읽되 Spawn과 Update 책임을 분리한다.

Emitter / Spawn

태어나는 순간의 값

초기 크기, 초기 속도, 스폰율처럼 새 파티클 생성 조건에 쓴다.

Particle Update

살아있는 동안의 값

색, 스케일, 위치 오프셋처럼 매 프레임 변할 수 있는 상태에 쓴다.

1. Read

게임 상태 읽기

속도, 체력, 타겟 위치처럼 게임 로직에서 나온 원본 값을 가져온다.

2. Map

효과 단위로 변환

Map Range Clamped, Curve, 보간으로 화면에 쓸 범위로 줄인다.

3. Set

User Parameter 전달

이름과 타입이 정확한 Set Niagara Variable 노드를 사용한다.

4. Consume

Spawn/Update에서 소비

생성량은 Emitter/Spawn, 살아있는 파티클 변화는 Particle Update 책임으로 둔다.

5. Verify

공간과 비용 확인

Local/World Space, 호출 빈도, 시뮬레이션, 렌더링 비용을 따로 확인한다.

Event Tick

프레임마다 화면 반응이 필요한 값에만 쓴다. 값이 변하지 않으면 전달을 생략하거나 상한을 둔다.

Event

OnHit, OnTakeDamage처럼 상태가 바뀐 순간만 필요하면 이벤트 전달이 더 명확하다.

Timer

일정 간격으로 충분한 값에 사용한다. Timer는 비동기 처리가 아니라 게임 스레드의 예약 실행으로 이해한다.

Data Interface

액터, 메시, 본 정보처럼 Niagara가 직접 참조할 데이터에 유리할 수 있지만 샘플링 비용과 제약을 확인한다.

비용은 Blueprint 호출, Niagara 시뮬레이션, 렌더링을 나눠 본다

공간 기준

  • 발먼지처럼 태어난 입자가 월드에 남아야 하면 World Space가 자연스러운 경우가 많다.
  • 오라나 무기 부착 효과처럼 계속 따라가야 하면 Local Space를 검토한다.

시간 기준

  • Fixed timestep은 Niagara 스텝 기준이며 BP 전달 빈도는 따로 정한다.
  • 스폰 보간은 User 보간이 아닌 품질/비용 옵션이다.

상태 전환

  • 매 Tick Activate/Deactivate를 반복하지 말고 상태가 바뀔 때만 호출한다.
  • 지속 효과는 스폰율을 낮추거나 사용자 값으로 강도를 조절하는 방식을 비교한다.