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

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