본문 바로가기

파티클 업데이트 모듈 소개

매 프레임 속도·중력·색상·크기·노이즈 힘을 갱신하고 Solve Forces와 모듈 순서가 움직임에 주는 영향을 이해합니다.

스폰 모듈의 기본 사용법에서 파티클을 언제 몇 개 만들지 정했다면, 이제 만들어진 파티클이 살아 있는 동안 어떻게 변할지를 다룰 차례입니다. 이 일을 하는 것이 이미터의 Particle Update 그룹에 들어가는 모듈입니다. 그림을 그릴 때 스케치 위에 색을 입히고 명암을 더해 생동감을 주는 것처럼, 스폰 모듈이 잡아 둔 입자에 움직임과 색, 크기의 변화를 더합니다. 이 글에서는 자주 쓰는 업데이트 모듈의 역할을 살펴보고, 모듈의 순서와 데이터의 의존 관계가 결과에 어떤 영향을 주는지 정리합니다.


위에서 아래로 실행되는 Particle Update

스폰 모듈이 파티클의 탄생을 정한다면, 업데이트 모듈은 파티클의 삶을 정합니다. 파티클이 살아 있는 동안 이 모듈들은 틱마다 위치와 속도, 색, 크기, 회전 같은 속성을 계산해 바꿉니다. 덕분에 파티클은 생겼다가 사라지는 데서 그치지 않고, 움직이고 변하는 모습을 보여 줄 수 있습니다.

Particle Update 그룹에 넣은 모듈은 위에서 아래로 차례로 실행되므로, 순서가 결과를 바꿉니다. 예를 들어 Gravity Force가 힘을 쌓아 두면, 그 아래의 Solve Forces and Velocity가 쌓인 힘을 속도와 위치에 반영합니다. 순서가 뒤바뀌면 힘이 위치 계산에 들어가지 못해 예상과 다른 결과가 나옵니다. 또 처음 한 번 주는 속도는 Particle Spawn에, 계속 작용하는 가속은 힘 모듈로 나누어 두면 스택을 읽는 사람이 의도를 알기 쉽습니다.


자주 쓰는 업데이트 모듈

Add Velocity

Add Velocity는 주로 Particle Spawn에서 초기 속도를 더할 때 씁니다. 주요 입력인 Velocity는 X, Y, Z의 3차원 벡터로, 더할 속도의 방향과 크기를 정합니다. 위쪽(+Z)으로 속도를 주면 솟아오르는 분수를, 아래쪽(-Z)으로 주면 떨어지는 빗방울을 만들 수 있습니다.

쓰는 버전과 설정에서 이 모듈을 Particle Update에 둘 수 있다면, 실행될 때마다 속도를 더하는지와 틱 사이의 시간 간격을 반영하는지를 모듈에서 확인해야 합니다. 일정한 속도로 움직이는 것과 틱마다 속도를 더해 점점 빨라지는 것은 다른 결과이기 때문입니다.

Gravity Force

Gravity Force는 파티클에 중력처럼 계속 작용하는 힘을 줍니다. 이 힘이 시간이 지나며 파티클의 속도를 바꿉니다. 주요 입력인 Gravity는 3차원 벡터로 중력의 방향과 세기를 정하며, 지구의 중력을 흉내 내려면 보통 -Z 방향에 값을 줍니다. 폭발 뒤 땅으로 떨어지는 파편이 대표적인 예입니다.

연기나 증기처럼 위로 떠오르는 효과는 중력만으로 만들 수 없습니다. 위쪽으로 미는 힘으로 부력 같은 느낌을 연출하고, 공기 저항을 주는 Drag 같은 모듈을 함께 써야 합니다. Gravity Force가 뜨거운 공기의 부력을 저절로 계산해 주지는 않습니다.

Scale Color

Scale Color는 초기 색의 RGB와 Alpha에 각각 배율을 곱합니다. 이 배율 입력을 입자의 수명 진행률(NormalizedAge)을 읽는 커브에 연결하면, 수명에 따라 색이 바뀌는 효과가 됩니다. 처음에는 노랗다가 점점 붉어지고 마지막에 알파가 낮아져 사라지는 불꽃이나, 화려한 색으로 시작해 점점 투명해지는 마법 효과가 그 예입니다. 입자가 늙어 가는 모습이나 사라지는 모습을 보여 주기에 알맞습니다.

