기본적인 이펙트 제작 방법
불꽃·연기·폭발 효과의 이미터 구성과 Spawn·색상·크기·힘·SubUV 설정을 공통 제작 순서에 따라 조합합니다.
앞의 장들에서 나이아가라의 모듈과 기능, 블루프린트와의 연결을 하나씩 익혔습니다. 이제 이것들을 모아 게임에서 실제로 쓰는 기본 효과를 만들어 볼 차례입니다. 효과를 만드는 일은 결국 모듈과 파라미터를 조합해 원하는 화면을 만드는 과정이지만, 처음부터 값을 이리저리 바꿔 보면 어디서 모양이 어긋났는지 알기 어렵습니다. 이 글에서는 대부분의 효과에 공통으로 쓰는 제작 순서를 정리하고, 불꽃과 연기, 폭발을 만들 때의 시작 값을 비교한 뒤, 모양이 바뀌는 효과에 자주 쓰는 SubUV 애니메이션의 계산을 따라가 봅니다.
효과를 만드는 공통 순서
대부분의 나이아가라 효과는 비슷한 순서로 만듭니다. 처음에는 무엇을 만들지 정합니다. 작은 불꽃인지, 짙은 연기인지, 물이 튀는 효과인지를 분명히 하고, 실제 사진이나 영상, 다른 게임의 효과 같은 참고 자료(reference)를 충분히 모읍니다. 그리고 그 효과가 어떤 요소로 이루어져 있는지, 즉 색과 모양, 움직임, 수명, 빛나는지를 나누어 분석합니다.
다음으로 나이아가라 시스템을 만들고 가장 가까운 템플릿에서 시작합니다. 쓰는 버전에 들어 있는 Fountain 이미터 같은 것이 그 예이며, 설치된 콘텐츠에 따라 템플릿 목록은 다릅니다. 그다음 생성과 초기값을 정합니다. Spawn Rate나 Spawn Burst Instantaneous로 입자가 얼마나 자주, 얼마나 많이 생길지를 정하고, Initialize Particle에서 수명과 크기, 색을 정하며, 초기 위치와 속도는 Particle Spawn의 Shape Location이나 Add Velocity 같은 모듈로 정합니다. 이 값들이 효과의 전체적인 모양과 움직임을 결정합니다.
이어서 물리와 힘을 더합니다. Gravity Force(중력), Drag(공기 저항), Curl Noise Force(난류), Linear Force(한 방향의 힘) 같은 모듈로 입자에 물리적인 움직임을 주고, Particle Update의 Solve Forces and Velocity가 이 힘을 속도와 위치로 계산하게 합니다. 충돌이 필요하다면 지원되는 Collision을 Solve 바로 앞에 둡니다.
그다음 시간에 따른 변화를 줍니다. Scale Color, Scale Sprite Size, Scale Velocity 같은 배율 모듈과 Float From Curve, Color From Curve로 입자의 수명 진행률(NormalizedAge)에 따라 색과 크기, 속도가 자연스럽게 바뀌게 합니다. 예를 들어 연기는 시간이 지나며 흐려지고 커지며, 불꽃은 밝게 타오르다 사라집니다.
그리고 렌더링을 설정합니다. Sprite Renderer나 Mesh Renderer를 고르고 효과에 맞는 머티리얼을 지정하며, 머티리얼의 블렌드 모드와 셰이딩 모델을 알맞게 정합니다. 대부분의 시각 효과는 Unlit에 Translucent나 Additive를 씁니다. 표면과 만나는 자리를 부드럽게 하려면 머티리얼의 DepthFade를 쓰고, 모션 블러를 쓴다면 렌더러의 속도 출력과 후처리 설정을 함께 확인합니다.
마지막으로 최적화와 디버깅을 하고 다듬기를 되풀이합니다. 입자 수와 수명, 복잡한 계산을 조절해 비용을 줄이고, 나이아가라 디버거와 stat Niagara로 병목을 찾습니다. 효과를 게임 레벨에 놓고 여러 각도와 조명에서 확인하며, 참고 자료와 비교해 부족한 점을 찾아 앞의 단계를 다시 거칩니다.
불꽃, 연기, 폭발의 시작 값
아래의 값은 만들기 시작할 때의 예시입니다. 각 이미터의 생성 방식과 수명을 먼저 정하고, 실제 장면에서 조정합니다.
불꽃
불꽃은 계속 타오르므로 Spawn Rate를 비교적 높게 두고, Lifetime은 0.5초에서 1.5초 사이로 짧게 둡니다. 스프라이트 크기는 10에서 30 사이에서 작게 시작해 커지게 하고, 색은 밝은 주황색과 노란색, 빨간색으로 정하며, 초기 속도는 Z축 위쪽으로 조금 주어 솟아오르게 합니다.
움직임에서는 위로 솟는 흐름을 방해하지 않도록 Gravity Force를 아주 약하게 주거나 뺍니다. 필요하다면 Curl Noise Force를 더해 불꽃이 흔들리는 불규칙한 모양을 만들고, 세기와 주파수를 조절해 원하는 느낌을 찾습니다. Drag는 약하게 주어 너무 빨리 느려지지 않게 합니다.
시간에 따른 변화로는 Scale Color로 NormalizedAge에 따라 색을 노랑에서 주황, 빨강, 검정으로 바꾸고 알파를 1에서 0으로 줄여 타오르다 사라지게 합니다. Scale Sprite Size로는 크기가 작게 시작해 커졌다가 다시 작아지게 합니다. 렌더링은 Sprite Renderer에 불꽃 텍스처를 쓰는 Additive, Unlit 머티리얼을 지정하고, 필요하면 SubUV 애니메이션을 씁니다. 주변을 밝혀야 한다면 Light Renderer를 더하되 비용에 주의합니다.
연기
연기는 밀도에 맞춰 Spawn Rate를 적당히 두고, Lifetime은 2초에서 5초 사이로 길게 둡니다. 스프라이트 크기는 20에서 시작해 100 이상까지 크게 커지게 하고, 색은 검정에서 회색, 흰색으로 이어지는 회색 계열로 정하며, 초기 속도는 Z축 위쪽으로 천천히 주어 피어오르게 합니다.
움직임에서는 떠다니는 느낌이 나도록 Gravity Force를 아주 약하게 주거나 뺍니다. 필요하다면 Curl Noise Force를 더하되, 세기는 약하게, 주파수는 불꽃보다 낮게 두어 뭉게뭉게 퍼지는 느낌을 줍니다. Drag는 속도를 줄이는 역할을 하므로, 퍼지는 모양은 초기 방향과 노이즈, 스프라이트 크기의 증가로 따로 만듭니다.
시간에 따른 변화로는 Scale Color로 색을 어두운 회색에서 밝은 회색, 투명으로 바꿔 희미해지며 사라지게 하고, Scale Sprite Size로 크기를 작게 시작해 아주 크게 키워 퍼지는 느낌을 줍니다. 렌더링은 Sprite Renderer에 가장자리가 부드러운 연기 텍스처를 쓰는 Translucent, Unlit 머티리얼을 지정하고, DepthFade를 머티리얼의 Opacity에 연결해 다른 표면과 만나는 자리를 부드럽게 합니다.
폭발
폭발은 한 번에 많은 입자를 만들어야 하므로 Spawn Burst Instantaneous가 꼭 필요합니다. Spawn Count는 100에서 500 정도로 시작하되, 입자의 역할과 대상 기기의 비용에 맞춰 낮춥니다. Lifetime은 0.5초에서 1초 사이로 아주 짧게 두고, 스프라이트 크기는 작게 시작해 폭발하듯 크게 커지게 하며, 색은 밝은 주황과 빨강, 노랑으로 정합니다. 초기 속도는 구 모양으로 아주 세게 주어 사방으로 튀어 나가게 합니다.
움직임에서는 Gravity Force를 강하게 주어 파편이 빨리 떨어지게 하고, Drag도 강하게 주어 폭발 범위 밖으로 멀리 나가지 않고 빨리 느려지게 합니다. Curl Noise Force는 약하게 주어 잔해에 작은 불규칙함을 더합니다. Collision은 표면에 반응해야 하는 파편에만 쓰고, Restitution과 Friction으로 파편이 땅에서 튕기거나 멈추게 합니다.
시간에 따른 변화로는 Scale Color로 색을 밝게 시작해 어두워지다 투명해지게 해 섬광이 사라지게 하고, Scale Sprite Size로 크기를 아주 빠르게 작게 시작해 커졌다가 작아지게 해 폭발의 팽창과 수축을 나타냅니다. 렌더링은 Sprite Renderer와 파편용 Mesh Renderer를 함께 쓰고, 불꽃과 연기, 파편 텍스처에 맞게 Additive와 Translucent, Unlit과 Default Lit을 조합합니다. 폭발 지점을 짧게 밝히려면 Light Renderer를 쓰되 비용에 주의합니다.
역할을 나누어 비교하기
네 가지 역할을 표로 비교하면 다음과 같습니다.
| 효과 | 생성 | 수명 예시 | 움직임과 표현에서 먼저 볼 것 |
|---|---|---|---|
| 불꽃 | 계속 만드는 Rate | 0.5초에서 1.5초 | 위쪽 속도, 흔들림, 짧은 발광 |
| 연기 | 계속 만드는 Rate | 2초에서 5초 | 느린 상승, 크기 증가, 알파 감쇠 |
| 폭발의 중심 | 한 번의 Burst | 0.5초에서 1초 | 빠른 팽창과 섬광 |
| 파편 | 따로 만드는 Burst | 장면에 맞춤 | 방향, 중력, 필요한 충돌 |
Scale Color와 Scale Sprite Size는 초기값에 배율을 곱한다는 점을 기억합니다. 커브에 적은 색을 그대로 쓰고 싶다면 초기 RGB를 흰색으로 두거나 Color 모듈로 색을 직접 쓰고, 크기 커브도 초기 크기에 배율을 곱한 최종 값으로 확인합니다. 한 번만 재생하는 효과는 이미터가 한 번만 반복하게 하고, Particle State의 수명 종료와 시스템의 완료를 확인합니다.
만들 때는 이미터 하나로 핵심 실루엣을 먼저 맞춘 뒤, 연기와 불씨, 파편을 역할마다 하나씩 더합니다. 같은 카메라에서 모양과 움직임, 머티리얼, 비용 가운데 가장 어긋난 항목 하나씩을 바꿔 가며 비교합니다.
SubUV 애니메이션
불꽃이나 폭발, 연기처럼 시간에 따라 모양이 바뀌는 효과에는 SubUV 애니메이션을 쓰는 머티리얼이 잘 맞습니다. 텍스처 한 장에 여러 프레임의 그림을 격자로 늘어놓고, 나이아가라가 그 프레임을 차례로 보여 주어 애니메이션처럼 보이게 하는 방식입니다.
설정할 때는 Sprite Renderer의 Sub Image Size를 시트의 열과 행 수에 맞추고, SubUV Animation 모듈로 Particles.SubImageIndex를 갱신합니다. 렌더러의 Sub Image Index 바인딩도 확인하고, 이웃한 프레임을 섞어 부드럽게 넘기려면 지원되는 Sub Image Blend 설정과 머티리얼을 함께 맞춥니다. 프레임의 범위와 재생 속도, 반복 방식은 쓰는 모듈의 입력에서 확인합니다.
시트의 크기와 프레임 값은 구분해야 합니다. 4열 4행 시트에는 그림이 4 × 4 = 16개 들어 있으므로, Sub Image Size는 (4, 4)이고 프레임을 0부터 세면 인덱스의 범위는 0에서 15입니다. 텍스처의 픽셀 해상도 (1024, 1024)를 이 칸에 넣는 것이 아닙니다.
인덱스에 소수가 들어가면 프레임 사이를 섞는 데 쓰입니다. 한 입자의 인덱스 입력이 2.25라면, 이웃 프레임 섞기를 켠 렌더러는 소수 부분 0.25를 섞는 비율로 씁니다. 그래서 이 값은 프레임 2와 3 사이의 25% 지점이라는 뜻이며, 재생 속도가 초당 2.25프레임이라는 뜻은 아닙니다. 바인딩과 머티리얼, 섞기 설정은 함께 확인합니다.
정리
- 효과는 참고 자료로 요소를 나누고, 템플릿에서 시작해 생성과 초기값, 힘, 시간에 따른 변화, 렌더링을 차례로 정한 뒤 다듬기를 되풀이하며 만듭니다.
- 불꽃은 짧은 수명과 위쪽 속도, 연기는 긴 수명과 크기 증가, 폭발은 한 번의 버스트와 강한 중력, 저항으로 시작합니다.
Scale Color와Scale Sprite Size는 초기값에 배율을 곱하므로, 커브의 값을 그대로 쓰려면 초기값이나 모듈을 맞춥니다.- SubUV는
Sub Image Size에 시트의 열과 행 수를 넣고SubUV Animation으로 인덱스를 갱신하며, 픽셀 해상도를 넣지 않습니다. - 인덱스의 소수 부분은 섞기를 켰을 때 이웃 프레임을 섞는 비율이며, 재생 속도가 아닙니다.
연습 문제
1. 2열 4행 시트
시트를 2열 4행으로 바꾸고 인덱스 입력을 4.5로 주었다고 합시다. Sub Image Size의 입력과 전체 프레임 수, 0부터 센 마지막 인덱스, 섞이는 두 프레임을 각각 구해 보세요. 섞기를 껐을 때도 같은 부드러운 전환이 될까요?
해설 보기
Sub Image Size는 (2, 4)이고, 그림은 2 × 4 = 8개이며, 마지막 인덱스는 7입니다. 이웃 프레임을 섞는 조건에서는 소수 부분 0.5에 따라 프레임 4와 5를 50%씩 씁니다.
섞기를 끄면 이런 보간은 일어나지 않으므로 같은 부드러운 전환이 되지 않습니다. 이것은 정한 입력으로 계산한 것이며, 모듈의 기본 재생 속도나 자동 반복, 실제 화면을 확인한 결과는 아닙니다.
2. 탁해진 불꽃의 색
Scale Color의 커브에 노랑에서 빨강으로 바뀌는 색을 적었는데, 불꽃이 기대보다 어둡고 탁하게 보입니다. 초기 색은 주황색 (1, 0.5, 0)입니다. 왜 그럴까요?
해설 보기
Scale Color는 커브의 색을 그대로 쓰는 것이 아니라 초기 색에 배율로 곱합니다. 초기 색이 주황색이면 노랑 (1, 1, 0)을 곱해도 (1, 0.5, 0)이 되고, 초록과 파랑 성분이 처음부터 작아 원하는 색이 나오지 않습니다.
커브의 색을 그대로 쓰고 싶다면 초기 색을 흰색 (1, 1, 1)로 두거나, Scale Color 대신 색을 직접 쓰는 Color 모듈을 씁니다.
3. 끝나지 않는 폭발
폭발 효과가 한 번 터진 뒤에도 계속 반복해서 터집니다. 무엇을 확인해야 할까요?
해설 보기
이미터의 Emitter State가 반복 재생으로 되어 있는지 확인합니다. Loop Behavior를 Once로 두어 한 번만 재생되게 하고, 템플릿에 남아 있는 Spawn Rate나 반복되는 버스트가 없는지도 봅니다.
그다음 Particle State가 수명이 다한 입자를 없애는지, 시스템 전체도 완료되도록 System State의 루프가 설정되어 있는지 확인합니다.
Sub Image Size와 Sub Image Index 바인딩, 프레임 섞기 설정은 Epic의 UNiagaraSpriteRendererProperties API 문서에서 확인할 수 있습니다.
다음 글 발자국, 물 튀김과 같은 이펙트에서는 캐릭터의 걸음과 물에 닿는 순간처럼 사건에 맞춰 터지는 작은 효과를 만들어 봅니다.