시각 효과 그래프(VFX 그래프)를 사용하면 노드 기반 시각 로직을 사용하여 간단한 효과와 복잡한 효과를 모두 제작할 수 있습니다. Unity에서 사용할 수 있는 여러 주요 툴셋 중 하나인 VFX 그래프를 사용하면 아티스트와 디자이너가 코딩을 거의 또는 전혀 하지 않고도 제작할 수 있습니다.
시각 효과는 플레이어에게 몰입도 높은 경험을 제공하는 데 있어 핵심적인 요소입니다. 또한 지속적인 하드웨어의 발전 덕분에 할리우드 블록버스터 영화에서만 가능했던 것을 이제 실시간으로 구현할 수 있게 되었습니다.
이 글은 120페이지 분량의 전자책에서 발췌한 내용입니다, Unity에서 고급 시각 효과 제작을 위한 최종 가이드에서 발췌한 내용으로, 아티스트, 테크니컬 아티스트, 프로그래머가 Unity 2021 LTS 버전의 VFX 그래프를 사용할 수 있도록 안내합니다. 게임에 풍부한 레이어를 적용한 실시간 시각 효과를 제작할 때 레퍼런스로 활용하세요.
하이엔드 플랫폼에서 복잡한 AAA급 시각 효과를 구현하려면 VFX 그래프를 사용하여 직관적인 노드 기반 인터페이스에서 GPU 가속 파티클을 생성하세요.
보다 구체적으로, VFX 그래프를 활용해 보세요:
하나 또는 여러 개의 파티클 시스템 생성
스태틱 메시 및 제어 셰이더 프로퍼티 추가하기
C# 또는 타임라인을 통해 이벤트를 생성하여 효과의 일부를 켜고 끄기
일반적으로 사용되는 노드 조합의 하위 그래프를 생성하여 기능 라이브러리를 확장하세요.
다른 VFX 그래프 안에 VFX 그래프 사용(예: 다른 큰 이펙트의 일부로 작은 폭발)
다양한 비율로 변경 사항 미리보기 및/또는 단계별 시뮬레이션 수행
VFX 그래프는 다음과 함께 작동합니다. 유니버설 렌더 파이프라인 (URP)* 및 고해상도 렌더 파이프라인 (HDRP)과 함께 작동합니다. 또한 URP에서 사용할 수 있는 조명 출력 및 2D 렌더러에 대한 지원도 추가됩니다. 모든 렌더 파이프라인에 대한 VFX 그래프 기능 비교는 여기에서 확인하세요.
VFX 그래프는 디바이스와의 호환성을 유지하기 위해 컴퓨팅 셰이더 지원이 필요합니다. 지원되는 기기는 다음과 같습니다:
Metal 그래픽 API를 사용하는 macOS 및 iOS 플랫폼
Vulkan 또는 GLES3 API를 사용하는 Linux 및 Windows 플랫폼
일부 하이엔드 컴퓨팅 지원 디바이스용 Android(URP 사용 시에만)
핵심 그래픽 패키지
Unity 2021 LTS부터 프로젝트에 VFX 그래프를 효율적으로 설치할 수 있습니다. 이제 핵심 그래픽 패키지가 기본 Unity 인스톨러에 포함되어 프로젝트가 항상 검증된 최신 그래픽 코드로 실행되도록 보장합니다.
Unity 최신 버전을 설치하면 URP, HDRP, 셰이더 그래프, VFX 그래프 등을 위한 최신 패키지가 설치에 포함되어 있습니다.
자세한 내용은 VFX 그래프 시작하기를 참조하거나 이 블로그 게시물을 읽어보세요.
* Unity 2021 LTS 이후 버전에서는 카메라 버퍼 액세스는 HDRP에서만 사용할 수 있습니다. VFX 그래프의 호환성에 대한 자세한 내용은 문서를 참조하세요.
VFX 그래프의 모든 시각 효과는 이 두 부분으로 구성됩니다:
씬의 게임 오브젝트에 연결된 시각 효과(VFX) 컴포넌트
프로젝트 레벨에 존재하는 시각 효과(VFX) 그래프 에셋
Unity는 각 VFX 그래프를 에셋 폴더에 저장하므로 각 에셋을 씬의 비주얼 이펙트 컴포넌트에 연결해야 합니다. 런타임에 서로 다른 게임 오브젝트가 동일한 그래프를 참조할 수 있다는 점에 유의하세요.
새 시각 효과를 만들려면 프로젝트 창에서 마우스 오른쪽 버튼을 클릭하고 만들기 > 시각 효과 > 시각 효과 그래프로 이동합니다. 그 결과 VFX 그래프 에셋이 생성됩니다.
유니티는 비주얼 이펙트 컴포넌트가 있는 게임 오브젝트에 VFX 그래프 에셋을 연결하는 몇 가지 방법을 제공합니다:
결과 에셋을 씬 뷰 또는 계층 구조로 드래그합니다. 계층구조 창에 새 기본 게임 오브젝트가 나타납니다.
인스펙터의 기존 시각 효과 컴포넌트에 에셋을 할당합니다. 게임 오브젝트를 별도로 생성하고 컴포넌트 추가 메뉴를 사용합니다.
게임 오브젝트를 선택한 상태에서 에셋을 인스펙터 창으로 드래그 앤 드롭합니다. 이렇게 하면 시각 효과 컴포넌트가 생성되고 한 번의 빠른 작업으로 에셋이 할당됩니다.
VFX 그래프 에셋에는 모든 로직이 포함되어 있습니다. 다음 방법 중 하나를 선택하여 동작을 편집합니다:
- 프로젝트 창에서 VFX 그래프 에셋을 더블클릭합니다.
- 프로젝트 창에서 VFX 그래프 에셋을 선택하고 헤더의 열기 버튼을 클릭합니다.
- 시각 효과 구성 요소에서 에셋 템플릿 속성 옆의 편집 버튼을 클릭합니다.
에셋은 창 > 시각 효과 > 시각 효과 그래프에서 사용할 수 있는 VFX 그래프 창에서 열립니다.
이 창을 포함하여 이 창의 레이아웃에 익숙해지세요:
도구 모음: 전역 설정 및 여러 패널의 토글에 액세스하려면 다음과 같이 하세요.
노드 작업 공간: VFX 그래프 구성 및 편집하기
Blackboard: 그래프 전체에서 재사용할 수 있는 프로퍼티 및 전역 변수를 관리하려면 다음과 같이 하세요.
VFX 제어판: 첨부된 게임 오브젝트의 재생을 수정하려면 다음과 같이 하세요.
에디터 레이아웃에 인스펙터를 위한 공간을 남겨 두어야 합니다. 그래프의 일부를 선택하면 파티션 옵션 및 렌더링 상태와 같은 특정 매개변수가 노출될 수 있습니다.
창의 작업 공간 내부의 노드 네트워크에서 시각 효과를 빌드해야 합니다. VFX 그래프는 셰이더 그래프와 같은 다른 노드 기반 툴과 유사한 인터페이스를 사용합니다.
스페이스바를 누르거나 마우스 오른쪽 버튼을 클릭하여 새 그래프 요소를 만듭니다. 빈 작업 공간 위에 마우스를 놓고 노드 생성을 선택하여 그래프의 컨텍스트, 연산자또는 Property. 기존 컨텍스트 위로 마우스를 가져가면 블록 만들기를 사용합니다.
복잡한 VFX 그래프를 여는 것은 처음에는 어려울 수 있습니다. 다행히 프로덕션 수준의 그래프에는 수백 개의 노드가 포함될 수 있지만, 모든 그래프는 크기에 관계없이 동일한 규칙을 따릅니다.
VFX 그래프의 각 부분을 살펴보고 이들이 어떻게 함께 작동하는지 알아보겠습니다.
위 이미지에서 빈 파티클 시스템 그래프에 네 개의 컨텍스트가 있는 것을 확인할 수 있습니다.
컨텍스트 간의 흐름에 따라 파티클 스폰 및 시뮬레이션 방식이 결정됩니다. 각 컨텍스트는 한 단계의 계산을 정의합니다:
Spawn: 생성할 파티클 수와 스폰 시기(예: 한 번에, 반복, 딜레이 포함 등)를 결정합니다.
초기화합니다: 파티클의 시작 어트리뷰트, 용량(최대 파티클 수) 및 바운드(이펙트가 렌더링되는 볼륨)를 결정합니다.
업데이트: 매 프레임 파티클 프로퍼티를 변경합니다. 여기서 포스를 적용하고, 애니메이션을 추가하고, 콜리전을 생성하거나, 부호화된 디스턴스 필드(SDF)와 같은 상호작용을 설정할 수 있습니다.
출력: 파티클을 렌더링하고 최종 모양(색상, 텍스처, 방향)을 결정합니다. 각 시스템은 유연성을 극대화하기 위해 여러 출력을 가질 수 있습니다.
시스템과 컨텍스트는 그래프의 '수직 로직' 또는 처리 워크플로우의 중추를 형성합니다. 시스템의 데이터는 위에서 아래로 흐르며, 그 과정에서 발생하는 각 컨텍스트는 시뮬레이션에 따라 데이터를 수정합니다.
시스템은 유연하므로 필요에 따라 컨텍스트를 생략하거나 여러 출력을 서로 연결할 수 있습니다.
컨텍스트 자체는 개별 블록에 따라 다르게 작동하며, 블록은 위에서 아래로 데이터를 유사하게 계산합니다. 더 많은 블록을 추가하고 조작하여 해당 데이터를 처리할 수 있습니다.
컨텍스트의 오른쪽 상단에 있는 버튼을 클릭하여 시스템의 시뮬레이션 공간을 로컬과 월드 간에 전환할 수 있습니다.
컨텍스트 및 블록의 전체 목록은 노드 라이브러리를 참조하세요.
블록은 컬러에 대한 간단한 값 저장부터 노이즈, 포스, 콜리전과 같은 복잡한 연산까지 거의 모든 작업을 수행할 수 있습니다. 왼쪽에 오퍼레이터와 프로퍼티의 입력을 받을 수 있는 슬롯이 있는 경우가 많습니다.
시스템이 그래프의 수직적 로직의 대부분을 구성하는 것처럼 오퍼레이터는 속성 워크플로우의'수평적 로직'을 구성합니다. 사용자 지정 표현식이나 값을 블록에 전달하는 데 도움이 될 수 있습니다.
연산자는 셰이더 그래프 노드처럼 왼쪽에서 오른쪽으로 흐릅니다. 값을 처리하거나 다양한 계산을 수행하는 데 사용할 수 있습니다.
노드 만들기 메뉴(마우스 오른쪽 버튼을 클릭하거나 스페이스바를 누름)를 사용하여 연산자 노드를 만듭니다.
속성은 속성 워크플로를 사용하여 그래프 요소에 연결되는 편집 가능한 필드입니다. 속성이 될 수 있습니다:
정수, 부동 소수점, 부울을 포함한 모든 유형
벡터 및 색상과 같은 컴파운드 구성 요소로 만들어졌습니다.
로컬 또는 월드 스페이스; L 또는 W를 클릭하여 전환합니다.
속성은 그래프에서 실제 값에 따라 값이 변경됩니다. 입력 포트(속성 왼쪽에 있음)를 다른 그래프 노드에 연결할 수 있습니다.
속성 노드는 그래프의 여러 지점에서 동일한 값을 재사용할 수 있는 연산자입니다. 이러한 속성에는 Blackboard에 표시되는 해당 글로벌 속성이 있습니다.
Blackboard라는 유틸리티 패널은 그래프 전체에서 속성 노드로 여러 번 나타날 수 있는 전역 속성을 관리합니다.
Blackboard의 속성은 다음과 같습니다:
노출됨: 노출된 속성 왼쪽의 녹색 점은 그래프 외부에서 해당 속성을 보고 편집할 수 있음을 나타냅니다. 스크립트를 통해 인스펙터에서 노출된 프로퍼티 클래스를 사용하여 노출된 프로퍼티에 액세스합니다.
상수: 녹색 점이 없는 Blackboard 속성은 상수입니다. 그래프 내에서 재사용할 수 있지만 인스펙터에는 표시되지 않습니다.
새 프로퍼티는 기본적으로 노출되어 있으므로 인스펙터에 표시됩니다. 그래프 외부에서 속성을 숨기려면 노출됨 옵션을 선택 취소하고 카테고리를 만들어 속성을 체계적으로 정리해야 합니다.
그래프 로직이 늘어날수록 그룹 노드와 스티커 메모를 사용해 복잡함을 줄이세요. 그룹 노드를 사용하면 노드 그룹에 레이블을 지정하여 하나의 그룹으로 이동할 수 있습니다. 반면, 스티커 메모는 코드 주석처럼 작동합니다.
그룹 노드를 만들려면 노드 그룹을 선택하고 마우스 오른쪽 버튼으로 클릭한 다음 컨텍스트 메뉴에서 그룹 선택을 선택합니다. Shift 키를 누른 상태에서 노드를 기존 그룹 노드에 끌어다 놓아 노드를 끌어낼 수도 있습니다. 삭제 키를 사용하거나 컨텍스트 메뉴에서 그룹 노드를 삭제해도 포함된 노드는 삭제되지 않습니다.
한편, 스티커 메모를 사용하여 그래프 섹션의 작동 방식을 설명하고 자신이나 팀원에게 댓글을 남길 수 있습니다. 필요한 만큼 스티커 노트를 추가하고 자유롭게 이동하거나 크기를 조정할 수 있습니다.
하위 그래프는 단일 노드로 표시되므로 그래프 로직을 깔끔하게 정리하는 데 도움이 됩니다. 이를 사용하여 VFX 그래프의 일부를 별도의 에셋으로 저장하면 다른 VFX 그래프에 드롭하여 재구성하고 재사용할 수 있습니다.
하위 그래프를 만들려면 노드 집합을 선택한 다음 마우스 오른쪽 메뉴에서 하위 그래프 연산자로 변환을 선택합니다. 에셋을 디스크에 저장하고 노드를 하나의 서브그래프 노드로 변환합니다. 시스템, 블록 및 오퍼레이터를 다양한 유형의 하위 그래프로 패키징할 수 있습니다.
서브그래프를 만드는 것은 코드 리팩토링과 유사합니다. 로직을 재사용 가능한 메서드나 함수로 구성하는 것처럼, 서브그래프는 VFX 그래프의 요소를 보다 모듈화합니다.
VFX 그래프는 세 가지 레벨의 편집을 지원합니다:
에셋 인스턴스 구성: 이를 사용하여 기존 VFX 그래프를 수정할 수 있습니다. 디자이너와 프로그래머 모두 인스펙터에서 노출된 파라미터를 조정하여 이펙트의 모양, 타이밍 또는 설정을 조정할 수 있습니다. 아티스트는 외부 스크립팅이나 이벤트를 사용하여 미리 작성된 콘텐츠를 변경할 수도 있습니다. 이 수준에서는 각 그래프를 블랙박스로 취급합니다.
VFX 에셋 제작: 여기에서 창의력을 마음껏 발휘할 수 있습니다. 오퍼레이터 노드 네트워크를 구축하여 나만의 VFX 그래프를 만들고, 커스텀 동작과 파라미터를 설정하여 커스텀 시뮬레이션을 만들 수 있습니다. 기존 샘플을 리핑하든 처음부터 새로 시작하든 특정 효과에 대한 소유권을 가질 수 있습니다.
VFX 스크립팅: 이는 숙련된 테크니컬 아티스트나 그래픽 프로그래머가 컴포넌트 API를 사용하여 VFX 그래프의 동작을 커스터마이징할 수 있도록 지원합니다. VFX 스크립팅을 사용하면 특정 효과를 관리하는 파이프라인을 보다 효율적으로 관리하고 그래픽 버퍼와 같은 고급 기능에 액세스할 수 있습니다.
어트리뷰트는 파티클의 색상, 위치, 스폰할 파티클의 수와 같이 시스템 내에서 사용할 수 있는 데이터 조각입니다.
노드를 사용하여 속성에서 읽거나 쓸 수 있습니다. 특히
파티클 또는 파티클 스트립 시스템의 어트리뷰트에서 읽을 어트리뷰트 연산자 가져오기
실험적 스포너 콜백 을 사용하여 스폰 시스템의 어트리뷰트에서 읽을 수 있습니다.
속성 블록을 설정하여 속성 값을 직접 설정하거나 임의 모드(예: 무작위 그라데이션 또는 구성 요소별 무작위 블록으로 색상 속성을 설정)를 사용하여 속성에 값을 씁니다.
전체 속성 목록은 문서를 참조하세요.
참고: 시스템은 필요할 때만 속성을 저장합니다. 메모리를 절약하기 위해 불필요한 데이터는 저장하지 않습니다. VFX 그래프가 어트리뷰트의 시뮬레이션 데이터를 저장하지 않았다는 것을 읽으면 어트리뷰트는 기본 상수 값을 전달합니다.
VFX 그래프의 다양한 부분은 이벤트를 통해 서로(그리고 씬의 나머지 부분과) 통신합니다. 예를 들어 각 스폰 컨텍스트에는 파티클 스폰을 제어하는 이벤트를 수신하는 시작 및 중지 흐름 포트가 있습니다.
어떤 일이 발생하면 외부 게임 오브젝트는 C# API의 SendEvent 메서드를 사용하여 그래프의 일부에 알릴 수 있습니다. 그러면 시각 효과 컴포넌트는 이벤트를 문자열 이름 또는 속성 ID로 전달합니다.
이벤트 컨텍스트는 그래프 내의 이벤트 문자열 이름 또는 ID로 이벤트를 식별합니다. 위 예제에서 씬의 외부 오브젝트는 OnPlay 이벤트를 발생시켜 스폰 시스템을 시작하거나 OnStop 이벤트를 발생시켜 중지할 수 있습니다.
출력 이벤트와 출력 이벤트 핸들러. 출력 이벤트는 파티클의 초기 스폰이 씬의 다른 무언가를 구동해야 하는 경우에 유용합니다. 이는 조명이나 게임플레이를 시각 효과와 동기화하는 데 일반적으로 사용됩니다.
위의 예제는 그래프 외부의 게임 오브젝트 컴포넌트에 OnReceivedEvent를 전송합니다. 그러면 C# 스크립트가 그에 따라 반응하여 빛이나 불꽃을 강화하거나 불꽃을 활성화하는 등의 작업을 수행합니다. 출력 이벤트에 대한 자세한 내용은 VFX 그래프 전자책의 인터랙티비티 섹션을 참조하세요.
동시에 GPU 이벤트를 사용하여 다른 파티클 동작에 따라 파티클을 스폰할 수 있습니다. 이렇게 하면 한 시스템에서 파티클이 죽으면 다른 시스템에 알림을 보내 사망 시 먼지 이펙트를 스폰하는 발사체 파티클과 같은 유용한 연쇄 효과를 생성할 수 있습니다.
이러한 업데이트 블록은 다음과 같은 방식으로 GPU 이벤트 데이터를 전송할 수 있습니다:
죽을 때 이벤트 트리거: 파티클이 죽으면 다른 시스템에 파티클을 스폰합니다.
이벤트 속도 트리거: 초당(또는 속도에 따라) 파티클을 스폰합니다.
항상 이벤트 트리거: 매 프레임 파티클 스폰
블록의 출력은 GPU 이벤트 컨텍스트에 연결되며, 종속 시스템의 초기화 컨텍스트에 이를 알릴 수 있습니다. 이러한 방식으로 서로 다른 시스템을 연결하면 풍부하고 복잡한 파티클 이펙트를 만들 수 있습니다.
GPU 이벤트 시스템의 초기화 컨텍스트는 트리거 이벤트 이전에 부모 시스템에서 사용 가능한 어트리뷰트를 상속할 수도 있습니다. 예를 들어, 위치를 상속하면 새 파티클이 생성된 원래 파티클과 같은 위치에 나타납니다.
이벤트 속성 페이로드를 사용하여 이벤트와 함께 3D 위치 또는 색상과 같은 데이터를 전달합니다. 이러한 페이로드는 오퍼레이터 또는 블록에서 데이터를 "포착"할 수 있는 그래프를 암시적으로 이동하는 어트리뷰트를 전달합니다.
스폰 이벤트 또는 타임라인 이벤트와 함께 전달된 어트리뷰트를 읽을 수도 있습니다. 의 SpawnEvent 어트리뷰트 설정 블록 은 스폰 컨텍스트의 이벤트 어트리뷰트를 수정합니다.
초기화 컨텍스트에서 페이로드를 잡으려면 소스 어트리뷰트 연산자 가져오기 또는 어트리뷰트 블록 상속을 사용합니다.
그러나 이벤트 속성을 사용할 때는 이러한 주의 사항을 염두에 두는 것이 중요합니다:
일반 이벤트 속성은 초기화 컨텍스트에서만 읽을 수 있습니다. 업데이트 또는 출력에서는 상속할 수 없습니다. 나중에 컨텍스트에서 어트리뷰트를 사용하려면 초기화에서 상속하여 설정해야 합니다.
출력 이벤트 어트리뷰트는 스폰 컨텍스트에 설정된 초기 값만 전달합니다. 그래프에서 나중에 발생하는 변경 사항을 포착하지 못합니다.
자세한 내용은 시각 효과 컴포넌트 API에서 이벤트 보내기를 참조하세요.
VFX 그래프는 그 부분의 합 이상의 의미를 지닙니다. 이를 위해서는 노드와 오퍼레이터를 적용하는 방법과 이들이 함께 작동하는 방식에 대한 확실한 이해가 필요합니다.
패키지 관리자의 VFX 그래프 추가 기능에는 몇 가지 간단한 그래프가 포함되어 있어 파티클 관리 방법을 배우기 위한 좋은 출발점이 됩니다.
다음 섹션에서는 제공된 샘플을 살펴보면서 만나게 될 몇 가지 일반적인 블록과 연산자에 대해 소개합니다.
애니메이션 텍스처는 효과를 사실적으로 만드는 데 큰 도움이 됩니다. 외부 디지털 콘텐츠 제작 (DCC) 툴 또는 Unity 내에서 생성할 수 있습니다. 연산자를 사용하여 플립북 블록.
Unity에서 나만의 플립북을 제작하는 방법에 대한 자세한 내용은 VFX 그래프 전자책의 이미지 시퀀서 섹션에서 확인할 수 있습니다.
시각 효과 서브그래프는 다른 시각 효과 그래프 또는 서브그래프에서 사용할 수 있는 시각 효과 그래프의 일부가 포함된 에셋입니다. 하위 그래프는 단일 노드로 표시됩니다.
그래프에서 하위 그래프는 다음 세 가지 방법으로 사용할 수 있습니다:
시스템 하위 그래프: 하나의 그래프에 포함된 하나 또는 여러 시스템
하위 그래프를 차단합니다: 블록과 연산자가 함께 패키징되어 블록으로 사용되는 집합입니다.
연산자 하위 그래프: 함께 패키징되어 연산자로 사용되는 연산자 집합입니다.
하위 그래프를 사용하면 그래프에서 자주 사용되는 노드 집합을 재사용 가능한 에셋으로 분해하여 라이브러리에 추가할 수 있습니다.
무료 전자책 받기
120페이지 분량의 전자책 ' Unity에서 고급 시각 효과를 제작하는 완벽한 가이드'는 아티스트, 디자이너, 프로그래머가 Unity 2021 LTS 버전의 VFX 그래프를 사용할 수 있도록 안내합니다. 전문가들이 집필한 이 책은 게임에 풍부한 레이어를 적용한 실시간 시각 효과를 구현하는 데 도움이 되는 참고서입니다.