기본적인 마법 및 능력 시각화
오라·발사체·충격 이미터의 형태·색상·타이밍을 조합하고 블루프린트로 이동시키는 얼음 파편 마법을 완성합니다.
불꽃 구슬이나 얼음 파편, 치유의 빛, 순간 이동 같은 마법(magic)과 능력(ability)의 효과는 보기 좋은 데서 그치지 않고 게임의 정보를 전합니다. 플레이어는 색과 모양을 보고 어떤 속성의 마법인지, 언제 맞았는지, 어디까지 영향을 주는지를 알아차립니다. 앞에서 만든 불꽃이나 연기, 폭발이 실제 현상을 흉내 냈다면, 마법은 색과 모양, 타이밍으로 눈에 보이지 않는 능력의 상태를 표현한다는 점이 다릅니다. 이 글에서는 마법 효과를 오라, 발사체, 충격의 세 가지로 나누어 설정을 살펴보고, 기준이 되는 시작 값을 정리한 뒤, 블루프린트로 움직이는 얼음 파편 발사체를 만들어 봅니다.
마법 효과를 이루는 요소
마법과 능력의 효과는 보통 네 가지 요소를 조합해 만듭니다. 마법을 시전하거나 발사할 때 느껴지는 에너지의 움직임과 방향, 불이나 얼음, 전기, 자연, 빛, 어둠처럼 속성을 나타내는 색과 모양과 움직임, 마법이 미치는 영역이나 폭발 범위, 그리고 마법이 준비되거나 맞았을 때의 시각과 청각의 반응입니다.
오라
오라(aura)나 버프(buff)는 캐릭터 주변을 감싸거나 한 자리에서 계속 피어나는 에너지 효과입니다. 계속 흘러야 하므로 Spawn Rate는 낮거나 중간 정도로 두고, Lifetime은 오라가 유지되는 시간에 맞춰 길게 둡니다. 스프라이트 크기는 10에서 50 사이에서 작게 시작해 커지게 하고, 색은 속성에 맞춰 치유라면 녹색이나 노랑, 보호막이라면 파랑이나 흰색, 저주라면 보라나 검정으로 정합니다. 초기 위치는 Shape Location으로 캐릭터 주변에 구나 원기둥 모양으로 퍼뜨리거나 특정 소켓에 붙이고, 초기 속도는 Z축 위로 천천히 올라가거나 구 모양으로 아주 조금 퍼지게 줍니다.
움직임에서는 Gravity Force를 약하게 주거나 뺍니다. 오라가 유기적으로 흐르는 느낌을 내려면 Curl Noise Force 같은 노이즈 힘 모듈을 더하고, 세기와 주파수를 조절해 부드러운 흐름이나 에너지가 휘감기는 소용돌이를 표현합니다. 시간에 따른 변화로는 Scale Color로 시작 색에서 밝게 빛나다가 투명하게 사라지게 해 오라의 지속과 세기를 나타내고, Scale Sprite Size로 크기를 작게 시작해 커졌다가 작아지게 합니다.
렌더링은 Sprite Renderer에 추상적인 에너지나 빛, 구름 모양의 텍스처를 쓰는 Additive, Unlit 머티리얼을 지정하고, 빛나는 느낌을 내도록 머티리얼의 Emissive Color를 충분히 씁니다. 표면과 만나는 자리는 머티리얼의 DepthFade로 부드럽게 합니다.
발사체
발사체(projectile)는 마법 구슬이나 화살, 에너지 볼처럼 플레이어가 쏘는 효과입니다. 가운데의 핵심 입자는 Spawn Burst Instantaneous의 Count 1로 만들고, 꼬리처럼 남는 잔상은 따로 계속 만드는 이미터로 만듭니다. Lifetime은 발사체가 날아가는 거리에 맞춰 길게, 스프라이트 크기는 20에서 50 사이의 중간 정도로, 색은 속성에 맞춰 불이라면 빨강이나 주황, 얼음이라면 파랑이나 흰색, 전기라면 노랑이나 파랑으로 정하며, 초기 위치는 총구나 시전하는 위치입니다.
여기서 중요한 점이 하나 있습니다. 게임플레이의 발사체는 Actor의 Projectile Movement가 움직입니다. 그래서 Actor에 붙은 가운데 입자에 같은 이동 속도를 다시 주면, 보이는 것과 충돌체가 서로 다른 곳으로 가 버립니다. 입자에 따로 초기 속도를 주는 것은 게임과 상관없는 순수한 시각 효과일 때만입니다.
움직임에서는 중력을 받을지에 따라 Gravity Force를 조절하는데, 마법 구슬은 중력을 무시하고 돌멩이는 받게 합니다. 공기 저항이 있는지에 따라 Drag도 조절하고, 발사체 주변에 에너지의 잔상이나 소용돌이를 더하고 싶다면 Curl Noise Force 같은 노이즈 힘을 씁니다. 날아가는 동안 Scale Color로 색이 조금씩 진해지거나 밝아지게 할 수도 있습니다.
렌더링은 구 모양이나 추상적인 모양이라면 Sprite Renderer를, 화살이나 얼음 파편이라면 Mesh Renderer를 쓰고, 빛나는 에너지나 불, 얼음 질감의 텍스처를 쓰는 Additive, Unlit 머티리얼을 지정합니다. 지나간 자리에 꼬리 같은 흔적을 남기려면 Ribbon Renderer를 더하고, 잔상의 색과 두께, 수명을 조절합니다. 움직임을 더 강조하고 싶다면 발사체 주변에 작은 스파크나 파편을 따로 만드는데, 이때는 별도의 이미터를 두거나 Spawn System Attached를 씁니다.
충격
충격(impact)은 마법이 맞거나 능력이 발동하는 순간의 효과입니다. 한 번에 많은 입자를 만들어야 하므로 Spawn Burst Instantaneous가 꼭 필요하고, Spawn Count는 효과의 세기에 맞춰 정합니다. Lifetime은 0.1초에서 0.5초 사이로 아주 짧게, 스프라이트 크기는 작게 시작해 빠르게 커지게 하고, 색은 마법의 속성에 충격을 나타내는 흰색이나 검정을 더해 정합니다. 초기 위치는 충격 지점이며, 초기 속도는 구나 원뿔 모양으로 사방에 세게 퍼지게 줍니다.
움직임에서는 파편이나 먼지에는 Gravity Force를 주고 에너지에는 빼며, Drag로 속도를 줄입니다. 입자가 사라지는 시점은 Drag가 아니라 Lifetime과 Particle State가 정합니다. 노이즈 힘은 약하게 주어 불규칙함을 더합니다. 시간에 따른 변화로는 폭발처럼 Scale Color로 순간적으로 밝게 터졌다가 어둡고 투명하게 사라지게 하고, Scale Sprite Size로 빠르게 커졌다가 줄어들게 합니다.
렌더링은 에너지와 빛에는 Sprite Renderer를, 파편에는 Mesh Renderer를 쓰고, 충격파나 스파크 텍스처를 Additive와 Translucent로 조합합니다. 순간적인 섬광에는 Light Renderer를 더하되 비용에 주의합니다. 블루프린트에서는 Spawn System at Location의 Auto Activate를 끄고 위치를 정해 만든 뒤, 돌려받은 컴포넌트에 사용자 세기 값을 넣고 Activate합니다.
시작 값의 기준
마법과 능력의 효과는 보기 좋은 값 하나보다 장면마다 같은 기준으로 쓰는 값이 중요합니다. 아래의 값을 출발점으로 삼으면 장면 사이의 차이를 줄일 수 있습니다. 각 항목은 값과, 그 값이 만드는 모습, 그리고 조정하는 방법의 순서로 적었습니다.
| 효과 | 시작 값 | 만드는 모습 | 조정하는 방법 |
|---|---|---|---|
| 오라 | Spawn Rate 20에서 40 | 안정적으로 계속 흐름 | 너무 빽빽하면 Lifetime을 먼저 줄이고 생성률은 나중에 줄임 |
| 오라 | 노이즈 세기 15에서 35 | 부드러운 흔들림 | 난류가 지나치면 주파수를 낮춰 깜빡임을 줄임 |
| 발사체 | Projectile Movement 속도 3000에서 6000cm/s | 빠르게 곧장 나가는 느낌 | 보이는 중심과 충돌체가 다르게 움직이면 먼저 부착과 좌표 공간, 겹친 속도를 바로잡고, 그다음 리본 너비로 읽기 쉽게 다듬음 |
| 발사체 | 잔상 Lifetime 0.15에서 0.35초 | 잔상이 눈에 들어옴 | 화면이 많이 번지면 0.2초 이하로 낮춤 |
| 충격 | 버스트 Count 20에서 60 | 바로 터지는 느낌 | 성능이 흔들리면 Count를 줄여 비교하고, 스프라이트 크기를 키우면 화면 면적과 오버드로우가 늘 수 있으므로 따로 측정함 |
| 충격 | Lifetime 0.12에서 0.35초 | 순간적인 타격감 | 길어지면 잔상이 쌓이므로 0.4초 이상은 피함 |
몇 가지를 더 챙기면 좋습니다. 불은 주황과 빨강, 얼음은 파랑과 흰색, 번개는 노랑과 하늘색처럼 속성마다 분명한 색 팔레트를 정해 둡니다. Unlit과 높은 Emissive Color로 마법이 스스로 빛나는 느낌을 내면 밤이나 어두운 곳에서 특히 잘 드러나고, 포스트 프로세스 볼륨의 블룸(Bloom)을 조절하면 발광을 더 강조할 수 있습니다. 나이아가라 스크립트의 Sine이나 Cosine 노드로 입자의 움직임이나 크기에 주기적인 파동을 주면 마법다운 느낌이 더해집니다.
자주 쓰는 작은 충격이나 버프 효과는 풀링으로 비용을 줄이고, 시전 애니메이션의 특정 프레임에 효과를 맞추려면 애니메이션 노티파이를 씁니다. 블루프린트로 효과를 켜는 방법과 사건에 맞춰 만드는 방법은 블루프린트 제어와 이벤트 기반 파티클 스폰에서 다뤘습니다.
얼음 파편 발사체 만들기
얼음 속성의 발사체와 충격 효과를 간단히 만들어 봅니다. 이 실습에서는 일을 둘로 나눕니다. 나이아가라 시스템은 발사체가 어떻게 보이는지만 정하고, 어디로 얼마나 빨리 날아가 무엇에 부딪히는지는 블루프린트 Actor의 충돌체와 Projectile Movement가 정합니다. 그래서 가운데 입자는 스스로 움직이지 않게 두고 Actor를 따라가게 하며, 이 두 부분을 아래에서 차례로 만듭니다.
얼음 발사체 시스템 NS_IceProjectile
먼저 Fountain 같은 기본 이미터로 시스템을 만들고, 가운데와 잔상을 서로 다른 이미터로 나눕니다. 가운데 이미터는 Spawn Rate를 지우고 Spawn Burst Instantaneous를 Count 1, Time 0으로 추가하며, Emitter State는 Once로 둡니다.
다음으로 가운데 이미터를 Local Space로 둡니다. Initialize Particle에서 Lifetime은 2.0초, 스프라이트 크기는 30cm, 색은 (0.1, 0.5, 1.0, 1.0)으로 두고, 위치는 로컬 원점, 초기 속도는 0으로 둡니다. 가운데 입자에서는 중력과 Drag, 노이즈를 빼서 Actor의 충돌체를 정확히 따라가게 합니다. Scale Color는 RGB 배율을 1로 두고 알파만 수명이 끝날 때 0이 되게 하며, Sprite Renderer에는 얼음이나 추상적인 빛의 텍스처를 쓰는 Additive, Unlit 머티리얼을 연결합니다. SubUV를 쓴다면 시트의 크기와 SubImageIndex 바인딩을 맞춥니다.
그다음 잔상 이미터를 만듭니다. 잔상 이미터는 월드 공간에 두고, 컴포넌트의 지금 위치에서 계속 입자를 만듭니다. 예시로 초당 40개, Lifetime 0.2초를 쓰고 Ribbon Renderer를 더하며, 같은 Ribbon ID와 생성 순서를 유지하고 리본의 너비와 색, 머티리얼을 정합니다. 입자 하나에 렌더러만 더해서는 길이가 있는 꼬리가 생기지 않는다는 점을 기억합니다.
마지막으로 노이즈는 잔상이나 보조 입자에만 필요에 따라 약하게 줍니다. 먼저 노이즈 없이 궤적을 맞춘 뒤, 세기 50, 주파수 0.1 같은 예시 값과 비교합니다. 켜져 있는 동안에는 계속 만들고, Deactivate한 뒤에는 기존 입자가 수명을 마치도록 수명 주기를 정합니다.
블루프린트 Actor로 움직임과 충돌 잇기
먼저 BP_IceProjectile Actor를 만들고, Sphere Collision을 루트로, 나이아가라 컴포넌트를 그 자식으로 두며, Projectile Movement 컴포넌트를 추가합니다. 나이아가라 컴포넌트에는 NS_IceProjectile을 지정하고, Projectile Movement의 Updated Component가 충돌 루트를 가리키게 합니다.
다음으로 Projectile Movement의 Initial Speed와 Max Speed를 500cm/s, Projectile Gravity Scale을 0으로 두고 로컬 +X 방향으로 발사합니다. 충돌체의 채널 응답과 이벤트를 맞추고 발사한 캐릭터는 무시하게 합니다. 500cm/s로 2초 동안 날아가면, 충돌이나 감속이 없을 때 예상 이동 거리는 500 × 2 = 1000cm입니다.
그다음 캐릭터의 발사 입력, 예를 들어 F 키의 Pressed나 그에 대응하는 Enhanced Input 액션에서 Spawn Actor from Class로 BP_IceProjectile을 만듭니다. 위치는 손 소켓으로, 회전은 발사 방향으로 정하고, 손 소켓의 Forward 축과 실제 발사 축이 같은지 확인합니다.
이어서 충돌하거나 2초의 비행이 끝났을 때 마무리 로직을 한 번만 실행합니다. 충돌이라면 유효한 Impact Point와 Normal에 따로 NS_IceImpact 버스트 효과를 만듭니다. 처음 사용자 값이 필요하면 Auto Activate를 false로 만들고 Set Niagara Variable로 값을 넣은 뒤 Activate합니다. 피해 판정은 게임플레이의 충돌 로직에서 처리합니다.
마지막으로 움직임을 멈추고 충돌을 끈 뒤, 날아가던 나이아가라 컴포넌트를 Deactivate합니다. 월드 공간에 남은 잔상이 수명을 마친 뒤에 Actor를 정리합니다. Actor를 곧바로 파괴하면 붙어 있던 나이아가라와 잔상도 함께 사라질 수 있습니다. On System Finished를 쓴다면 모든 이미터가 완료될 수 있는지 확인합니다. 저장과 컴파일을 한 뒤 곧게 날아갈 때와 장애물에 부딪힐 때, 부딪히지 않고 시간이 끝날 때, 여러 번 연달아 쏠 때를 비교합니다. 이 글의 값은 실행해 잰 값이 아니라 예제의 설정과 조건에 따른 예상입니다.
발사체 이동과 시각 표현
Actor 이동/Local 중심/World 잔상→충돌 또는 시간 종료 한 번→이동/충돌 정지·Deactivate→기존 잔상 완료→Actor 정리의 실제 표시/자원 생애이다. 충돌일 때만 Impact와 피해를 수행한다.
NIAGARA · CH9-3
이동은 Actor, 중심·잔상은 Niagara가 표현합니다
Sphere Collision 루트를 Projectile Movement의 Updated Component로 지정합니다. 로컬 중심에 이동 속도를 다시 더하지 않고, 잔상은 월드 공간에 남깁니다.
예제의 이동 조건
중심 입자의 초기 속도는 0이고 중력·Drag·Noise를 제거합니다. Actor가 500cm/s로 2초 직진하면 충돌·감속이 없을 때 예상 이동 거리는 1,000cm입니다.
월드 잔상
별도 이미터가 현재 컴포넌트 위치에 40/s로 생성하고 입자는 0.2초 동안 남습니다. Ribbon ID와 생성 순서를 맞춥니다. 점은 공간 관계를 나타내며 실제 크기·시간 간격을 측정한 그래프가 아닙니다.
종료할 때
충돌이나 시간 종료를 한 번만 처리합니다. 이동·충돌을 멈추고 비행 효과를 Deactivate한 뒤 남은 잔상이 완료되면 Actor를 정리합니다. 충돌이면 별도 Impact 효과와 게임의 피해 판정을 수행합니다.
On System Finished를 쓰려면 모든 이미터가 완료 가능한지 확인합니다. Niagara 입자의 시각 충돌이 게임의 피해 판정을 대신하지 않습니다.
게임 충돌체가 이동을 담당합니다. Actor를 즉시 파괴하면 자식 Niagara의 잔상도 함께 사라질 수 있습니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 관계·조건 설명 | 원 도식과 같이 Projectile Movement가 충돌 루트를 이동하고 자식 Niagara 중심은 Local Space에서 속도 0을 유지한다. 월드 잔상은 이전 위치에 남는다. 종료 시 게임 이동을 중지한 후 잔상을 마무리하며, 충돌일 때만 Impact를 생성한다. |
| 본문·주석 | 중심 입자의 초기 속도는 0이고 중력·Drag·Noise를 제거합니다. Actor가 500 cm/s로 2초 직진하면 충돌·감속이 없을 때 예상 이동 거리는 1,000 cm입니다. |
| 본문·주석 | 별도 이미터가 현재 컴포넌트 위치에 40개/s로 생성하고 입자는 0.2초 동안 남습니다. Ribbon ID와 생성 순서를 맞춥니다. 점은 공간 관계를 나타내며 실제 크기·시간 간격을 측정한 그래프가 아닙니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 발사체 생애 Actor 이동과 Local 중심·World 잔상이 공존한다. |
|
|
| 한 번 종료 충돌 또는 시간 종료에서 이동·충돌을 멈추고 Deactivate한다. |
|
|
| 잔여 표시 정리 기존 잔상의 완료 뒤 Actor를 정리한다. |
|
|
발사체 이동과 시각 표현
Actor 이동/Local 중심/World 잔상→충돌 또는 시간 종료 한 번→이동/충돌 정지·Deactivate→기존 잔상 완료→Actor 정리의 실제 표시/자원 생애이다. 충돌일 때만 Impact와 피해를 수행한다.
NIAGARA · CH9-3
이동은 Actor, 중심·잔상은 Niagara가 표현합니다
Sphere Collision 루트를 Projectile Movement의 Updated Component로 지정합니다. 로컬 중심에 이동 속도를 다시 더하지 않고, 잔상은 월드 공간에 남깁니다.
예제의 이동 조건
중심 입자의 초기 속도는 0이고 중력·Drag·Noise를 제거합니다. Actor가 500cm/s로 2초 직진하면 충돌·감속이 없을 때 예상 이동 거리는 1,000cm입니다.
월드 잔상
별도 이미터가 현재 컴포넌트 위치에 40/s로 생성하고 입자는 0.2초 동안 남습니다. Ribbon ID와 생성 순서를 맞춥니다. 점은 공간 관계를 나타내며 실제 크기·시간 간격을 측정한 그래프가 아닙니다.
종료할 때
충돌이나 시간 종료를 한 번만 처리합니다. 이동·충돌을 멈추고 비행 효과를 Deactivate한 뒤 남은 잔상이 완료되면 Actor를 정리합니다. 충돌이면 별도 Impact 효과와 게임의 피해 판정을 수행합니다.
On System Finished를 쓰려면 모든 이미터가 완료 가능한지 확인합니다. Niagara 입자의 시각 충돌이 게임의 피해 판정을 대신하지 않습니다.
게임 충돌체가 이동을 담당합니다. Actor를 즉시 파괴하면 자식 Niagara의 잔상도 함께 사라질 수 있습니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
| 범위 | 원문 |
|---|---|
| 관계·조건 설명 | 원 도식과 같이 Projectile Movement가 충돌 루트를 이동하고 자식 Niagara 중심은 Local Space에서 속도 0을 유지한다. 월드 잔상은 이전 위치에 남는다. 종료 시 게임 이동을 중지한 후 잔상을 마무리하며, 충돌일 때만 Impact를 생성한다. |
| 본문·주석 | 중심 입자의 초기 속도는 0이고 중력·Drag·Noise를 제거합니다. Actor가 500 cm/s로 2초 직진하면 충돌·감속이 없을 때 예상 이동 거리는 1,000 cm입니다. |
| 본문·주석 | 별도 이미터가 현재 컴포넌트 위치에 40개/s로 생성하고 입자는 0.2초 동안 남습니다. Ribbon ID와 생성 순서를 맞춥니다. 점은 공간 관계를 나타내며 실제 크기·시간 간격을 측정한 그래프가 아닙니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 발사체 생애 Actor 이동과 Local 중심·World 잔상이 공존한다. |
|
|
| 한 번 종료 충돌 또는 시간 종료에서 이동·충돌을 멈추고 Deactivate한다. |
|
|
| 잔여 표시 정리 기존 잔상의 완료 뒤 Actor를 정리한다. |
|
|
위 그림은 발사체의 움직임은 Actor가, 가운데와 잔상의 모습은 나이아가라가 맡는다는 것을 보여 줍니다. 왼쪽의 Projectile Movement가 Actor를 움직이며 충돌 루트인 Sphere Collision을 갱신하고, 그 자식인 나이아가라 컴포넌트의 가운데 입자는 Local Space에 추가 이동 속도 0으로 두어 루트를 그대로 따라갑니다. 반면 월드 공간의 잔상은 이전 위치에 입자가 남아, 그림에서 과거의 입자들이 현재 중심 뒤로 줄지어 놓입니다. 오른쪽의 충돌이나 비행 시간 종료에서는 움직임을 멈추고 Deactivate한 뒤 잔상이 끝나기를 기다리며, 충돌일 때만 따로 Impact를 만듭니다.
그림 아래의 설명은 예제의 조건을 다시 적습니다. 가운데 입자의 초기 속도는 0이고 중력과 Drag, 노이즈를 뺐으며, Actor가 500cm/s로 2초 직진하면 충돌이나 감속이 없을 때 1,000cm를 갑니다. 잔상은 별도의 이미터가 지금 컴포넌트의 위치에서 초당 40개를 만들고 각 입자는 0.2초 남으며, 그림의 점은 공간의 관계를 나타낼 뿐 실제 크기나 시간 간격을 잰 그래프가 아닙니다. 마무리는 충돌이나 시간 종료를 한 번만 처리하며, 나이아가라 입자의 시각적인 충돌이 게임의 피해 판정을 대신하지 않습니다. 단계 그림은 이 과정을 발사체가 날아가는 동안, 한 번의 마무리, 남은 표시의 정리라는 세 장면으로 나누어 보여 줍니다.
발사체 거리와 잔상 길이 예상하기
예제 설정으로 발사체의 이동과 잔상을 따로 계산해 봅니다. 500cm/s로 2초 동안 곧게 날아가면 가운데의 이동 거리는 1,000cm입니다. 힘과 충돌, 생성의 지연을 빼고 고르게 만든다고 보면, 초당 40개의 입자가 0.2초씩 남으므로 정상 상태의 잔상 입자는 약 40 × 0.2 = 8개입니다.
그 0.2초 동안 가운데가 움직인 거리는 500 × 0.2 = 100cm이므로, 잔상이 덮는 궤적의 길이도 약 100cm로 예상됩니다. 입자가 생기는 지점 사이의 거리는 500 ÷ 40 = 12.5cm인데, 이것은 리본의 너비와는 다른 값입니다. 실제 끝점은 생성되는 프레임과 입자의 움직임, 커브에 따라 달라집니다.
정리
- 마법 효과는 에너지의 흐름과 속성의 색과 모양, 영향 범위, 시전과 충격의 반응을 조합해 게임의 정보를 전합니다.
- 오라는 계속 흐르는 생성과 노이즈, 발사체는 가운데 입자와 리본 잔상, 충격은 짧은 수명의 한 번의 버스트로 만듭니다.
- 게임의 발사체는 Projectile Movement가 움직이므로, 붙은 가운데 입자에 같은 속도를 다시 주지 않고 Local Space에 초기 속도 0으로 둡니다.
- 잔상은 월드 공간의 별도 이미터가 계속 만들며, 리본은 입자 하나만으로는 꼬리가 생기지 않습니다.
- 충돌이나 시간 종료는 한 번만 처리해 움직임을 멈추고
Deactivate하며, 잔상이 끝난 뒤 Actor를 정리하고 피해 판정은 게임 로직이 맡습니다.
연습 문제
1. 더 빠른 발사체와 이른 충돌
따로 정한 조건으로 속도만 750cm/s로 바꾸었고, 0.4초에 첫 충돌이 났습니다. 그때까지 가운데의 이동 거리와 정상 상태 잔상의 입자 수, 길이를 구해 보세요. 같은 충돌 알림이 다시 오면 Impact를 더 만들어야 할까요? 2초의 Lifetime까지 기다려야만 게임의 충돌을 마칠 수 있을까요?
해설 보기
가운데는 750 × 0.4 = 300cm를 움직였습니다. 생성률과 Lifetime이 같으므로 정상 상태의 잔상 입자는 여전히 약 8개이고, 잔상의 길이는 약 750 × 0.2 = 150cm입니다.
같은 충돌 알림이 다시 와도, 한 번만 실행하는 마무리 분기가 중복된 Impact를 막고 움직임과 게임의 충돌을 먼저 멈춥니다. 가운데 입자의 2초 수명은 게임의 충돌 처리를 늦추는 규칙이 아니므로 기다릴 필요가 없습니다. Deactivate한 뒤에는 기존 잔상이 수명을 마칠 때까지 기다려 Actor를 정리하되, 생성이 멈추고 더 만들어지지 않으며 수명이 끝나는 정책이 맞는지 따로 확인합니다. 게임의 판정과 화면 표시가 끝나는 것은 서로 다른 일입니다.
2. 충돌체보다 앞서 가는 얼음 구슬
얼음 구슬이 눈에 보이는 위치보다 뒤에서 벽에 부딪힌 것처럼 판정됩니다. 가운데 입자에 Add Velocity로 500cm/s를 주었다면 무엇이 문제일까요?
해설 보기
Actor는 Projectile Movement로 이미 500cm/s로 움직이는데, 그 Actor에 붙은 가운데 입자에도 같은 속도를 주어 입자가 충돌체보다 앞서 나간 것입니다. Local Space에서는 이 둘이 더해져, 보이는 구슬이 충돌체보다 두 배 빠르게 나아갑니다.
가운데 입자의 Add Velocity를 지우고 초기 속도를 0으로 두어, 입자가 루트를 그대로 따라가게 합니다. 움직임은 Actor가, 모습은 나이아가라가 맡도록 나누면 보이는 위치와 판정 위치가 맞습니다.
3. 부딪히자마자 사라지는 꼬리
발사체가 벽에 맞는 순간 잔상까지 한꺼번에 사라져 어색합니다. 마무리 로직에서 곧바로 Destroy Actor를 부르고 있다면 어떻게 바꾸면 좋을까요?
해설 보기
Actor를 곧바로 파괴하면 그 자식인 나이아가라 컴포넌트와 월드 공간에 남아 있던 잔상까지 함께 사라집니다.
마무리 로직에서는 먼저 움직임을 멈추고 충돌을 끈 뒤 나이아가라 컴포넌트를 Deactivate합니다. 그리고 남은 잔상이 수명을 마칠 시간, 이 예제라면 0.2초 정도가 지난 뒤에 Actor를 파괴합니다. Deactivate는 이미 있는 입자를 지우지 않으므로, On System Finished를 기다린다면 Lifetime이 2.0초인 가운데 입자도 수명을 마쳐야 시스템이 완료되고, 그동안 가운데 구슬이 멈춘 자리에 남아 보입니다. On System Finished를 쓴다면 모든 이미터가 완료될 수 있는지 확인합니다.
다음 글 캐릭터와 무기 관련 간단한 이펙트에서는 총구 화염과 칼날의 궤적, 피격 효과처럼 캐릭터와 무기에 붙는 효과를 만들어 봅니다.