안동민 개발노트

본문 시작

커스텀 머티리얼과의 통합

나이아가라에서 계산한 파티클 속성을 커스텀 머티리얼에 전달해 속도에 따라 발광 강도가 달라지는 표현을 구현합니다.

색상과 알파 외에도 파티클별 속력, 수명 비율, 사용자 정의 값을 머티리얼에 전달할 수 있습니다. 예를 들어 속력으로 발광 강도를, 충돌에서 계산한 값으로 패턴을, 파티클별 난수로 노이즈 모양을 조절합니다.

Niagara와 Material 사이의 전달 경로

머티리얼에서 임의의 Particles.* 이름을 입력하면 모든 속성을 읽어 주는 공통 노드를 가정해서는 안 됩니다. 이 실습은 Dynamic Material Parameter와 Renderer Binding을 사용합니다.

Niagara 모듈에서 표시할 값을 계산합니다. 사용자 정의 속성이 필요하다면 먼저 만들고 기록합니다. CustomFloat라는 속성이 모든 이미터에 자동으로 존재하는 것은 아닙니다.

Particles.DynamicMaterialParameter의 네 성분에 값을 기록합니다. 한 묶음은 Float 4개이며, 벡터·색상 데이터를 전달할 때 각 성분의 의미를 정합니다.

Sprite Renderer의 Dynamic Material Binding이 이 속성을 읽는지 확인합니다. 추가 묶음은 Dynamic Material 1/2/3 Binding과 대응하는 인덱스를 사용합니다.

머티리얼에 DynamicParameter 노드를 추가하고 같은 Parameter Index를 선택합니다. 아래 예제는 인덱스 0의 첫 번째 출력(Param1/R)을 사용합니다. 출력 표시 이름을 바꾸는 것만으로 임의의 Niagara 속성이 자동 바인딩되지는 않습니다.

속력의 계산과 머티리얼 채널 바인딩
속력의 계산과 머티리얼 채널 바인딩Niagara가 속력 배율을 Vector4의 첫 성분에 기록하고 Renderer가 전달합니다. 머티리얼의 DynamicParameter 첫 출력이 발광 배율이 됩니다.Niagara 계산Length(Velocity) × 0.01DynamicMaterialParameter.x 기록Sprite RendererDynamic Material BindingMaterial · Index 0DynamicParameter 첫 출력RGB × 전달된 배율Emissive Color

채널의 의미와 인덱스를 양쪽에서 맞춥니다. 이름만 같은 임의의 파티클 속성이 머티리얼에 자동 전달되는 구조가 아닙니다.

직접 해보기: 속력에 비례하는 발광

NS_BasicSpawn을 복제하고 머티리얼 이름은 M_VelocityGlow로 정합니다.

나이아가라 시스템 설정

Emitter State를 활성 상태로 유지하고 Emitter Update의 Spawn Rate를 100으로 둡니다. Particle Spawn의 Initialize Particle에서 Lifetime을 1~2초, Sprite Size를 50, Color를 RGBA (1,1,1,1)로 정합니다.

Particle Spawn의 Add Velocity에서 X/Y는 0, Z는 200~500 cm/s 범위로 설정합니다. 초기 속도를 Particle Update에서 매 틱 더하지 않습니다. Particle Update에는 Particle State와 Solve Forces and Velocity를 두고 수명 종료 시 제거되게 합니다.

solver 뒤에 Particle Update용 Scratch Pad 모듈을 추가합니다. Map Get으로 Particles.Velocity를 읽고 Length로 속력을 구한 뒤 0.01을 곱합니다. 이 실습의 발광 배율은 속력(cm/s) × 0.01입니다.

Map Set으로 Particles.DynamicMaterialParameter를 (발광 배율, 1, 1, 1)로 기록합니다. 입력 맵을 Map Set에서 Output Module로 연결합니다. 스폰 직후에도 기본값이 명확하도록 Particle Spawn에서 이 Vector4를 (1,1,1,1)로 초기화합니다. 같은 속성을 쓰는 다른 모듈은 결과를 덮어쓰지 않게 합니다.

커스텀 머티리얼 생성 및 설정

새 Material M_VelocityGlow를 만들고 Blend Mode를 Additive, Shading Model을 Unlit으로 설정합니다.

Particle Color, DynamicParameter(Index 0), Multiply 노드를 추가합니다. DynamicParameter의 첫 번째 출력을 발광 배율로 사용합니다.

Particle Color.RGB × 발광 배율을 Emissive Color에, Particle Color의 Alpha를 Opacity에 연결합니다. 단일 프레임 텍스처를 쓰려면 이전 절처럼 RGB와 Alpha에 각각 텍스처 채널을 곱합니다.

머티리얼을 저장하고 Sprite Renderer에 할당합니다. Dynamic Material Binding이 Particles.DynamicMaterialParameter인지 확인합니다. Color Binding도 Particles.Color로 맞춥니다.

힘과 저항이 없다면 각 파티클은 초기 속력을 유지하므로 생존 중 밝기도 일정할 것으로 예상됩니다. 초기 Z 속력이 다른 입자끼리는 배율이 달라집니다. “위로 이동하므로 정점에서 느려진다”는 결과는 중력 없이 발생하지 않습니다.

선택 실습으로 solver 앞에 Gravity Force를 추가해 아래 방향 가속도를 적용해 보세요. 수직 운동의 정점 부근에서는 속력이 작아져 어두워지고, 낙하하며 속력이 커지면 다시 밝아지는 것이 예상됩니다. 발광이 과하면 단위를 유지한 채 배율과 의도한 상한을 조절합니다.

전달할 값과 비용 확인

  • Float는 한 채널, Vector3는 세 채널을 사용하도록 성분 배치를 문서화합니다. Color와 데이터 제어값을 혼동하지 않습니다.
  • User.* 값은 외부 입력입니다. 같은 이름을 머티리얼에 붙이는 것만으로 연결되지 않으며 Niagara 계산과 바인딩 경로를 거쳐야 합니다.
  • 머티리얼 인스턴스가 실제 Renderer에 할당됐는지, 바인딩 인덱스와 채널이 맞는지부터 확인합니다.
  • 파티클별 계산과 픽셀별 계산은 실행 빈도가 다릅니다. 필요 없는 노이즈·텍스처 샘플을 줄이고 목표 장면에서 비용을 비교합니다.

전달 규칙은 Epic의 DynamicParameter 설명과 Renderer Binding 참조를 참고합니다.