VFX Graph로 만드는 마법·폭발 연출 모듈

VFX Graph로 만드는 마법·폭발 연출 모듈

Unity VFX Graph를 공통 파라미터와 이벤트 중심으로 설계해 마법 발사체와 폭발 효과를 재사용 가능한 모듈로 만드는 방법을 정리합니다. 성능과 디버깅에서 자주 놓치는 지점도 함께 다룹니다.

왜 모듈화가 필요한가

마법과 폭발 효과는 화면에 자주 등장하지만 각각을 독립된 VFX Graph로 만들기 시작하면 색상·크기·지속 시간 같은 값을 수정하는 일이 빠르게 늘어난다. 발사체, 충돌 불꽃, 연기, 잔광을 공통 규약으로 묶으면 아트 수정과 게임 로직 연결을 훨씬 단순하게 유지할 수 있다.

여기서 모듈은 하나의 거대한 그래프가 아니라 특정 역할을 가진 효과 단위다. 예를 들어 ProjectileTrail, ImpactBurst, LingeringSmoke를 분리하고 공통 파라미터 이름과 이벤트 이름을 맞춘다.

flowchart LR
    A[스킬 로직] --> B[발사체 VFX]
    B --> C[충돌 이벤트]
    C --> D[폭발 버스트]
    D --> E[잔류 연기와 잔광]
    A --> F[공통 파라미터]
    F --> B
    F --> D
    F --> E

이 구조에서는 스킬 코드가 파티클 수명이나 개별 블록을 직접 알 필요가 없다. 코드가 효과의 위치와 속성만 전달하고 그래프는 시각적 결과를 책임진다.

공통 파라미터 규약 만들기

VFX Graph의 Exposed Property를 먼저 정리한다. 프로젝트마다 이름이 달라지면 재사용성이 떨어지므로 효과 종류와 무관하게 같은 의미의 값은 같은 이름을 사용한다.

이름타입용도
ColorColor마법 속성에 따른 기본 색상
IntensityFloat밝기, 입자 수, 크기 보정의 기준값
RadiusFloat폭발 범위와 확산 크기
DirectionVector3발사 및 분출 방향
SeedUInt32반복 가능한 무작위 패턴이 필요할 때 사용

Intensity 하나를 모든 값에 그대로 곱하기보다 그래프 안에서 용도별 범위를 따로 정하는 편이 안전하다. 예를 들어 크기는 0.8~1.3 범위로 제한하고 발광 강도는 더 넓은 범위를 허용할 수 있다. 이렇게 하면 게임 밸런스 값이 바뀌어도 효과가 지나치게 커지거나 화면을 덮는 일을 줄일 수 있다.

발사체와 폭발이 같은 속성 마법이라는 인상을 주려면 색뿐 아니라 노이즈의 움직임, 트레일 폭 변화, 발광색의 색조를 함께 연결한다. 단, 모든 요소를 완전히 같은 색으로 칠하면 깊이가 사라진다. 중심 입자는 밝은 색을 쓰고 외곽 연기나 잔재는 채도를 낮춘 색을 쓰는 방식이 읽기 좋다.

발사체 중심의 밝은 입자와 채도가 낮은 외곽 트레일을 비교하는 VFX Graph 예시

발사체 그래프 구성

Spawn과 Initialize

발사체는 지속적으로 입자를 생성하는 트레일과 간헐적으로 튀는 스파크를 분리해 생각하는 것이 좋다.

  • 트레일은 일정한 Spawn Rate를 사용하고 짧은 수명을 준다.
  • 스파크는 낮은 빈도로 생성하며 속도와 크기에 무작위성을 준다.
  • Initialize 단계에서 속도를 Direction 기반으로 설정하고 랜덤 벡터는 주 방향을 완전히 지우지 않도록 작은 비율만 섞는다.

트레일이 발사체 뒤에 남으려면 VFX 오브젝트를 발사체 Transform의 자식으로 두는 방식만으로는 부족할 수 있다. 부모를 따라 이동하는 좌표계에서는 이미 생성된 입자도 함께 이동하기 때문이다. 월드 공간에서 시뮬레이션하거나 위치 정보를 별도로 전달해 입자를 월드 공간에 배치해야 꼬리가 자연스럽게 남는다.

Update와 Output

Update에서는 난류를 과하게 넣지 않는 것이 중요하다. 속도가 빠른 투사체에 강한 Turbulence를 적용하면 진행 방향이 흐려지고 충돌 지점과 연출 위치가 어긋나 보일 수 있다. 작은 진폭의 노이즈를 크기 또는 색상 변화에 쓰고 위치 변화는 보조적인 수준으로 제한한다.

Output Particle Quad나 Mesh에서는 Soft Particle, Depth Fade를 활용해 벽과 교차할 때의 경계를 줄일 수 있다. 다만 깊이 텍스처를 사용할 수 있는 렌더 파이프라인 설정인지 먼저 확인해야 한다. 설정이 없으면 기대한 페이드가 동작하지 않는다.

충돌 시 폭발 이벤트 보내기

폭발은 발사체 그래프에서 직접 모든 입자를 생성하기보다 충돌 지점에서 별도 VisualEffect를 재생하는 방식이 관리하기 쉽다. 물리 충돌 판정은 게임플레이 코드가 맡고 충돌 위치와 법선, 속성 값을 폭발 VFX에 전달한다.

다음 예시는 충돌 지점에 배치한 폭발 효과에 공통 파라미터를 넣고 OnPlay 이벤트를 보내는 코드다. 속성 이름은 VFX Graph에 노출한 이름과 정확히 일치해야 한다.

using UnityEngine;
using UnityEngine.VFX;