배율 입력에는 쓰는 모듈의 RGB와 Alpha 입력 자료형에 맞는 커브를 고릅니다. 또 이 모듈이 초기 색에 곱하는 배율인지, 색을 직접 쓰는 Color 모듈인지를 구분해야 합니다.

Scale Sprite Size

Scale Sprite Size는 초기 스프라이트 크기에 배율을 곱합니다. 배율 입력인 Scale Factor에 Vector2 From Curve를 연결하고 NormalizedAge를 커브의 입력으로 쓰면, 수명에 따라 크기가 바뀝니다. 피어오르며 점점 커지다가 사라질 때 작아지는 연기 덩어리나, 터지기 직전에 커졌다가 사라지는 물방울을 이렇게 만듭니다.

Curl Noise Force

Curl Noise Force는 파티클에 불규칙하고 유기적인 움직임을 주어 연기나 구름, 유체 같은 자연스러운 흐름을 흉내 냅니다. 종잡을 수 없는 바람이 입자를 흔드는 것과 비슷하지만, 실제로는 미리 정해진 노이즈 필드에서 힘을 읽어 오는 것이라 유체 전체를 계산하는 것은 아닙니다. 노이즈 힘의 세기는 Noise Strength로, 패턴의 촘촘함은 Noise Frequency로 조절하는데, 주파수를 높일수록 소용돌이 하나의 크기가 작아집니다. 자연스럽게 휘감기는 연기나 안개, 물이나 용암의 흐름 같은 효과에 씁니다.

Solve Forces and Velocity

Solve Forces and Velocity는 앞에서 더한 힘과 속도를 모아 입자의 최종 속도와 위치를 계산합니다. 그래서 힘을 쌓는 모듈들보다 뒤에 두어야 합니다. 다만 계산된 위치나 속도를 읽는 후처리 모듈이 그 뒤에 올 수 있으므로, 반드시 스택의 맨 마지막에 있어야 하는 것은 아닙니다. 이 모듈이 빠지면 속도와 힘이 위치에 반영되지 않아 파티클이 멈춰 있거나 이상하게 움직일 수 있습니다.


힘의 경로와 나이의 경로

움직임과 시각 속성의 의존 관계

NIAGARA · CH3-2

힘과 나이 입력이 서로 다른 속성을 갱신합니다

힘은 속도·위치 계산에, 나이 진행률은 색·크기 Curve 입력에 쓰입니다. 화살표는 이 예의 데이터 의존성을 표시하며 전체 스택 실행 순서를 뜻하지 않습니다.

움직임과 시각 속성의 의존 관계힘을 누적한 후 위치로 적분하는 경로와 나이에 따라 색과 크기를 계산하는 경로가 렌더러에서 소비됩니다.힘 누적Gravity · Noise나이 진행률NormalizedAgeSolve Forces속도 · 위치 적분Position색 · 크기 배율Curve 입력Color · SpriteSizeRenderer갱신된 속성을 읽음
힘과 나이의 두 데이터 의존 경로desktop과같은5노드4관계:힘→Solve속도위치,NormalizedAge→색크기Curve,두경로의속성을Renderer가읽는다.세로배치는전체실행순서나Solve→나이경로가아니다.움직임 경로힘 누적Gravity · NoiseSolve Forces속도 · 위치 적분Position시각 속성 경로나이 진행률NormalizedAge색 · 크기 배율Curve 입력Color · SpriteSizeRenderer갱신된 속성 읽기두 경로의 결과를 사용전체 실행 순서 아님

힘을 누적한 뒤 Solve Forces로 속도·위치를 적분합니다. Scale Color/Scale Sprite Size는 초기 색·크기와 배율을 함께 사용합니다. Collision·후처리나 이후 Position 쓰기 모듈의 의존성은 실제 스택에서 따로 확인합니다.

