스폰 모듈의 기본 사용법
Spawn Rate·Burst·Per Unit의 생성 기준을 비교하고 효과의 시간·이동 거리 요구에 맞춰 생성 수량과 위치를 설정합니다.
나이아가라 효과는 모듈(Module)로 이루어집니다. 모듈은 파티클의 생성과 갱신, 렌더링에 이르는 동작을 하나씩 맡는 작은 기능 단위이며, 2장에서 이미 Initialize Particle, Spawn Rate, Add Velocity 같은 모듈을 써 봤습니다. 3장에서는 이 모듈들을 더 깊이 이해하고 효과에 맞게 고르는 방법을 익히는데, 그 첫 순서로 파티클의 탄생을 정하는 스폰(Spawn) 모듈을 살펴봅니다.
여기서 다루는 생성량 모듈은 모두 Emitter Update 그룹에 둡니다. 언제 몇 개를 만들지 정하는 일과, Particle Spawn 그룹에서 입자의 위치와 속성의 초기값을 정하는 일은 서로 다르다는 점을 먼저 기억해 둡니다. 이 글에서는 시간과 특정 시점, 이동 거리라는 세 가지 생성 기준을 비교하고, 효과에 맞는 기준을 고르는 방법을 정리합니다.
세 가지 생성 기준
스폰 모듈은 파티클이 처음 나타나는 방식을 정합니다. 만들려는 효과가 시간이 흐르는 동안 계속 나와야 하는지, 한순간에 터져야 하는지, 움직인 만큼 남아야 하는지에 따라 알맞은 모듈이 다릅니다.
시간에 비례하는 Spawn Rate
Spawn Rate는 가장 기본적이고 널리 쓰는 스폰 모듈로, 1초에 정해진 수의 파티클을 계속 만듭니다. 주요 입력인 Spawn Rate가 초당 생성 수이며, 값이 클수록 파티클이 더 조밀하게 생깁니다. 낮은 값으로 부드럽게 피어오르는 연기를, 알맞은 값으로 계속 내리는 비나 눈을, 높은 값으로 힘차게 뿜어져 나오는 물줄기를 만들 수 있습니다. 생성률을 시간에 따라 바꾸고 싶다면 이 입력을 커브 같은 값으로 제어하는데, 이 방법은 커브와 그래디언트 데이터에서 다룹니다.
특정 시점의 Spawn Burst Instantaneous
Spawn Burst Instantaneous는 정해진 시점에 정해진 수의 파티클을 한꺼번에 만듭니다. 주요 입력인 Spawn Count가 한 번에 만들 개수이며, 짧고 강렬한 효과에 주로 씁니다. 폭발 순간에 파편이나 불꽃을 한꺼번에 흩뿌릴 때, 무언가가 땅에 닿는 순간 먼지나 파동을 일으킬 때, 총알이 벽에 맞아 스파크가 튈 때가 그 예입니다. 이미터의 Loop Behavior를 Once로 두고 이 모듈을 쓰면, 한 번 터지고 사라지는 일회성 효과를 쉽게 만들 수 있습니다.
이동 거리에 비례하는 Spawn Per Unit
Spawn Per Unit은 이미터가 움직인 거리에 비례해 파티클을 만듭니다. 같은 시간 동안 더 멀리 움직이면 더 많이 만들고, 같은 거리를 움직였다면 빠르게 갔든 느리게 갔든 비슷한 수를 목표로 합니다. 그래서 자동차가 움직일 때만 바퀴에서 일어나는 먼지, 캐릭터가 이동할 때 뒤에 남는 잔상, 빠르게 날아가는 총알 뒤의 연기 꼬리처럼 움직임에 맞춰 남아야 하는 효과에 알맞습니다.
이 모듈을 쓸 때는 거리를 재는 위치 입력과, 순간 이동처럼 위치가 갑자기 크게 바뀔 때의 처리 설정을 확인해야 합니다. 또 거리 기준 수량을 넣는 입력이 거리당 입자 수인지, 입자 하나당 거리인지를 쓰는 모듈 버전에서 먼저 확인합니다. 두 값은 역수 관계여서, 10cm마다 한 개는 1cm당 0.1개와 같습니다.
스폰 모듈을 추가하는 순서
스폰 모듈을 이미터에 더하는 과정은 간단합니다. 먼저 작업할 나이아가라 시스템 에셋을 더블 클릭해 열고, 시스템 개요(System Overview)에서 파티클을 만들 이미터를 선택합니다. 그 이미터의 Emitter Update 그룹 옆에 있는 + 버튼을 누르면 모듈 검색창이 나타나는데, 여기에 Spawn Rate나 Spawn Burst Instantaneous처럼 원하는 스폰 모듈의 이름을 입력해 찾고 클릭해 추가합니다. 추가한 모듈을 선택하면 선택(Selection) 패널에 입력이 나타나므로, Spawn Rate나 Spawn Count 같은 값을 원하는 대로 조정합니다.
스폰 모듈만 넣는다고 파티클이 보이는 것은 아닙니다. 이미터에 Initialize Particle과 Sprite Renderer 같은 렌더러가 함께 있어야 합니다. Particle Spawn의 Initialize Particle은 초기 속성을, Particle Update의 Particle State는 수명이 지나는 것과 소멸을, 렌더러는 출력되는 모양을 맡습니다. 또 Emitter State의 실행과 루프 조건이 생성량 모듈이 동작하도록 설정되어 있어야 합니다.
스폰 모듈을 잘 쓰는 방법
여러 생성 모듈을 함께 써서 복합적인 효과를 만들 수 있습니다. 예를 들어 연기는 Spawn Rate로 계속 피어오르게 하고, 가끔 불꽃이 터져 나오는 순간은 Spawn Burst Instantaneous로 더할 수 있습니다.
생성 수에 무작위 값이나 커브를 쓸 때는 입력의 자료형에 맞는 Random Range나 커브를 고릅니다. 버스트의 개수는 정수이므로 Float 입력을 그대로 연결하지 않습니다. 또 그 값이 매 틱마다 평가되는지, 루프가 시작될 때 한 번 평가되는지에 따라 생성 패턴이 달라집니다.
생성 수가 많으면 성능 부담도 커집니다. 특히 모바일이나 저사양 환경에서는 입자 수를 알맞게 유지해야 합니다. 이때 모든 이미터에 어떤 값이든 막아 주는 Max Particles 같은 입력이 있다고 가정하지 말고, 생성률과 버스트 개수, 수명, Kill 조건, 그리고 쓰는 버전의 스케일러빌리티 제한을 조합해 입자 수를 관리합니다. 메모리를 미리 잡아 두는 할당량 설정을 곧바로 생성 상한으로 해석해서도 안 됩니다.
시간과 거리, 어느 쪽에 맞출까
세 기준을 고를 때 확인할 값은 다음과 같습니다.
| 기준 | 모듈과 점검할 값 |
|---|---|
| 시간 | Spawn Rate: 초당 생성 수와 수명, 정상 상태의 살아 있는 개수 |
| 특정 시점 | Spawn Burst Instantaneous: Spawn Count, Spawn Time, 루프 반복 |
| 이동 거리 | Spawn Per Unit: 거리 단위, 거리를 재는 위치, 갑작스러운 위치 변화 |
Rate와 Burst를 함께 쓴다면 둘을 합친 전체 생성량으로 예산을 계산합니다. 프레임이 순간적으로 끊긴다면 버스트가 한꺼번에 만드는 양을, 시간이 지나며 쌓이는 양이 문제라면 수명을 봅니다. 입자가 적은데도 장면이 무겁다면 화면 면적과 머티리얼, 오버드로우를 확인합니다.
같은 거리를 움직여도 걸린 시간에 따라 두 기준의 결과가 달라집니다. 거리 입력을 cm로 해석하고 10cm마다 1개를 목표로 한다면, 120cm를 이동할 때의 생성 예산은 120 ÷ 10 = 12개입니다. 반면 Rate 6개/초는 그 120cm를 2초 동안 움직이면 약 6 × 2 = 12개, 4초 동안 움직이면 약 6 × 4 = 24개를 만듭니다.
| 이동 | 걸린 시간 | Per Unit(10cm마다 1개) | Rate(6개/초) |
|---|---|---|---|
| 120cm | 2초 | 약 12개 | 약 12개 |
| 120cm | 4초 | 약 12개 | 약 24개 |
즉 Per Unit은 이동 거리에, Rate는 흐른 시간에 반응합니다. 이 계산은 남은 거리의 이월, 첫 입자의 생성 위치, 보간, 정수 처리, 순간 이동 조건을 생략한 예산 어림이므로, 실제 프레임에서 정확히 이만큼 만들어진다는 뜻은 아닙니다.
더 깊이: 생성을 부드럽게 하는 Interpolated Spawning
생성량 모듈과 별개로, 이미터 속성(Emitter Properties)에는 생성 방식 자체를 바꾸는 Interpolated Spawning이 있습니다. 이 설정을 켜면 이미터는 보간한(interpolated) 파라미터 값으로 입자를 만들고, 생성하는 시점에 부분 갱신(partial update)을 합니다. Emitter Properties 문서는 이렇게 하면 생성률이 높을 때, 프레임 속도가 고르지 않을 때, 이미터가 빠르게 움직일 때 생성이 훨씬 부드러워진다고 설명합니다.
대신 문서는 이 설정이 생성에 상당한 추가 비용을 더한다고 함께 적고 있습니다. 그래서 모든 이미터에 켜 두기보다, 빠르게 날아가는 발사체의 연기 꼬리처럼 생성률이 높거나 이미터가 빨리 움직이는 효과에서 입자가 고르게 이어지지 않을 때 켜 봅니다. 켠 뒤에는 앞에서 정한 생성 예산과 같은 조건에서 모양과 비용을 함께 비교합니다.
정리
- 생성량 모듈은 Emitter Update에 두며, 언제 몇 개를 만들지 정하는 일은 Particle Spawn에서 초기값을 정하는 일과 다릅니다.
Spawn Rate는 흐른 시간에 비례해,Spawn Burst Instantaneous는 정해진 시점에Spawn Count만큼,Spawn Per Unit은 움직인 거리에 비례해 파티클을 만듭니다.Spawn Per Unit은 거리를 재는 위치와 순간 이동 처리, 입력이 거리당 개수인지 개수당 거리인지를 확인해야 합니다.- 파티클이 보이려면 스폰 모듈 말고도
Initialize Particle과 렌더러, 알맞은Emitter State설정이 필요합니다. - 입자 수는 생성률과 버스트, 수명, Kill 조건, 스케일러빌리티 제한을 조합해 관리하며, 모든 이미터에 생성 상한 입력이 있다고 가정하지 않습니다.
연습 문제
1. 250cm를 5초 동안
같은 거리 입력에서 250cm를 5초 동안 이동했습니다. 10cm마다 1개를 만드는 기준과 Rate 6개/초 기준의 생성 예산을 각각 계산해 보세요. 바퀴가 멈춘 동안에도 시간이 흐르면 두 기준 가운데 어느 쪽이 새 입자를 계속 만들까요? 다른 버스트나 생성 모듈은 없습니다.
해설 보기
거리 기준은 약 250 ÷ 10 = 25개, 시간 기준은 약 6 × 5 = 30개입니다.
바퀴가 멈춰 거리를 재는 위치가 움직이지 않으면 Per Unit에는 새로운 이동 거리가 생기지 않으므로 입자를 만들지 않습니다. 반면 Rate는 이미터가 켜져 있는 동안 시간이 흐르기만 하면 계속 만듭니다. 실제 수가 예산과 다르면 먼저 단위와 남은 거리, 모듈의 이동 처리 설정을 확인합니다.
2. 한 번만 터지는 폭발
벽에 총알이 맞을 때 스파크가 한 번 튀고 끝나는 효과를 만들려고 합니다. 어떤 생성 모듈과 루프 설정을 고르면 될까요?
해설 보기
순간적으로 정해진 수를 만드는 효과이므로 Emitter Update에 Spawn Burst Instantaneous를 두고, Spawn Count로 스파크의 개수를 정합니다. 그리고 Emitter State의 Loop Behavior를 Once로 두면 한 번 터진 뒤 반복하지 않습니다.
Spawn Rate를 쓰면 이미터가 켜져 있는 동안 계속 스파크가 만들어지므로 일회성 효과에 맞지 않습니다. 파티클이 보이려면 Initialize Particle과 렌더러도 함께 있어야 합니다.
3. 멈춰 있어도 나오는 타이어 먼지
자동차가 멈춰 있을 때도 바퀴에서 먼지가 계속 나옵니다. 어떤 생성 기준을 쓰고 있을 가능성이 크고, 어떻게 바꾸면 될까요?
해설 보기
시간에 비례하는 Spawn Rate를 쓰고 있을 가능성이 큽니다. Rate는 이동과 상관없이 시간이 흐르면 계속 입자를 만들기 때문입니다.
움직일 때만 먼지를 만들려면 이동 거리에 비례하는 Spawn Per Unit으로 바꿉니다. 이때 거리를 재는 위치가 바퀴나 차의 실제 위치를 따라가는지와, 입력이 거리당 개수인지 개수당 거리인지를 확인합니다.
다음 글 파티클 업데이트 모듈 소개에서는 생성된 입자가 살아 있는 동안 힘과 색, 크기를 바꾸는 Particle Update 그룹의 모듈을 살펴봅니다.