public sealed class MagicImpactVfx : MonoBehaviour
{
    [SerializeField] private VisualEffect impactEffect;

    public void Play(Vector3 position, Vector3 normal, Color color, float radius)
    {
        impactEffect.transform.SetPositionAndRotation(
            position,
            Quaternion.LookRotation(normal.sqrMagnitude > 0.001f ? normal : Vector3.up)
        );

        impactEffect.SetVector3("Direction", normal.normalized);
        impactEffect.SetVector4("Color", color);
        impactEffect.SetFloat("Radius", radius);
        impactEffect.SendEvent("OnPlay");
    }
}

SetVector4로 전달한 색상은 VFX Graph의 Color 속성과 연결할 수 있다. 프로젝트의 Unity 버전에 따라 색상 파라미터 API 사용 방식이 다를 수 있으므로 컴파일 오류가 나면 해당 버전의 VisualEffect API와 그래프 속성 타입을 확인한다.

여러 폭발이 동시에 발생하는 게임이라면 매번 오브젝트를 생성·파괴하지 말고 풀링을 사용한다. 풀에서 꺼낸 VFX는 이전 시뮬레이션이 남지 않도록 Reinit() 후 필요한 값을 설정하거나 그래프의 이벤트 처리 방식에 맞춰 명확한 초기화 절차를 정한다.

폭발 그래프를 세 층으로 나누기

폭발은 한 종류의 입자로 만들기보다 시간대가 다른 세 층으로 나누면 제어가 쉬워진다.

초기 섬광

아주 짧은 수명과 큰 밝기를 가진 쿼드 또는 메시다. 입자 수는 적어도 되지만 노출과 블룸에 영향을 크게 줄 수 있다. HDR 색상과 블룸 강도를 과도하게 높이면 화면 전체가 하얗게 뜰 수 있으므로 실제 게임 조명 환경에서 확인한다.

파편과 불꽃

가장 읽기 쉬운 방향성을 제공하는 층이다. Direction과 충돌 법선을 조합해 반구 형태로 분출하면 바닥이나 벽을 친 느낌을 만들 수 있다. 파편마다 크기와 수명을 조금씩 다르게 주되 너무 넓은 랜덤 범위는 폭발의 중심을 흐린다.

연기와 잔광

연기는 느리게 커지고 천천히 사라져야 한다. 폭발 직후 바로 큰 연기를 만들면 섬광과 파편을 가리므로 짧은 지연 뒤에 생성하거나 초기 크기를 작게 두고 성장시키는 편이 낫다. 카메라를 향한 빌보드 연기는 회전과 노이즈 텍스처를 함께 사용해 반복감을 줄인다.

섬광, 방사형 파편, 느리게 퍼지는 연기로 구성된 폭발 효과의 시간대별 레이어

성능을 확인하는 기준

VFX Graph는 많은 입자를 처리할 수 있지만 입자 수만으로 비용이 결정되지는 않는다. 큰 반투명 쿼드가 화면을 넓게 덮는 경우에는 오버드로가 병목이 되기 쉽다. 특히 연기, 왜곡, 여러 겹의 글로우는 실제 플레이 화면에서 확인해야 한다.

다음 항목을 우선 점검한다.

  • 화면을 크게 차지하는 반투명 입자가 과도하게 겹치지 않는가
  • 필요 이상으로 높은 해상도의 노이즈·마스크 텍스처를 쓰지 않는가
  • 카메라에서 멀어진 효과에 LOD 또는 조기 종료가 적용되는가
  • 보이지 않는 효과도 계속 시뮬레이션하고 있지 않은가
  • 충돌마다 새 VFX 오브젝트를 생성하고 있지 않은가

프로파일러에서는 CPU뿐 아니라 GPU 프레임 시간과 드로우콜, 오버드로를 함께 본다. 특정 효과가 무겁다면 먼저 생성량을 줄이기보다 큰 알파 블렌드 입자와 텍스처 샘플 수를 살펴보는 편이 원인을 더 빨리 찾는 경우가 많다.

디버깅 체크리스트

효과가 보이지 않을 때는 그래프를 복잡하게 고치기 전에 기본 조건부터 확인한다.

  1. VisualEffect 컴포넌트에 올바른 VFX Graph 에셋이 연결되어 있는지 확인한다.
  2. 이벤트 이름이 그래프의 이벤트 이름과 일치하는지 확인한다.
  3. Spawn Context가 이벤트를 실제로 수신하는지 확인한다.
  4. 그래프의 Bounds가 너무 작아 카메라 컬링이 발생하지 않는지 확인한다.
  5. 출력 머티리얼과 렌더 파이프라인 설정이 호환되는지 확인한다.

Bounds는 특히 자주 놓친다. 빠르게 이동하거나 넓게 퍼지는 입자는 계산된 경계 밖으로 나갈 수 있다. 장면 뷰에서는 보이는데 게임 뷰에서 사라진다면 VFX Graph의 Bounds 설정과 컬링 상태를 먼저 점검한다.

마무리

마법과 폭발 연출을 재사용하려면 그래프를 화려하게 만드는 것보다 인터페이스를 안정적으로 만드는 일이 먼저다. 공통 파라미터와 이벤트 규약을 정하고 발사체·폭발·잔류 효과를 역할별로 분리하면 새로운 스킬을 추가할 때도 같은 구조를 반복해서 활용할 수 있다. 이후에는 속성별 색상 세트와 텍스처만 교체해도 일관된 연출 체계를 유지할 수 있다.

#Unity#VFX Graph#파티클#셰이더#최적화

계속 읽어보기

이런 글은 어떠세요?

< Back to Logs