안동민 개발노트

본문 시작

사용자 정의 모듈

Module Script에 입출력 매개변수와 파티클 속성 계산을 정의해 여러 시스템에서 재사용할 수 있는 사용자 모듈을 만듭니다.

지금까지 나이아가라의 스폰, 업데이트, 렌더링 모듈의 기본 사용법을 익히셨습니다.

이 모듈들만으로도 다양한 효과를 만들 수 있지만, 때로는 언리얼 엔진에서 기본으로 제공하는 모듈만으로는 원하는 복잡하거나 독특한 효과를 구현하기 어려울 때가 있습니다.

이럴 때 필요한 것이 바로 사용자 정의 모듈(Custom Module)입니다.

사용자 정의 모듈은 나이아가라의 확장성을 보여주는 핵심 기능 중 하나입니다.

여러분이 직접 파티클의 속성을 제어하는 로직을 만들고, 이를 재사용 가능한 모듈 형태로 저장하여 다른 나이아가라 시스템에서도 활용할 수 있게 해줍니다.

마치 레고 블록을 직접 디자인하고 생산하여, 나만의 특별한 작품을 만드는 것과 비슷하다고 할 수 있습니다.


사용자 정의 모듈이란?

사용자 정의 모듈은 특정 기능을 수행하도록 비주얼 스크립트(Visual Script) 형태로 직접 제작하는 나이아가라 모듈입니다.

이는 블루프린트와 유사하게 노드 기반의 시각적인 프로그래밍 방식으로 이루어져 있어, C++ 코딩 지식 없이도 복잡한 파티클 로직을 구현할 수 있습니다.

사용자 정의 모듈을 활용하면 다음과 같은 장점을 얻을 수 있습니다.

  • 높은 유연성: 기본 모듈로는 불가능했던 독특한 파티클 동작이나 수학적 계산을 직접 구현할 수 있습니다.
  • 재사용성: 한 번 만든 사용자 정의 모듈은 여러 이미터나 나이아가라 시스템에서 재사용할 수 있어 작업 효율을 높입니다.
  • 깔끔한 워크플로우: 복잡한 파티클 로직을 하나의 모듈로 캡슐화하여 이미터의 Particle Update 섹션을 더 깔끔하게 유지할 수 있습니다.

사용자 정의 모듈 생성 및 편집 과정

간단한 예시를 통해 사용자 정의 모듈을 만들고 사용하는 과정을 살펴보겠습니다.

여기서는 파티클의 수명에 따라 특정 방향으로 지그재그 움직임을 추가하는 간단한 사용자 정의 모듈을 만들어볼 것입니다.

새로운 나이아가라 모듈 에셋 생성
  • 콘텐츠 브라우저(Content Browser)에서 원하는 폴더를 선택하고 우클릭합니다.
  • FX > Niagara Module을 선택합니다.
  • 새 모듈의 이름을 NCM_ZigzagMovement (Niagara Custom Module의 약자)와 같이 지정합니다.
  • NCM_ZigzagMovement 에셋을 더블 클릭하여 나이아가라 모듈 에디터(Niagara Module Editor)를 엽니다. 이 에디터는 일반 나이아가라 에디터와 유사하지만, 모듈 로직을 만드는 데 집중되어 있습니다.
Parameter Map과 입출력 설정

모듈 그래프는 Input Map에서 Output Module로 이어지는 Parameter Map을 사용합니다. Map Get에서 현재 입자의 NormalizedAge·Velocity와 모듈 입력을 읽고, Map Set에서 Particles.Velocity를 씁니다.

  • Float 입력 ZigzagStrength: X축 속도 진폭(cm/s), 기본값 0.
  • Float 입력 ZigzagFrequency: 한 수명 동안 진행할 위상(라디안), 기본값 6.283185. 이 값은 초당 진동수(Hz)가 아닙니다.
  • 입력은 해당 버전의 모듈 입력 네임스페이스(Input/Module)에 만들며 User Parameter로 자동 노출되는 것은 아닙니다.