위 그림은 업데이트 모듈이 다루는 두 가지 데이터 경로를 보여 줍니다. 위쪽의 움직임 경로에서는 Gravity Force나 노이즈 같은 모듈이 힘을 쌓고, Solve Forces and Velocity가 그 힘으로 속도와 위치를 계산해 Position 속성에 씁니다. 아래쪽의 시각 속성 경로에서는 나이 진행률인 NormalizedAge가 커브의 입력이 되어 색과 크기의 배율을 정하고, 그 결과가 Color와 SpriteSize 속성에 쓰입니다. 두 경로의 결과는 모두 렌더러가 읽어 화면에 그립니다.

그림의 화살표는 이 예에서 어떤 값이 어떤 값에 쓰이는지를 나타낸 데이터 의존 관계이며, 스택 전체의 실행 순서를 뜻하지 않습니다. 그림에서 두 경로가 위아래로 놓여 있다고 Solve 다음에 나이 경로가 실행된다는 뜻도 아닙니다. 그림 아래의 설명처럼 Scale Color와 Scale Sprite Size는 초기 색과 크기를 배율과 함께 쓰며, 충돌이나 후처리, 그 뒤에서 Position을 쓰는 모듈의 의존 관계는 실제 스택에서 따로 확인해야 합니다.

배율 모듈의 계산을 숫자로 따라가 보겠습니다. 색과 크기를 정하는 다른 모듈을 모두 끈 상태에서, 초기 Alpha가 1인 입자에 Scale Color의 Alpha 배율 0.4를 적용하면 Alpha는 1 × 0.4 = 0.4가 됩니다. 초기 스프라이트 크기가 (10, 20)이고 두 축의 배율이 모두 2라면 크기는 (20, 40)이 됩니다. 여기서 커브의 출력은 곱할 배율이고, 수명 진행률은 그 커브의 어느 지점을 읽을지 정하는 입력입니다. Alpha가 바뀌었더라도 머티리얼이 그 값을 Opacity에 연결하지 않았다면 화면의 투명도는 같은 방식으로 바뀌지 않을 수 있습니다.


업데이트 모듈을 다루는 방법

모듈의 순서는 논리적인 흐름에 맞게 둡니다. 힘을 더하는 모듈은 Solve Forces and Velocity보다 위에 두는 식입니다. 충돌을 맡는 Collision처럼 앞뒤에 놓일 모듈이 정해진 경우에는 에디터가 보여 주는 의존 관계 안내를 따릅니다.

Scale Color나 Scale Sprite Size처럼 시간에 따라 값이 바뀌는 모듈은 커브를 함께 씁니다. 입력 옆의 작은 화살표를 눌러 Float From Curve 같은 커브 동적 입력을 고르면 커브 편집기에서 모양을 바꿀 수 있습니다. 일부 모듈의 입력은 기본적으로 상위 값이나 시스템 속성을 따르지만, 필요하면 그 모듈에서 값을 따로 정해 덮어쓸 수 있습니다.

값을 조정할 때는 미리보기 패널에서 변화를 바로 확인합니다. 특정 속성이 어떻게 바뀌는지 자세히 보고 싶다면 나이아가라 디버거로 입자의 속성 값을 들여다보는 것도 도움이 됩니다.


값이 바뀌지 않을 때

속도는 바뀌는데 위치가 멈춰 있다면 위치를 계산하는 Solve Forces and Velocity가 있는지와, 그 뒤에서 Position을 덮어쓰는 모듈이 있는지 확인합니다. 색이 예상과 다르면 초기 색과 배율, 그 아래쪽의 Color 모듈, 그리고 머티리얼의 Particle Color 연결을 순서대로 봅니다. 커브가 움직이지 않고 한 값에 멈춰 있다면, Particle State가 나이를 갱신하고 있는지와 커브의 입력이 어떤 시간을 읽는지 확인합니다. 노이즈 움직임이 지나치게 크면 힘의 세기와 패턴의 촘촘함을 낮은 값부터 하나씩 비교합니다.


