뮤터블이란?
뮤터블(Mutable)은 에디터나 런타임에 다이내믹 스켈레탈 메시, 머티리얼, 텍스처를 생성하는 언리얼 엔진의 툴세트입니다. 아티스트와 디자이너가 캐릭터 커스터마이징 시스템을 제작할 수 있도록 디자인되었으나 동물, 소품, 기타 스켈레탈 메시 에셋 등 다양한 다이내믹 콘텐츠를 생성할 수 있습니다.
뮤터블은 게임 내에서 사용할 때 효율적으로 실행되도록 설계되었을 뿐 아니라, 언리얼 에디터 내에서 수많은 스켈레탈 메시 베리에이션을 유연하게 생성해야 하는 프로젝트의 콘텐츠 파이프라인 툴로도 유용합니다.
뮤터블은 다음과 같은 기능을 선보이도록 설계되었습니다.
파라미터와 텍스처 레이어를 많이 사용하는 깊이 있는 커스터마이징을 지원합니다.
복잡한 메시 인터랙션을 지원합니다.
래핑 프로젝션 및 여러 평면 프로젝션과 같이 GPU 퍼포먼스를 지원하지 않는 텍스처 효과를 지원합니다.
메모리 사용량을 최적화합니다.
셰이더 비용을 절감합니다.
드로 콜 횟수를 줄입니다.
뮤터블을 사용하면 캐릭터 생성 시의 CPU 및 메모리 비용 일부를 이동할 수 있습니다. 캐릭터는 CPU 리소스와 작업 메모리를 일정량 사용하여 백그라운드에서 생성되며, 생성 후에는 사전 생성된 스켈레탈 메시의 리소스만 사용합니다.
뮤터블 기능
뮤터블에는 다음과 같은 기능이 포함되어 있습니다.
일반
유연한 파라미터 시스템은 커스터마이징 가능한 오브젝트를 다수의 이펙트와 연결합니다.
커스터마이징 가능한 캐릭터를 다수의 에셋으로 분할하여 아티스트의 동시 작업을 용이하게 합니다.
Mesh
숨은 파트를 제거하여 퍼포먼스를 극대화하고 Z 파이팅을 방지합니다.
캐릭터 생성 시 모프를 굽습니다.
메시를 병합하여 드로 콜을 줄입니다.
캐릭터 부위 간의 인터랙션을 기반으로 메시를 변형합니다.
텍스처
런타임에 다수의 이펙트를 결합하여 텍스처 이미지를 굽습니다.
평면형, 원통형, 래핑형과 같은 여러 타입의 프로젝터를 지원합니다.
Multiply, Soft light, Hard light, Burn, Dodge 등 다수의 텍스처 블렌딩 모드를 지원합니다.
UV 레이아웃을 관리하여 불필요한 텍스처 파트를 동적으로 제거합니다.
애니메이션 및 피직스
여러 파트의 애니메이션 그래프를 결합합니다.
콜리전 피직스 에셋을 메시와 병합하고 변형합니다.
캐릭터 생성 시 클로스 시뮬레이션 데이터를 관리합니다.
퍼포먼스
커스터마이징된 캐릭터를 유연하게 인스턴스화합니다.
런타임 때 LOD 관리를 지원합니다.
다양한 사용 사례에 맞게 캐릭터 생성을 조정할 수 있도록 다양한 상태를 지원합니다.
온디맨드 생성을 통한 텍스처 스트리밍을 지원합니다.
커스터마이징 가능 오브젝트 및 액터
아래 다이어그램을 보면 캐릭터 커스터마이징에 메시, 텍스처, 머티리얼이 어떻게 사용되는지 확인할 수 있습니다. 이 시스템의 주요 콘셉트는 커스터마이징 가능 오브젝트(CustomizableObject) 에셋, 커스터마이징 가능 오브젝트 인스턴스(CustomizableObjectInstance) 에셋, 그리고 이러한 에셋을 사용하는 특수 컴포넌트가 있는 액터입니다.
뮤터블은 커스터마이징 가능 오브젝트 에셋, 커스터마이징 가능 오브젝트 인스턴스 에셋, 특수 컴포넌트가 있는 액터를 사용하여 최종 에셋을 생성합니다.
커스터마이징 가능 오브젝트
커스터마이징 가능 오브젝트는 언리얼 엔진에 추가된 새로운 타입의 에셋으로, 뮤터블을 사용하여 커스터마이징이 가능한 오브젝트를 나타냅니다. 커스터마이징 가능 오브젝트는 해당 오브젝트에 적용할 수 있는 모든 베리에이션을 포함합니다. 이 오브젝트는 런타임 때 플레이어나 게임 코드가 제어하는 파라미터 또는 이러한 파라미터가 최종 오브젝트에 영향을 미치는 방식을 정의합니다.
콘텐츠 드로어(Content Drawer) 또는 콘텐츠 브라우저(Content Browser)에서 신규 추가(Add New) 메뉴를 사용하여 커스터마이징 가능 오브젝트를 생성할 수 있습니다.
커스터마이징 가능 오브젝트를 생성합니다.
파라미터
커스터마이징 가능 오브젝트(Customizable Object)에는 런타임에 수정할 수 있는 여러 개의 파라미터가 포함되어 있습니다. 파라미터에는 다음과 같이 여러 타입이 있습니다.
슬라이더 파라미터(Slider parameters): 0.0~1.0 범위의 소수점이 있는 숫자 파라미터입니다. 보통 Float Parameter 노드에 의해 명시적으로 생성되며 텍스처 이펙트나 메시 모프와 같은 연속 이펙트에 사용됩니다.
열거형 파라미터(Enumeration parameters): 사전 정의된 옵션 세트의 옵션을 나타냅니다. 자손 오브젝트를 선택하도록 Object Group 노드를 사용하여 생성하거나, 하나의 옵션 또는 다수의 Switch 노드를 선택하도록 Enum Parameter 노드를 사용하여 생성할 수 있습니다.
체크박스 파라미터(Checkbox parameters): 활성화 또는 비활성화라는 두 가지 가능성을 나타냅니다. 그룹 타입이 '각각 토글(Toggle Each)'인 경우 Object Group 노드에 의해 생성됩니다.
컬러 파라미터(Color parameters): 0.0에서 1.0 사이의 플로트 숫자 값 4개로 구성된 벡터를 사용하여 알파 채널을 포함한 컬러를 나타냅니다. Color Parameter 노드에 의해 생성됩니다.
프로젝터 파라미터(Projector parameters): 런타임 때 수정할 수 있는 위치가 있는 프로젝터를 나타냅니다. Projector Parameter 노드를 사용하여 생성합니다.
커스터마이징 가능 오브젝트 인스턴스
커스터마이징 가능 오브젝트 인스턴스(Customizable Object Instance)는 언리얼 엔진에 새로 추가된 에셋 타입입니다. 이는 커스터마이징 가능 오브젝트의 인스턴스를 나타내며, 커스터마이징된 에셋을 생성하기 위해 커스터마이징 가능 오브젝트에 적용할 파라미터 값의 세트입니다. 예를 들어, 도적(Bandits)의 커스터마이징 가능 오브젝트가 있는 경우, 이 오브젝트에서 생성한 각각의 고유한 도적은 커스터마이징 가능 오브젝트 인스턴스입니다.
커스터마이징 가능 오브젝트에서 인스턴스 에셋을 만들려면 커스터마이징 가능 오브젝트를 우클릭하여 새 인스턴스 생성(Create New Instance)을 선택합니다.
새로운 커스터마이징 가능 오브젝트 인스턴스를 생성합니다.
뮤터블 에디터
커스터마이징 가능 오브젝트 에디터
커스터마이징 가능 오브젝트를 더블클릭하면 커스터마이징 가능 오브젝트 에디터(Customizable Object Editor)가 열립니다.
커스터마이징 가능 오브젝트 에디터입니다.
이 인터페이스에는 다음과 같은 패널이 포함되어 있습니다.
소스 그래프(Source Graph): LOD 세팅, 메시 섹션, 메시, 텍스처, 파라미터 및 이들을 연결하는 이펙트를 포함하여 커스터마이징 가능 오브젝트의 구조를 정의하는 블루프린트 노드가 포함되어 있습니다.
오브젝트 프로퍼티(Object Properties): 오브젝트의 일반 속성이 포함되어 있습니다.
노드 프로퍼티(Node Properties): 선택한 노드의 속성이 포함되어 있습니다.
프리뷰 인스턴스 뷰포트(Preview Instance Viewport): 오브젝트가 열리고 컴파일될 때 3D 프리뷰를 표시합니다.
프리뷰 인스턴스 파라미터(Preview Instance Parameters): 프리뷰 오브젝트의 현재 파라미터를 표시합니다. 파라미터는 여기에서 직접 수정할 수 있습니다. 또한 현재 인스턴스를 표준 언리얼 엔진 에셋 세트에 '구울' 수도 있습니다. 자세한 내용은 인스턴스 굽기를 참조하세요.
에디터 툴바에 포함된 요소는 다음과 같습니다.
저장(Save): 현재 오브젝트를 저장합니다.
컴파일(Compile): 현재 오브젝트와 그 모든 자손을 함께 컴파일하고 프리뷰를 업데이트합니다. 그래프에 변경사항을 반영하려면 컴파일을 수행해야 합니다. 컴파일과 그 옵션에 대한 자세한 내용은 퍼포먼스 튜닝을 참조하세요.
선택된 항목만 컴파일(Compile Only Selected): 현재 오브젝트와 프리뷰된 자손만 컴파일합니다. 커스터마이징 가능 오브젝트가 매우 클 때, 빠른 반복작업 수행 시 유용합니다.
텍스처 메모리 분석기(Texture Memory Analyzer): 프리뷰 오브젝트의 최종 텍스처와 세부 정보인 최종 크기, 포맷, 메모리 사용량 등을 표시하는 툴 패널을 엽니다.
퍼포먼스 분석기(Performance Analyzer): 현재 오브젝트를 벤치마킹하는 툴 패널을 엽니다. 벤치마킹은 수많은 랜덤 인스턴스를 생성하고, 트라이앵글 수 또는 생성 시간처럼 연관성이 있는 메트릭을 표시하는 방식으로 진행됩니다.
커스터마이징 가능 오브젝트 인스턴스 에디터
커스터마이징 가능 오브젝트 인스턴스 에디터는 커스터마이징 가능 오브젝트 인스턴스를 보고 수정하는 데 쓰입니다. 패널은 두 개뿐이며, 커스터마이징 가능 오브젝트 에디터의 프리뷰(Preview) 및 노드 프로퍼티(Node Properties) 패널과 비슷합니다.
오브젝트 계층구조
Objects
뮤터블은 커스터마이즈 가능 오브젝트를 각각 계층구조로 구성합니다. 각 오브젝트에는 다른 모든 노드에 연결되는 루트 노드가 있습니다. 이러한 노드는 컴포넌트, 메시, 머티리얼, 텍스처, 파라미터를 나타냅니다. 어떤 오브젝트든 원하는 개수의 자손 오브젝트를 가질 수 있습니다. 자손은 다음과 같은 일을 할 수 있습니다.
최종 오브젝트에 새 메시와 메시 섹션 추가
다른 오브젝트에 이미 존재하는 메시 확장
다른 오브젝트에서 메시의 일부 제거
다른 오브젝트에 머티리얼 텍스처 패치하기
시빌링 오브젝트에서 사용할 수 있는 사용자 정의 태그를 활성화하여 다양한 이펙트를 적용할 수 있습니다.
동시에 자손 오브젝트는 자신의 자손 오브젝트를 무제한 계층구조로 가질 수 있습니다.
그룹
자손 오브젝트는 그룹(Groups)으로 구성할 수 있습니다. 그룹은 자손 오브젝트의 활성화 방식과 관련하여 오브젝트와 그 부모 간의 로직을 정의합니다. 예를 들어, 모든 티셔츠 자손은 사용자가 한 번에 하나만 선택하거나 아무것도 선택하지 않도록 하는 오브젝트 파라미터를 사용하여 그룹화할 수 있습니다.
다음은 그룹을 통해 연결된 두 개의 자손 오브젝트입니다.
각 그룹에는 다음 중 하나가 될 수 있는 그룹 타입이 있습니다.
토글(Toggle): 자손 오브젝트가 토글 가능한 옵션으로 표시됩니다.
하나 이상의 옵션(At least one Option): 단일 자손 오브젝트를 반드시 선택해야 합니다.
없음 또는 하나(None or One): 단일 자손 오브젝트를 선택할 수 있습니다.
모든 옵션(All options): 오브젝트의 모든 자손이 항상 활성화됩니다. 자손이 부모에게 직접 연결된 것처럼 행동합니다.
액터 컴포넌트
단일 커스터마이징 가능 오브젝트로 다수의 액터 컴포넌트를 생성할 수 있습니다. 파라미터는 다수의 컴포넌트에 동시에 영향을 줄 수 있는 것은 물론, 조건에 따라 토글할 수도 있습니다. 다수의 컴포넌트를 만들려면 컴포넌트 노드 레퍼런스를 참조하세요.
레퍼런스 스켈레탈 메시
메시 컴포넌트 노드에는 레퍼런스 스켈레탈 메시(Reference Skeletal Mesh)라는 프로퍼티가 있습니다. 이는 표준 언리얼 엔진 스켈레탈 메시로, 다음과 같은 이유로 사용됩니다.
커스터마이징 가능 오브젝트 인스턴스에서 이 컴포넌트에 대해 생성된 모든 스켈레탈 메시는 뮤터블이 생성하거나 수정하지 않는 모든 항목에 레퍼런스 스켈레탈 메시 프로퍼티를 사용합니다. 여기에는 LOD 거리, 피직스 프로퍼티, 바운딩 볼륨, 스켈레톤 등의 데이터가 포함됩니다. 커스터마이징 가능 오브젝트 인스턴스가 처음 생성될 때는 각 액터 컴포넌트에 레퍼런스 스켈레탈 메시가 사용됩니다. 이 기능은 CustomizableObjectSystem 클래스의 'SetReplaceDiscardedWithReferenceMeshEnabled' 함수를 사용하여 비활성화할 수 있습니다. 자세한 내용은 C++에서 뮤터블 사용 및 블루프린트에서 뮤터블 사용 문서를 참조하세요.
이러한 이유로 프로젝트에서는 보통 단순하거나 일반적인 스켈레탈 메시를 레퍼런스 스켈레탈 메시로 사용합니다. 개중 한 가지 옵션은 레퍼런스 스켈레탈 메시를 에디터에서 생성된, 구워진 스켈레탈 메시로 원하는 //일반// 외관으로 대체하는 것입니다. 자세한 정보는 인스턴스 굽기를 참조하세요.
다수의 에셋
대규모의 커스터마이징 가능 오브젝트는 여러 개의 에셋으로 분할할 수 있습니다. 이는 여러 사용자가 동일 데이터로 작업할 때와 버전을 관리할 때 중요합니다. 이를 지원하는 2가지 기능이 있습니다.
자손 오브젝트를 그래프에서 직접 연결하는 대신, 다른 에셋에 있는 오브젝트 그룹의 부모로 선택할 수 있습니다. 자세한 내용은 오브젝트 그룹 및 자손 오브젝트 노드 레퍼런스를 참조하세요.
에디터 데이터에는 유용하지만, 패키지로 만든 게임의 데이터 스트리밍과는 무관합니다. 패키지로 만든 게임의 데이터 스트리밍은 커스터마이징 가능 오브젝트가 다수의 에셋으로 분할되었는지 여부와 관계없이 발생합니다.
오브젝트 인터랙션
뮤터블에는 오브젝트 인터랙션을 처리하는 몇 가지 기능이 있습니다. 하나는 오브젝트 그룹(Object Groups)으로, 단 하나의 자손 오브젝트만 세트에서 선택하는 인스턴스 파라미터를 생성하므로 둘 이상의 오브젝트를 추가할 수 없습니다. 예를 들어 캐릭터 모자 그룹에서 모자를 하나만 선택하거나 아예 선택하지 않을 수는 있지만 두 개를 선택할 수는 없습니다.
또한 뮤터블에는 인스턴스에 추가되는 다른 오브젝트에 따라 한 오브젝트의 베리에이션을 다양하게 생성하는 시스템이 있습니다. 예를 들어 여러 가지 헤어스타일과 모자를 보유한 캐릭터가 있다고 가정해 봅시다. 캐릭터에게 모자 타입이 있는 경우, 헤어스타일의 베리에이션을 몇 개 정도 생성하는 것이 좋습니다. 이럴 때 Mesh Section Variation 및 기타 Variation 노드를 사용할 수 있습니다.
오브젝트 인터랙션의 또 다른 예는, 다른 오브젝트에 존재하는 모디파이어를 사용하여 한 오브젝트에서 메시 조각을 선택적으로 제거하는 것입니다.
이 두 가지 타입의 오브젝트 인터랙션은 태그(Tag) 시스템을 사용합니다. 인스턴스에서 오브젝트가 활성화되어 있을 때 자신만의 태그를 정의하고 활성화할 수 있습니다. Mesh Section 노드에는 태그를 추가할 수 있습니다. 그리고 Mesh Section Variation 또는 Clip Mesh With Mesh Modifier 노드와 같이 해당 인스턴스에 존재하는 태그에 따라 다르게 작동하는 여러 노드가 있습니다.
텍스처 레이아웃
뮤터블은 여러 오브젝트의 메시와 메시 섹션을 단일 메시로 병합할 수 있습니다. 또한 기존 메시에서 메시 조각을 제거할 수도 있습니다. 이 작업을 수행할 때 뮤터블은 텍스처 UV 레이아웃을 수정하여 메모리 사용량을 최적화하고 렌더링 명령을 최소화합니다. 기본적으로 뮤터블은 이 작업을 자동으로 처리하지만, Skeletal Mesh 노드와 Table 노드에 있는 여러 프로퍼티를 통해 수동으로 제어할 수도 있습니다.
자세한 내용은 텍스처 레이아웃을 참조하세요.
상태
상태는 게임 내 특정 사용 사례(게임 내 클로스 커스터마이제이션, 페이셜 커스터마이제이션 등)를 나타내며, 뮤터블이 수정할 수 있도록 준비되는 파라미터 세트로 환경설정할 수 있습니다. 상태는 인스턴스 업데이트를 최적화하는 데 사용됩니다. 예를 들어 한 상태는 페이스 변경사항에 최적화되고, 다른 상태는 바디 변경사항에 최적화되고, 다른 상태는 문신에 최적화되고, 다른 상태는 게임플레이 중에 변경될 수 있는 것들에만 최적화될 수 있습니다. 상태를 사용하면 캐릭터를 위해 선택한 상태에서 최적화된 파라미터만 변경할 때, 캐릭터 업데이트 시간이 훨씬 빨라질 수 있습니다.
자세한 내용은 상태 페이지를 참조하세요.
스트리밍
뮤터블 데이터 스트리밍은 메모리 사용량을 줄이는 데 중요합니다. 커스터마이징 가능한 캐릭터에는 수백 가지 옵션과 커스터마이제이션 파트가 있을 수 있습니다. 데이터 스트리밍이 없으면 이와 같은 요소를 디스크에서 메모리로 동시에 로드해야 하며, 그렇게 할 경우 많은 GB의 RAM을 사용하며 시간도 오래 걸립니다. 뮤터블은 사용 중인 파트만 스트리밍하여 메모리 사용량과 로드 시간을 크게 줄여줍니다. 또한 더 이상 사용하지 않는 파트를 언로드합니다.