스크립트 에디터에서 로직 구현
  1. Map Get에서 Particles.NormalizedAge와 Particles.Velocity를 읽습니다.
  2. NormalizedAge에 ZigzagFrequency를 곱하고 라디안 기준 Sine을 계산합니다.
  3. Sine 결과에 ZigzagStrength를 곱해 X축 속도를 만듭니다.
  4. 현재 Velocity의 Y·Z는 유지하고 X만 계산값으로 교체한 Vector를 Map Set의 Particles.Velocity에 연결합니다. Parameter Map은 Input Map → Map Set → Output Module로 이어집니다.
phase = Particles.NormalizedAge * ZigzagFrequency
newX = sin(phase) * ZigzagStrength
Particles.Velocity = (newX, previousVelocity.y, previousVelocity.z)

위 식은 노드 연결을 설명하는 의사 코드입니다. 이전 X에 매 틱 값을 더하면 누적 가속이 되므로 이 예제에서는 X를 덮어씁니다. Strength가 0이면 기존 X를 보존하는 것이 아니라 X를 0으로 만듭니다. Particle State로 나이를 갱신한 뒤, Solve Forces and Velocity 전에 배치해 위치로 적분합니다. 초기 X 속도를 유지해야 하는 다른 효과에서는 기준 속도 저장과 합성 규칙을 별도로 설계해야 합니다.

모듈 저장: NCM_ZigzagMovement 에셋을 저장합니다. (Ctrl + S)


사용자 정의 모듈 사용하기

이제 만든 사용자 정의 모듈을 기존 나이아가라 시스템에 적용해 보겠습니다.

이전에 만들었던 NS_BasicSpawn (또는 다른 나이아가라 시스템)을 엽니다.

개요(Overview) 패널에서 파티클 업데이트 효과를 추가하고 싶은 이미터를 선택합니다.

Particle Update 섹션 아래의 + 버튼을 클릭합니다.

검색창에 여러분이 만든 모듈 이름 NCM_ZigzagMovement를 검색하여 추가합니다.

모듈이 추가되면, 디테일(Details) 패널에서 여러분이 정의했던 ZigzagStrength와 ZigzagFrequency 속성을 볼 수 있습니다.

이 값들을 조절하면서 뷰포트에서 파티클의 움직임이 어떻게 변하는지 확인해 보세요.

  • ZigzagStrength는 좌우 속도 진폭이며, 실제 이동 폭은 위상 진행 속도와 Lifetime에도 좌우됩니다. ZigzagFrequency = 2π는 한 수명에 사인 한 주기입니다. 다른 힘·Drag·속도 작성자는 끄고 먼저 기준 거동을 비교합니다.

사용자 정의 모듈 활용 팁

  • 주석 달기: 복잡한 스크립트를 만들 때는 C 키를 눌러 주석 상자를 추가하여 각 부분의 역할을 설명하는 것이 좋습니다.
  • 입력 매개변수 사용: 실제 사용자가 바꿔야 하는 값만 입력으로 노출하고 이름·단위·기본값을 설명합니다.
  • 계산 순서: 스크립트 에디터에서 노드 간의 데이터 흐름과 계산 순서를 명확히 이해하는 것이 중요합니다.
  • 디버깅: 문제가 발생하면 디버거를 사용하여 파티클의 속성 변화를 추적하고, 어떤 노드에서 문제가 발생했는지 파악하세요.

모듈의 사용 범위를 Particle Update로 설정하고 라이브러리 노출·카테고리·설명을 확인합니다. 다른 이미터에 넣을 때는 X 속도를 덮어쓰는 책임과 선행 Particle State, 후행 위치 적분 조건을 함께 전달합니다.

Scratch Pad로 먼저 만든 경우에는 다른 에셋에서 재사용할 모듈 에셋으로 내보낼 수 있습니다. 공식 Scratch Pad 예제는 Map Get과 Map Set으로 읽기와 쓰기를 구분합니다.