정리

  • Particle Update 그룹의 모듈은 살아 있는 입자를 대상으로 틱마다 위에서 아래로 실행되므로 순서가 결과를 바꿉니다.
  • Gravity Force나 Curl Noise Force 같은 힘 모듈은 힘을 쌓고, Solve Forces and Velocity가 이를 속도와 위치로 바꾸므로 힘 모듈 뒤에 둡니다.
  • Scale Color와 Scale Sprite Size는 초기 색과 크기에 배율을 곱하며, 배율을 NormalizedAge 커브에 연결하면 수명에 따라 바뀝니다.
  • 초기 속도는 Particle Spawn에, 계속 작용하는 가속은 힘 모듈로 나누어 두면 스택의 의도를 읽기 쉽습니다.
  • 값이 바뀌지 않으면 위치 계산 모듈과 덮어쓰는 모듈, 머티리얼 연결, 나이 갱신을 차례로 확인합니다.

연습 문제

1. 나이 3초의 Alpha와 크기

수명이 4초로 고정된 입자의 나이가 3초입니다. 이 시점의 Alpha 배율은 0.25, 두 스프라이트 크기 축의 배율은 0.5이며, 초기 Alpha는 0.8, 초기 크기는 (12, 8)입니다. NormalizedAge와, 배율을 적용한 뒤의 Alpha와 크기는 얼마일까요? 아래쪽의 다른 Color 모듈이 Alpha를 1로 직접 덮어쓴다면 최종 Alpha는 얼마일까요?

해설 보기

NormalizedAge는 나이를 수명으로 나눈 3 ÷ 4 = 0.75입니다. Alpha는 0.8 × 0.25 = 0.2, 크기는 (12 × 0.5, 8 × 0.5) = (6, 4)입니다.

그 뒤에 다른 모듈이 Alpha를 1로 직접 쓰면 최종 Alpha는 1입니다. 같은 그룹의 모듈은 위에서 아래로 실행되므로, 마지막에 값을 쓴 모듈의 결과가 남습니다. 그래서 순서와 함께 각 모듈이 실제로 읽고 쓰는 속성을 확인해야 하며, 여기서는 크기를 정하는 다른 모듈은 없다고 가정했습니다.

2. 떠오르지 않는 연기

연기가 위로 피어오르게 하려고 Gravity Force의 값을 0으로 바꿨더니, 연기가 떠오르지 않고 생긴 자리에 머뭅니다. 무엇이 빠졌을까요?

해설 보기

중력을 0으로 하면 아래로 끌어당기는 힘만 사라질 뿐, 위로 미는 힘이 생기지는 않습니다. Gravity Force는 부력을 저절로 계산해 주지 않습니다.

연기를 띄우려면 Particle Spawn에서 위쪽으로 초기 속도를 주거나, 위쪽으로 계속 미는 힘을 더하고, Drag 같은 모듈로 속도가 서서히 줄게 만듭니다. 그리고 이 힘과 속도가 위치에 반영되도록 Solve Forces and Velocity가 힘 모듈들 뒤에 있는지 확인합니다.

3. 커브가 멈춘 색 변화

Scale Color의 Alpha 배율을 수명에 따라 1에서 0으로 내려가는 커브로 만들었는데, 입자의 투명도가 전혀 바뀌지 않습니다. 확인할 곳을 순서대로 적어 보세요.

해설 보기

먼저 커브의 입력이 NormalizedAge처럼 나이에 따라 바뀌는 값을 읽는지, 그리고 Particle State가 입자의 나이를 갱신하고 있는지 확인합니다. 입력이 고정된 값이라면 커브는 한 지점만 읽게 됩니다.

다음으로 Scale Color보다 아래에서 Alpha를 다시 쓰는 Color 같은 모듈이 있는지 봅니다. 마지막으로 머티리얼이 Particle Color의 알파를 Opacity에 쓰고 반투명 블렌드 모드인지 확인합니다. 알파 값이 바뀌어도 머티리얼이 그 값을 쓰지 않으면 화면은 바뀌지 않습니다.

각 모듈의 역할과 의존 관계는 Epic의 Particle Update 그룹 레퍼런스에서 확인할 수 있습니다.

다음 글 간단한 이벤트 핸들러 설정에서는 한 이미터에서 일어난 충돌이나 소멸을 다른 이미터가 받아 새 입자를 만드는 이벤트 핸들러를 설정해 봅니다.