지오메트리 스크립팅 개요
지오메트리 스크립팅은 블루프린트(BP) 및 Python을 통해 메시 지오메트리를 생성 및 편집할 수 있는 함수 라이브러리 세트를 포함하는 언리얼 엔진 플러그인입니다. 제공되는 모든 함수 목록은 지오메트리 스크립팅 레퍼런스 페이지를 참조하세요.
지오메트리 스크립팅 UFunctions 및 블루프린트 노드는 UDynamicMesh 오브젝트에서 작동하며, 이는 FDynamicMesh3 C++ 트라이앵글 메시 데이터 구조체를 사용하여 생성되는 오브젝트입니다. 이 데이터 구조체는 지오메트리 프로세싱(Geometry Processing) 플러그인 및 모델링(Modeling) 에디터 모드에서 사용되는 것과 동일한 것입니다.
지오메트리 스크립팅은 에디터 유틸리티 위젯 및 에셋 액션 에서 커스텀 메시 분석, 프로세싱 및 편집 툴을 생성하는 데 사용될 수 있습니다. 액터 블루프린트 에서 프로시저럴 오브젝트를 생성하고 복잡한 지오메트릭 쿼리를 구현하는 데 사용될 수도 있습니다.
지오메트리 스크립팅은 잠재적으로 다음과 같은 경우에 사용할 수 있습니다.
- 서드 파티 메시 임포트 툴 테스트 및 퀄리티 분석
- 메시 UV를 분석하여 낭비된 텍스처 스페이스가 있는 에셋 식별
- 프로덕션 워크플로를 위한 스크립트식 메시 에셋 병합
- 라이라 샘플 게임에서 사용된 레벨 디자인 툴 등과 같은 프로시저럴 메시 액터
플러그인 활성화
지오메트리 스크립팅을 사용하려면 관련 플러그인을 활성화해야 합니다.
플러그인을 활성화하거나 이미 활성화되어 있는지 확인하려면 다음을 수행합니다.
-
메뉴 바 에서 편집 > 플러그인 을 선택합니다.
-
검색창에 "geometry script"를 입력합니다.
- Geometry Script 플러그인을 활성화하고 대화 상자 팝업에서 Yes 를 선택합니다.
- 엔진을 재시작합니다.
DynamicMesh 오브젝트
지오메트리 스크립팅은 다음과 같은 몇 가지 새로운 오브젝트 타입에서 작동합니다.
UDynamicMeshUDynamicMeshComponentADynamicMeshActor
스태틱 메시, 스태틱 메시 컴포넌트, 스태틱 메시 액터 아키텍처와 유사하게 이러한 클래스는 지오메트리 스크립팅 플러그인의 일부가 아니며, 지오메트리 프레임워크 엔진 모듈 내에 위치하여 지오메트리 스크립팅과 별개로 사용됩니다.
다이내믹 메시
지오메트리 스크립팅을 지원하는 핵심 컴포넌트는 UDynamicMesh 오브젝트입니다. UObject 는 특정 컴포넌트에 연결되지 않은 메시 데이터 구조체를 위한 컨테이너입니다. 이는 메시 지오메트리를 명시적인 씬 표현 없이도 생성 및 조작 가능하다는 점에서 UProceduralMeshComponent 등 이전의 언리얼 엔진 접근법과 다릅니다.
예를 들어 UDynamicMesh 는 UStaticMesh 에셋을 기반으로 초기화되고 편집된 다음 에셋에 다시 저장될 수 있습니다. 에디터 유틸리티 위젯과 결합되어 유저 인터페이스를 제공하는 이 접근법은 테크 아티스트가 특정 용도로 빌드된 커스텀 메시 편집 툴을 블루프린트에서 생성하거나 Python을 통해 메시 에셋 쿼리/편집 작업을 스크립팅할 수 있도록 지원합니다.
게임플레이 볼륨(Gameplay Volumes) 등 다양한 에디터 메시 지오메트리 타입도 UDynamicMesh 로 변환되거나 여기에서 지오메트리로 변환될 수 있습니다.
다이내믹 메시 컴포넌트
UDynamicMesh 뿐 아니라 UDynamicMeshComponent 또한 '실제', 즉 트랜션트가 아닌 시리얼라이즈 가능한 컴포넌트로 승격되었습니다. 이 컴포넌트는 실질적으로 UProceduralMeshComponent 와 유사하지만 UDynamicMesh 를 기반으로 하며, 지오메트리 스크립팅을 통해 조작할 수 있습니다.
UDynamicMeshComponent 는 지난 수년 동안 메시 모델링 툴세트의 일부로 개발되었으며, 메시 편집의 리얼타임 프리뷰를 제공하는 데 사용되었습니다. UProceduralMeshComponent 와 유사하게 UDynamicMeshComponent 는 메시 지오메트리에 대한 업데이트를 지원합니다. 이때 버텍스 어트리뷰트만 업데이트하는 것이 아니라 전체 메시 토폴로지를 생성 및 수정합니다. 이와 같은 작업은 에디터에서 뿐만 아니라 런타임에서도 모두 수행할 수 있습니다.
레이 트레이싱은 지원되지만 나나이트와 루멘은 지원되지 않습니다.
다이내믹 메시 액터
ADynamicMeshActor 는 AStaticMeshActor 와 유사하며 기본적으로는 UDynamicMeshComponent 에 대한 컴포넌트입니다. 하지만 다이내믹 메시 액터는 UDynamicMesh 기반 프로시저럴 메시 생성을 구현하는 액터 블루프린트에 대해 특정한 지원을 제공합니다.
다이내믹 메시 액터를 사용하면 지오메트리 스크립팅과 모델링 모드 툴에서 볼륨 외에도 메시 액터 유형을 만들고 편집할 수 있습니다.
GeneratedDynamicMeshActor
AGeneratedDynamicMeshActor 는 ADynamicMeshActor 의 서브클래스이며 블루프린트 기반 프로시저럴 메시 액터 구현을 위한 추가 지원을 제공합니다. 특히 이 클래스는 컨스트럭션 스크립트 를 사용하는 대신 BP 서브클래스에서 메시를 생성하기 위해 구현될 수 있는 On Rebuild Generated Mesh 함수를 제공합니다. 이 함수로 에디터 내에서의 인터랙티브 퍼포먼스를 향상할 수 있으며 향후 대규모 프로시저럴 지오메트리 생성을 세밀하게 관리할 수 있습니다.
Event On Rebuild Generated Mesh 는 GeneratedDynamicMeshActor 클래스에서 파생된 액터 블루프린트에만 존재합니다. 또한 Generated Dynamic Mesh Actor 함수는 현재 에디터 전용입니다.
UStaticMesh와 UDynamicMesh의 주요 차이점
UStaticMesh 와 달리 UDyanmicMesh 는 에셋이 아닙니다. UDynamicMeshComponent 는 UDynamicMesh 를 소유하며, UStaticMesh 와 달리 여러 컴포넌트 간에 공유되지 않습니다.
예를 들어 인스턴스드 렌더링은 사용할 수 없습니다.
다이내믹 메시는 별도의 에셋 파일 대신 레벨에만 저장됩니다. UDynamicMeshComponent 를 복제하면 메시의 사본이 생성됩니다(인스턴스 대신 새 메시를 생성합니다). 레벨 또는 프로젝트 간 전송은 복사 및 붙여넣기를 통해 수행해야 합니다.
여러 측면에서 UDynamicMeshComponent 는 Autodesk 3ds Max, Autodesk Maya, Blender 등 DCC 툴의 메시 오브젝트와 훨씬 유사하게 작동합니다. 이는 대규모 메시의 레벨 파일 크기가 대폭 증가하는 잠재적인 문제를 수반합니다. 하지만 액터당 한 개의 파일(One File Per Actor) 기능을 통해 메시 데이터는 레벨이 아닌 OFPA 액터 파일로 저장됩니다. 따라서 여전히 크기는 하지만 별개의 파일이 됩니다.
함수 패턴
지오메트리 스크립팅 함수 대부분은 아래의 Apply Mesh Plane Cut 노드와 유사한 매우 표준적인 패턴을 따릅니다.
첫 실행인자인 타깃 메시(Target Mesh) 는 해당 연산에 의해 편집되는 UDynamicMesh 입니다. 일반적으로 지오메트리 스크립팅 연산은 새 메시를 생성하기보다는 입력 메시를 수정하여 임시 메시 오브젝트가 생성되는 것을 방지합니다. UDynamicMesh 는 항상 출력으로 반환되므로 타깃 메시 라고도 합니다(동일한 이름==동일한 오브젝트). 이를 통해 여러 연산을 연속적으로 처리할 수 있게 됩니다.
지오메트리 스크립팅 노드는 다양한 파라미터 및 세팅을 갖습니다. 자주 사용되는 옵션은 실행인자로 노출되지만, 그보다 많은 옵션은 연산별 옵션(Options) 구조체를 통해 제공됩니다. 적절한 옵션 구조체를 생성하는 가장 일반적인 방법은 빈 옵션 핀에서 드래그하는 것입니다. 또한 옵션 핀을 우클릭하고 구조체 핀 분할(Split Struct Pin) 컨텍스트 메뉴 항목을 사용하여 아래와 같이 노드에서 옵션 구조체를 직접 확장할 수도 있습니다.
대부분의 노드에는 메시 제너레이터를 위한 지오메트릭 디버깅 지원을 제공하는 디버그 핀도 있습니다. 이는 자주 사용되지는 않지만 미래의 함수 기능을 위한 자리표시자입니다.
UDynamicMesh 풀 사용하기
메인 메시에서 빼기 위해 프리미티브 메시를 사용하는 것과 같이 메시 제너레이터 내에 임시 메시를 생성하는 것은 드문 경우가 아닙니다. 이렇게 하려면 임시 UDynamicMesh 가 필요합니다. Construct Object From Class 함수를 사용하여 생성할 수도 있지만, 프로시저럴 제너레이터에서 생성하는 경우 메시는 사용 후 가비지 콜렉션되어야 합니다. 제너레이터를 자주 실행하는 경우에는 실행 시 메시를 재사용하는 것이 더 효율적입니다.
다이내믹 메시 액터에는 UDynamicMeshPool 을 사용하여 이를 지원하는 기능이 내장되어 있습니다. 이 설정은 Allocate Comput eMesh 를 호출하여 임시 메시를 가져와 블루프린트 실행 패스가 끝나기 전의 지점에서 해제합니다. 각 임시 메시는 Release Compute Mesh 를 사용하여 명시적으로 해제하거나 Release AllCompute Meshes 를 호출하여 현재 풀에서 할당된 모든 임시 메시를 반환할 수 있습니다.
에디터 유틸리티 위젯에는 메시를 할당할 디폴트 다이내믹 메시 풀 인스턴스가 없지만 Create Dynamic Mesh Pool 을 사용하여 생성할 수 있습니다. 예를 들어 에디터 유틸리티 위젯 또는 유틸리티 블루프린트의 변수로 생성할 수 있습니다.
프로시저럴 메시 오브젝트 생성하기
앞서 언급했듯이, 지오메트리 스크립팅의 한 가지 사용 사례는 액터 블루프린트를 사용하여 프로시저럴 메시를 만드는 것입니다. 아래 예제에서는 Generated Dynamic Mesh Actor 의 BP 서브클래스를 사용합니다. Event On Rebuild Generated Mesh 는 UDynamicMeshComponent 의 UDynamicMesh 를 채웁니다. UDynamicMesh 는 지오메트리 스크립팅 함수 Append Box에 전달되어 입력 변수를 기반으로 메시를 생성합니다.
아래 클립에서는 이 BP 액터 인스턴스를 사용하는 예시를 보여줍니다. 이 예시에서는 몇 개의 BP 노드만으로 파라미터형 박스 프리미티브 메시를 생성합니다. 추가 노드를 더하면 매우 복잡한 메시 제너레이터를 블루프린트에서 직접 빌드할 수 있습니다. 현재 지오메트리 스크립트 라이브러리에서는 150개 이상의 메시 생성 및 편집용 함수/노드가 제공됩니다. 이 스크립트는 파라미터 박스 프리미티브 메시를 생성하여 아티스트가 몇 개의 BP 노드만으로 에디터 내에서 조정할 수 있는 파라미터를 생성합니다. 노드를 추가하면 블루프린트에서 직접 점점 더 복잡한 메시 제너레이터를 빌드할 수 있습니다. 이 스크립트를 확장하고 지오메트리 스크립팅에 대해 계속 배우려면 블루프린트를 통한 지오메트리 스크립팅을 참조하세요.

