지오메트리 스크립팅(Geometry Scripting) 은 언리얼 엔진 5에 도입되는 새로운 실험단계의 플러그인으로서 프로시저럴 메시 액터(Procedural Mesh Actors) (GeneratedDynamicMeshActor) 에 대한 베이스 액터(Actor) 클래스와 해당 액터의 메시 생성에 사용할 수 있는 블루프린트 함수를 제공합니다. 예를 들어, 아래에 표시된 간단한 블루프린트는 액터의 디테일(Details) 패널에 노출된 너비/깊이/높이 블루프린트 변수를 사용하여 크기를 조정할 수 있는 파라메트릭 박스(Parametric Box) 오브젝트가 됩니다.
지오메트리 스크립트 라이브러리(Geometry Script Library) 에는 머티리얼 할당을 구성하고 스태틱 메시 에셋에서 복사하거나 스태틱 메시 에셋으로 복사하기 위한 유틸리티 함수와 다양한 유형의 셰이프 제너레이터, 돌출 및 회전, 메시 부울이 포함된 160개 이상의 대규모 함수 세트가 포함되어 있습니다.
툴 라이브러리
라이라 테크니컬 아티스트들은 블루프린트 액터(Blueprint Actors) 에서 프로시저럴 메시 생성을 사용하여 블루프린트 액터로서 파라메트릭 레벨 디자인 엘리먼트 라이브러리를 빌드했습니다. 이러한 블루프린트를 라이라 프로젝트에서 툴(Tools)(블루프린트 액터 툴) 이라고 하며, 콘텐츠 디렉터리 의 Tools 서브폴더 에 있습니다. 이러한 툴 중 하나를 사용하려면, 툴을 레벨로 드래그한 다음, 액터 디테일 패널 에서 세팅을 사용하여 원하는 부분을 환경설정합니다.
이 문서에서 이러한 파라메트릭 오브젝트를 설명하기 위해 '툴'을 사용하기로 정했습니다. 그렇지만, 제너레이터와 생성된 메시 역시 블루프린트 유저 인터페이스의 몇몇 위치에서 사용되었습니다.
예를 들어, 왼쪽 아래의 이미지는 디폴트 B_Tool_AdvancedWindow 와, 그 액터에서 옵션/파라미터/머티리얼을 변경하여 빌드한 두 가지 다른 변형입니다.
라이라는 아래 테이블에 나열된 블루프린트 액터 툴 을 사용하여 빌드되었습니다.
블루프린트 액터 툴 |
설명 |
이미지 |
---|---|---|
B_ASimpleCubeTool B_GeneratedTube B_GeneratedTube_Advanced B_Tool_AdvancedWindow |
외부에 사각 코너가 있고 열린 부분에 원형 코너가 있는 메시를 생성하는 데 유용하며, 열린 부분을 3D 기즈모(3D Gizmo)로 드래그할 수 있습니다. 여기에는 미러와 커스텀 부울 절단면 옵션이 포함되어 있습니다. |
|
B_Tool_CornerExtrude B_Tool_CornerExtrude1 |
너비와 코너 반경이 균일한 코너 메시를 생성합니다. |
|
B_Tool_Panel_BGM |
코너 반경 컨트롤이 있는 메시를 생성합니다. 이 메시는 너비가 균일하고 고유한 머티리얼 ID를 가진 부울(더하기/빼기/교집합) 인셋 메시입니다. 메시 치수는 드래그할 수 있는 3D 기즈모로 제어하며, 미러와 커스텀 부울 절단면 옵션이 포함되어 있습니다. |
|
B_Tool_RampMakerControl_BGM |
스플라인을 따라 너비와 높이, 깊이 컨트롤이 있는 단순한 직사각형 박스로 구성된 사용자 정의 툴입니다. 게임 뷰 모드(G-key 토글)에서 스플라인 포인트를 확인하고 편집할 수 있습니다. Alt+왼쪽 마우스를 사용하여 드래그하면 새 스플라인 포인트가 끝 스플라인 포인트에 추가됩니다. 이 툴은 단일 메시를 굽습니다. |
|
B_Tool_Repeater |
편집할 수 있는 스플라인을 따라 사용자 정의 치수가 있는 박스 배열을 배포합니다. 이에 대한 예시는 B_Tool_Stairs_BGM 에서 확인할 수 있습니다. |
|
스태틱 메시 에셋에 굽기
파라메트릭(Parametric) 툴 액터 사용 시, 레벨 디자이너는 효과적으로 레벨 레이아웃 프로토타입을 제작할 수 있으며, PIE (에디터에서 플레이(Play-in Editor)) 에서 기본 테스트를 하는 데 이를 사용할 수 있습니다. 이러한 블루프린트의 기반으로 사용된 다이내믹 메시 액터(Dynamic Mesh Actor) 는 기존의 UE StaticMesh 에셋을 사용하지 않습니다. 대신, 효율적인 편집을 위해 고안된 새 컴포넌트 유형인 다이내믹 메시 컴포넌트(Dynamic Mesh Component) 를 사용합니다.
다이내믹 메시 컴포넌트를 사용하면 신속하게 파라메트릭 디자인이 가능하지만, 루멘(Lumen)이나 나나이트(Nanite) 같은 UE 렌더링 기능은 지원하지 않습니다. 또한, 다이내믹 메시 컴포넌트 액터는 인스턴싱을 지원하지 않습니다. 즉, 툴의 복제본은 완전히 별개의 메시라는 뜻입니다. 원래 툴의 파라미터를 변경해도 복제본에는 영향이 없습니다.
레벨 디자인 시 여러 위치에 같은 엘리먼트를 사용하는 경우 이는 문제가 될 수 있는데, 디자이너가 각 복제본의 세팅을 일일이 수동으로 업데이트해야만 하기 때문입니다. 따라서, 블루프린트 툴 액터는 스태틱 메시 에셋에 구워야 하므로 표준 UE 렌더링 아키텍처와 디자인 워크플로를 준수해야 합니다.
이를 지원하기 위해, 툴 액터의 디테일 패널에는 새 스태틱 메시 생성(Generate New Static Mesh) 버튼과 스태틱 메시에 굽기(Bake to Static Mesh) 버튼, 이렇게 두 개의 액션 버튼이 있는 생성 관리(Generation Management) 섹션이 있습니다.
툴 인스턴스의 스태틱 메시 버전을 구우려면 새 스태틱 메시 생성 버튼을 클릭합니다. 버튼을 누르면 액터의 다른 세팅에서 정의된 경로에 자동으로 새 스태틱 메시 에셋이 생성됩니다.
예를 들어, 위의 이미지에서 에셋은 ShooterMaps/Content/Meshes/
Generated 디렉터리에 생성되며, 자동으로 생성된 이름에 접두사로 Mesh_ 가 붙습니다.
이제 이 스태틱 메시 에셋의 인스턴스를 레벨에 배치할 수 있습니다. 생성(Generate) 버튼을 클릭하면, 툴 액터는 스태틱 메시 에셋을 생성하고 타깃 스태틱 메시(Target Static Mesh) 필드에 저장되는지 계속 추적합니다. 그러면 사용자는 스태틱 메시에 굽기 버튼을 클릭하여 언제든 해당 스태틱 메시 에셋을 업데이트할 수 있습니다. 이렇게 하면 툴을 편집하여 레벨에서 더 쉽게 인스턴스를 편집할 수 있습니다.
이 컨텍스트에서 '인스턴스'라는 단어는 스태틱 메시 에셋을 참조하는 레벨의 액터를 의미합니다. 예를 들어, 인스턴싱된 스태틱 메시 컴포넌트(Instanced Static Mesh Component) 인스턴스가 아니라 '에셋의 인스턴스'를 의미합니다.
아래의 gif 이미지에서 이 프로세스를 확인할 수 있습니다. 먼저 새 스태틱 메시 생성 버튼을 눌러 새 에셋을 생성한 다음, 세 개의 개별 인스턴스를 배치하고, 툴을 편집하고 다시 구워 에셋을 업데이트합니다.
새 스태틱 메시 생성 및 스태틱 메시에 굽기 함수 기능은 지오메트리 스크립팅을 사용하여 블루프린트에서 구현됩니다. 이 함수는 BakedGeneratedDynamicMeshActor 라고 하는 생성된 다이내믹 메시 액터(Generated Dynamic Mesh Actor) 의 블루프린트 서브클래스(Blueprint Subclass) 내에 있습니다.
/Content/Tools/BakedGeneratedMeshSystem
디렉터리 폴더에서 이 다이내믹 메시 액터로 이동할 수 있습니다. 모든 툴 블루프린트 액터는 이 베이스 클래스의 서브클래스입니다.
변경 유지 레벨 디자인
위의 섹션에서 설명한 스태틱 메시에 굽기 함수 기능은 파라메트릭 메시 툴을 사용하여 변경 유지 레벨 디자인 을 하는 효율적인 방법을 제공합니다. 레벨 디자이너는 툴을 사용하여 레벨 엘리먼트를 환경설정한 다음, 에셋에 구워 레벨에 인스턴스를 배치합니다. 이렇게 구운 에셋은 나나이트 및 루멘, 효율적인 인스턴싱된 렌더링, 그리고 UE의 다른 모든 스태틱 메시 피처를 지원합니다.
이 시스템의 한 가지 단점은 스태틱 메시 에셋/인스턴스에 대한 일종의 '템플릿'으로서 툴 액터가 레벨에 존재해야 한다는 것입니다. 툴이 삭제되면, 세팅이 사라집니다. 레벨에서 툴을 삭제하지 않고 방해하지 않게 하는 한 가지 방법은 툴을 숨기도록 설정하는 것이지만, 그렇게 하려면 편집하기 위해 툴을 명시적으로 표시한 다음 다시 숨겨야 합니다. 또 다른 방법은 툴을 레벨에서 "방해되지 않는 곳"에 배치하는 것입니다. 라이라에서는 실제 레벨 아래 툴을 배치하는 방식으로 했습니다.
이렇게 한 이유는 예를 들어 L_Expanse 맵을 열었을 때 메인 레벨 아래에 명백하게 무작위로 보이는 많은 오브젝트가 있을 수 있기 때문입니다. 이러한 오브젝트는 레벨 에셋 생성 및 편집에 사용된 툴입니다. 이러한 툴이 제멋대로 구성된 것처럼 보이는 이유는 다음 섹션에 설명되어 있습니다.
툴과 에셋 간 교체
위에서 설명한 에셋 굽기 시스템은 변경 유지 레벨 디자인 파라메트릭 툴 액터를 제공하지만, 여전히 몇 가지 어려움이 있습니다. 특히, 레벨에 배치된 특정 에셋 작성에 사용된 툴을 찾는 것이 어렵습니다. 또한, 일부 다른 위치에 있는 툴을 반복해서 편집하고 다시 구워 배치된 에셋을 미세조정하는 것은 효율적인 방식이 아닙니다.
더 효율적인 워크플로를 지원하기 위해, 배치된 스태틱 메시 에셋(스태틱 메시 액터)와 툴 액터 간에 서로 교체할 수 있는 시스템이 블루프린트에 온전히 빌드되어 있습니다. 이 시스템은 액터 액션 유틸리티(Actor Action Utility) 블루프린트를 사용하는데, 이를 통해 에디터의 우클릭 컨텍스트 메뉴에 표시되는 블루프린트 작업을 생성할 수 있습니다.
자세한 내용은 스크립트로 된 액션을 참조하세요.
/Content/Tools/BakedGeneratedMeshSystem/EditorActions/
폴더에 두 가지 액션 유틸리티가 있습니다.
첫 번째는 구워진 스태틱 메시 에셋의 인스턴스로 툴 액터를 교체하는 데 사용되는 SwapGeneratedActor_ToSM 입니다. 이 에디터 액션은 BakedGeneratedDynamicMeshActor 서브클래스에 대한 컨텍스트 메뉴에 스태틱 메시로 교체(Swap to Static Mesh) 항목을 추가합니다. 이 액션이 실행되면 다음 프로세스가 발생합니다.
구워진 에셋이 이미 액터에 환경설정되어 있는지 확인합니다. 구워진 에셋이 없다면, 자동으로 툴 액터에서 새 스태틱 메시 생성 작업과 스태틱 메시에 굽기 작업이 실행됩니다.
새 구워진 스태틱 메시 액터(Baked Static Mesh Actor) 를 생성하고 그렇게 구워진 에셋을 할당합니다.
새 액터의 트랜스폼(Transform) 을 툴의 현재 트랜스폼과 똑같이 설정합니다.
툴 액터에서 새 스태틱 메시 액터로 이름(Name) 및 데이터 레이어(Data Layer) , 아웃라이너(Outliner) 위치를 복사합니다.
툴 액터의 위치를 레벨 아래로 변경합니다.
아웃라이너의 툴 액터 이름에 접두사를 추가합니다.
라이라에서 이 이름은 ZZSTORED_ 로 구성됩니다.
두 번째 에디터 액션은 배치된 스태틱 메시 인스턴스(구워진 스태틱 메시 액터 )에서 소스인 툴 액터로 교체하는 데 사용되는 SwapGeneratedActor_FromSM 입니다. 이 액션은 구워진 스태틱 메시 액터에 대한 컨텍스트 메뉴에 생성된 메시로 교체(Swap to Generated Mesh) 액션을 추가합니다. 이 액션을 실행하면, 스태틱 메시 액터가 삭제된 다음, 삭제된 스태틱 메시 액터의 위치를 차지하도록 툴 액터의 트랜스폼이 업데이트됩니다.
파라메트릭을 편집하고 구워진 에셋을 업데이트한 다음, 스태틱 메시로 교체 액션을 실행하여 스태틱 메시로 다시 전환할 수 있습니다.
소스 키 및 Generated Mesh Cold Storage
레벨 디자이너는 위에서 설명한 툴과 굽기 함수 기능, 교체 액션을 사용하여 레벨을 생성하고 편집합니다. 이제 블루프린트에서 교체를 온전히 구현하는 방법에 대한 상세한 기술적 내용을 살펴볼 수 있습니다.
앞서 언급했듯, 구워진 생성된 다이내믹 메시 액터(Baked Generated Dynamic Mesh Actor) 는 타깃 스태틱 메시(Target Static Mesh) 필드의 현재 구워진 에셋을 계속 추적합니다. 에셋이 생성되면, 새 소스 제너레이터 키(Source Generator Key) 스트링도 무작위로 생성됩니다. 이 스트링은 액터의 디테일 패널 에 표시됩니다.
이러한 필드는 새 스태틱 메시 생성 버튼으로 초기화할 수도 있고 수동으로 초기화할 수도 있습니다.
스태틱 메시로 교체 액션을 통해 생성된 스태틱 메시 액터는 베이스 StaticMeshActor의 블루프린트 서브클래스로, 구워진 스태틱 메시 액터 라고 합니다. 이 서브클래스에는 소스 제너레이터 키 를 위한 추가 필드가 있습니다. 액션을 통해 새 구워진 스태틱 메시 액터가 생성되면, 기반이 된 툴과 같은 스트링으로 소스 제너레이터 키가 설정됩니다.
이 소스 제너레이터 키 스트링이 교체 시스템의 기반입니다. 구워진 스태틱 메시 액터가 주어지면, 이 키를 사용하여 이 액터가 파생된 툴을 확인할 수 있습니다. 또한, 툴에서 키가 주어지면, 모든 구워진 스태틱 메시 액터 인스턴스를 찾을 수 있습니다.
검색하는 방법 중 하나는 모든 액터를 반복작업하는 것입니다. 이 정보를 중앙 집중화하고 다양한 유틸리티 함수(검색 등)에 대한 위치를 제공하기 위해 또 다른 블루프린트 오브젝트를 시스템에 추가했습니다. 이 오브젝트는 에디터 유틸리티 액터(Editor Utility Actor)인 GeneratedMeshColdStorage 블루프린트입니다.
교체 시스템이 작동하려면 이러한 액터 중 하나가 레벨에 배치되어야 합니다. 이는 게임에 어떠한 영향도 주지 않고 지오메트리도 없습니다. 아래에 나와 있듯이 저장된 액터(Stored Actors) 목록에서 알려진 툴 액터 배열을 관리합니다.
Generated Mesh Cold Storage 오브젝트에는 Store Actor 및 Extract Actor 라는 두 개의 퍼블릭 블루프린트 함수가 있습니다. 이 두 개의 함수는 교체 액션에서 툴 액터를 저장하거나 복원하는 데 사용합니다.
툴/에셋 교체 시스템을 위한 새 레벨 설정
아래는 위에서 설명한 굽기/교체 시스템에 대한 새 레벨을 설정하기 위한 단계별 지침입니다.
Tools/BakedGeneratedMeshSystem/GeneratedMeshColdStorage 에셋의 인스턴스를 콘텐츠 브라우저에서 레벨로 드래그합니다.
Tools/B_Tool_AdvancedWindow 에셋의 인스턴스를 레벨로 드래그합니다.
이 새 액터(B_Tool_AdvancedWindow )를 선택합니다.
액터 디테일 패널 의 생성 관리 섹션으로 스크롤을 내린 다음 새 스태틱 메시 생성 을 클릭합니다.
레벨에서 액터를 우클릭하고 액터 컨텍스트 메뉴의 스크립트로 된 액터 액션 서브메뉴에서 스태틱 메시로 교체 를 선택합니다. 이렇게 하면 툴 액터가 스태틱 메시 액터로 교체됩니다.
Alt를 누른 상태로 레벨에서 3D 기즈모를 드래그하여 선택한 스태틱 메시 액터를 복제합니다.
두 개의 스태틱 메시 액터 중 하나를 선택하여 우클릭하고 액터 컨텍스트 메뉴의 스크립트로 된 액터 액션(Scripted Actor Actions) 서브메뉴에서 생성된 메시로 교체 를 선택합니다. 이렇게 하면 스태틱 메시 액터가 툴 액터로 교체됩니다.
액터 디테일 패널의 벽(Wall) 섹션으로 스크롤을 올린 다음 벽 너비(Wall Width) 를 높입니다. 증가한 벽 너비는 툴 액터에만 영향을 줍니다.
액터 디테일 패널 의 생성 관리 섹션으로 스크롤을 내린 다음 스태틱 메시에 굽기 를 클릭합니다. 이 스태틱 메시 액터는 툴 액터와 똑같이 보이도록 업데이트됩니다.
레벨에서 액터를 우클릭하고 액터 컨텍스트 메뉴의 스크립트로 된 액터 액션 서브메뉴에서 스태틱 메시로 교체 를 선택합니다. 이렇게 하면 툴 액터가 스태틱 메시 액터로 다시 교체됩니다.
교체 시스템의 일반적인 문제
위에서 설명한 에셋/툴 교체 시스템은 Lyra L_Expanse 레벨에 포함되어 있습니다. 대부분의 레벨 엘리먼트는 그 레벨에 있는 툴을 기반으로 하며, 툴과 배치된 액터 간을 교체함으로써 변경 유지 레벨 디자인을 실험해볼 수 있습니다.
라이라 개발 과정에서 사용자가 알아두면 좋을 빈번하게 발생하는 몇 가지 오류가 발견되었습니다.
생성된 스태틱 메시 에셋을 액터로 교체하지 않고 수동으로 배치하면, 그 결과 액터는 구워진 스태틱 메시 액터가 아니라 보통 스태틱 메시 액터가 됩니다. 이러한 상황에서는 액터에 소스 키 필드가 없습니다. 따라서 소스 툴에 대한 링크가 없고 스태틱 메시로 교체 컨텍스트 메뉴 액션을 사용할 수 없습니다.
스태틱 메시로 교체 액션은 첫 번째 호출을 제외하고는 자동으로 툴을 에셋으로 굽지 않습니다. 명시적으로 굽기 버튼을 클릭해야 하며, 그렇지 않으면 툴과 구워진 에셋은 동기화되지 않습니다. 다시 교체한 다음 구우면 이 문제를 해결할 수 있습니다.
툴이 에셋으로 구워진 후 해당 에셋을 레벨에서 사용하는 경우, 해당 툴에서 다시 새 스태틱 메시 생성 버튼을 사용하면 안 됩니다. 다시 이 버튼을 사용하면 새 소스 키가 생성되어 기존 에셋 인스턴스가 어떠한 기존 툴도 참조하지 않는 소스 키를 갖게 되므로, 다시 교체할 수 없게 됩니다.
베리에이션을 만들기 위해 레벨에서 툴을 복제하면, 두 사본이 같은 소스 키와 같은 타깃 스태틱 메시 에셋을 갖게 됩니다. 이 경우, 이러한 충돌을 해결하기 위해 새 스태틱 메시 생성을 반드시 실행해야 합니다.
생성된 스태틱 메시 에셋에는 소스 키 범위가 없으며, 스태틱 메시 액터에만 있습니다. 따라서, 레벨에서 에셋을 사용하는 모든 액터가 삭제되면, 소스 툴과의 링크가 끊어집니다(툴은 여전히 레벨에 있지만, 찾기 어려워집니다). 에셋을 완전히 삭제하려면, 먼저 툴을 삭제한 다음 배치된 액터와 에셋을 순서대로 삭제해야 합니다.
툴이 삭제되면, 툴의 세팅이 사라져 돌이킬 수 없게 됩니다. 배치된 인스턴스에는 영향이 없지만, 삭제된 툴을 복구하여 인스턴스를 추가로 업데이트할 수가 없습니다.
소스 키 필드는 스트링이며 디테일 패널에서 수동으로 편집할 수 있습니다. 수동으로 편집하면 에셋 인스턴스와 툴 간의 링크가 끊어집니다. 하지만, 이는 툴과 인스턴스에서 스트링이 같도록 수동으로 업데이트하여 끊어진 링크를 복구할 수 있다는 뜻입니다.
향후 라이라 샘플의 반복작업에서 이러한 제한을 개선할 예정입니다.
추가 참고 사항
할당된 머티리얼: 툴과 에셋 인스턴스를 서로 교체할 경우, 월드 트랜스폼 외에 할당된 머티리얼도 복사됩니다. 이를 통해 레벨에 있는 에셋의 다양한 인스턴스에 다른 머티리얼을 할당하면서도 여전히 툴 교체가 가능할 뿐 아니라, '교체된' 툴이 올바른 머티리얼을 반영할 수 있습니다. 하지만, 툴에서 직접 이루어진 모든 머티리얼 할당은 사라집니다.
액터 세팅: 에셋/인스턴스를 교체해도 데이터 레이어와 아웃라이너에서의 위치, 그리고 가능한 경우 액터 이름이 유지됩니다. 툴 액터를 레벨 아래로 이동하는 것 외에도 이를 숨기려고 시도합니다. 그렇지만, 언리얼 에디터는 이러한 숨김/표시 상태를 저장하지 않으므로 레벨을 다시 로드하면 상태가 리셋됩니다. 그래서 레벨 아래에 해당 액터가 보이게 됩니다.
이러한 복사는 액터 프로퍼티를 복사하는 로우 레벨 엔진 API에서 이루어지므로, 많은 다른 액터 세팅이 쌍방으로 복사됩니다. 하지만, 양쪽 오브젝트에 모두 없는 액터 프로퍼티를 복사할 수는 없습니다. 이러한 경우를 처리하려면 액션에서 복사/액션으로 복사(Copy To / From Actions)에서 이 세팅을 명시적으로 처리해야 합니다.
쿠킹/게임 빌드: UE 5.0에서 툴에 사용되는 생성된 다이내믹 메시 액터 베이스 클래스는 에디터 전용입니다. 즉, 배치된 툴 액터를 PIE에서 볼 수는 있지만, 빌드되고 쿠킹된 게임에는 포함되지 않습니다.