추가 참고 사항
특정 함수가 있는지 확인하려면 지오메트리 스크립팅 레퍼런스 문서를 참조하세요.
일부 함수(예: Apply PolyGroup Catmull Clark SubD)는 에디터 전용입니다. 이 세팅은 에디터 유틸리티 액터/액션/위젯 또는 생성된 다이내믹 메시 액터 BP 서브클래스에서만 이러한 함수를 사용할 수 있다는 뜻입니다.
대부분의 지오메트리 스크립팅 함수는 UDynmicMesh 오브젝트에서만 작동합니다. 스태틱 메시, 스켈레탈 메시 또는 볼륨 액터에서 내부 메시 표현을 UDynamicMesh로 변환하는 함수와 다시 역으로 변환하는 함수가 있습니다. 랜드스케이프, 지오메트리 캐시 또는 컬렉션, 그룸, 클로스와 같은 다른 지오메트리 유형에 대한 함수는 존재하지 않습니다.
현재 UDynamicMeshComponent 는 다음 기능을 지원하지 않습니다:
- 나나이트
- 루멘
- 메시 디스턴스 필드
- LOD
- 인스턴스드 렌더링
액터 블루프린트 및 에디터 유틸리티 블루프린트는 항상 게임 스레드에서 실행되므로, 호출되는 지오메트리 스크립팅 함수도 게임 스레드에서 실행됩니다. 일부 지오메트리 스크립팅 함수는 내부적으로 작업 스레드에서 작업의 일부를 수행합니다(예: ParallelFor, Async 또는 UE::Tasks::Launch() 에 대한 C++ 호출). 그러나 이는 단일 함수의 컨텍스트에서만 발생하며, 해당 함수는 모든 병렬 작업이 완료될 때까지 반환되지 않습니다.