데이터스미스 메타데이터 사용법

에셋의 커스텀 메타데이터를 언리얼 엔진으로 가져오고, 블루프린트와 Python 스크립트를 사용하여 에디터와 런타임에 해당 메타데이터를 사용하는 방법을 설명합니다.

데이터스미스 임포터는 처리하는 오브젝트의 메타데이터 를 자동으로 가져올 수 있습니다. 메타데이터란 3D 디자인 또는 CAD 프로그램에서 그 오브젝트에 설정해 둔 정보를 말합니다. 메타데이터는 에셋이 나타내는 현실의 기계 부품 또는 건축 요소 관련 정보를 저장하는 데 자주 쓰입니다. 예를 들어 그 부품의 가격, 소재, 무게나 단열 효율과 같은 물리적 속성, 부품에 적용할 수 있는 최대 토크와 같은 사용 정보입니다. 프로젝트에 필요할 수도 있는 에셋과 관련된 다른 유형의 정보를 메타데이터에 저장할 수도 있습니다.

언리얼 엔진 및 언리얼 에디터에서 이 메타데이터를 다음과 같은 두 가지 방법으로 유용하게 사용할 수 있습니다.

  • 에셋 파이프라인에서: 에셋을 임포트하고 레벨을 구성할 때 메타데이터를 사용하면 다른 처리가 필요한 에셋과 액터 유형을 구분하는 데 도움이 됩니다. 예를 들어 다음과 같습니다.

    • 데이터스미스 임포트 프로세스 도중 최종 씬에 필요하지 않아 임포트를 생략할 수 있는 에셋 유형을 식별할 수 있습니다.

    • 임포트 후 레벨의 액터 중 병합, 결합, 대체, 또는 해당 머티리얼을 대체할 액터를 식별할 수 있습니다.

  • 게임 런타임에서: 런타임에서 메타데이터를 사용하면 소스 디자인 툴에서 액터에 설정된 정보를 사용자에게 표시할 수 있습니다. 예를 들어 다음과 같습니다.

    • 레벨의 오브젝트에 구조적 특성 관련 정보가 담긴 BIM 데이터가 있는 경우, 플레이어가 씬의 그 오브젝트를 선택하면 인터랙티브 경험에서 그 정보를 시각화할 수 있습니다.

    • 제품 컨피규레이터 프로젝트에서 플레이어가 여러 디자인 옵션 중 하나를 선택하면, 게임플레이 로직을 통해 보이는 에셋에 할당된 비용 메타데이터에 따라 플레이어의 현재 선택 비용 총합을 계산하여 표시할 수 있습니다.

이 페이지에서는 데이터스미스 임포트 프로세스를 통해 언리얼로 메타데이터를 가져오는 방법, 에디터와 런타임 양쪽에서 스크립트를 통해 액세스하는 방법을 설명합니다.

메타데이터 소스

현재 데이터스미스에서 메타데이터 임포트를 지원하는 디자인 툴은 다음과 같습니다.

현재 지오메트리의 메타데이터만 처리하며, 라이트나 카메라 같은 다른 유형의 씬 오브젝트는 지원하지 않습니다.

Autodesk 3ds Max

3ds Max 오브젝트의 Object Properties 창의 User Defined 탭에 메타데이터를 추가합니다.

3ds Max User Defined Properties의 메타데이터

3ds Max에서 메시의 이 패널을 여는 방법은 다음과 같습니다.

  1. 아웃라이너 또는 뷰포트에서 메시를 선택합니다.

  2. 우클릭 후 컨텍스트 메뉴에서 Properties 또는 Object Properties 를 선택하거나 메인 메뉴의 Edit > Properties 를 선택합니다.

  3. 이 패널에 메타데이터를 위와 같이 키 = 값 쌍으로 입력합니다.

    주의할 점은 등호 (=) 양쪽에 한 칸 띄워야 합니다. 띄우지 않으면 데이터스미스가 인식하지 못해 예상대로 임포트할 수 없습니다.

MAXScript를 사용하여 사용자 정의 프로퍼티를 구성할 수도 있습니다.

모델을 Revit에서 만들고 3ds Max로 임포트한 경우, 사용자 정의 프로퍼티는 3ds Max 임포터가 모델의 BIM 정보로 미리 설정했을 것입니다.

Autodesk Revit

Revit 뷰의 엘리먼트를 선택하면 해당 엘리먼트에 할당된 모든 인스턴스 프로퍼티 목록이 Properties 팔레트에 표시됩니다. 이 값을 자유롭게 변경하고 자체 커스텀 프로퍼티를 추가할 수 있습니다.

이 프로퍼티를 설정하고 사용하는 방법에 대한 자세한 내용은 Revit 도움말 문서를 참고하세요.

데이터스미스를 사용하여 Revit 씬을 언리얼 에디터로 임포트하는 경우 데이터스미스는 언리얼 엔진 레벨에 해당 엘리먼트에 대해 스태틱 메시 액터를 만들고, 각 Revit 엘리먼트에 대한 모든 인스턴스 프로퍼티를 해당 스태틱 메시 액터의 메타데이터로 할당합니다. 이 메타데이터는 오브젝트의 비어 있지 않은 Revit 유형에 대한 유형 프로퍼티도 포함합니다.

데이터스미스 메타데이터는 항상 키-값 쌍의 플랫 리스트이기 때문에, Properties 팔레트의 카테고리 제목(위 이미지에서 보이는 Constraints, Structural, Dimensions, Identity Data 등)은 포함되지 않습니다. 실제 프로퍼티의 이름과 값만 보존됩니다.

Dassault Systèmes SolidWorks

SolidWorks 파일을 임포트할 때, 데이터스미스에서 생성하는 스태틱 메시 액터 각각에 프리셋 메타데이터 최소량을 추가하여 원본 Solidworks 디자인에서 해당 메시의 어셈블리와 파트 이름을 나타냅니다. 하지만 데이터스미스는 현재 파트와 어셈블리에 추가한 커스텀 메타데이터 프로퍼티를 가져오지 않습니다.

Trimble SketchUp Pro

SketchUp에서서 만든 컴포넌트 각각에 대해, 가격, 크기, 상태와 같은 Advanced Attributes 를 추가할 수 있습니다.

SketchUp Pro Advanced Attributes의 메타데이터

데이터스미스는 이러한 'Advanced Attributes'를 모두 임포트하며, 유형 값도 있으면 메타데이터에 포함시킵니다.

데이터스미스 메타데이터는 씬 계층구조에서 컴포넌트를 나타내는 액터에 어태치할 수는 있지만, 해당 컴포넌트의 지오메트리를 나타내는 개별 스태틱 메시 액터는 아닙니다. 하지만 이렇게 해야 하는 경우, 이 페이지 하단의 블루프린트 및 Python 예시를 적절히 조정해야 합니다.

Maxon Cinema 4D

Cinema 4D에서 씬의 각 오브젝트에 User Data를 추가하려면 Attributes 패널에서 User Data > Manage User Data 를 선택하면 됩니다.

User Data set on an object in Cinema 4D

이렇게 하는 방법에 대한 자세한 내용은 Cinema 4D 문서를 참고하세요.

데이터 변환에 적용되는 중요한 사항 몇 가지입니다.

  • Cinema 4D 에서 User Data를 계층 그룹으로 체계를 구성할 수 있지만, 언리얼 엔진의 데이터스미스 메타데이터는 항상 키와 값을 플랫 리스트로 저장합니다. 사용자 데이터에 위와 같이 그룹이 있는 경우, 데이터스미스는 계층구조를 평탄화시켜 모든 그룹의 메타데이터 키 전부를 하나의 플랫 리스트에 넣습니다. 그룹 이름 자체는 버려집니다.

    예를 들어 아래 이지미에서는 그룹이 임포트되지 않은 것이 보이며 중첩된 프로퍼티(IntegerData, VectorData, ColorData, BooleanData)는 StringDataFloatData 의 형제로 이동되었습니다.

  • Cinema 4D에서 User Data에 설정한 데이터 유형과 상관없이, 데이터스미스 메타데이터에 저장되는 값은 항상 스트링입니다. 가능한 한 데이터스미스는 원본 데이터 값을 스트링으로 변환해서 파싱을 통해 관련 정보를 추출할 수 있도록 하고 있습니다. 하지만 일부 복잡하거나 특수 목적 Cinema 4D 데이터 유형은 지원하지 않는데, 예를 들어 그레이디언트, 다른 씬 오브젝트로의 링크, 우선순위 값, 스플라인 등입니다.

    예를 들어 아래 이미지에서 ColorDataVertexData 항목이 스트링으로 변환되어 각각 원본 컬러 및 버텍스의 RGB 및 XYZ 값이 들어있는 모습을 볼 수 있습니다.

  • 데이터스미스는 메타데이터 키 이름에 영숫자, 하이픈, 밑줄만 허용합니다. User Data 이름에 다른 글자가 포함된 경우, 해당 글자는 밑줄로 자동 변환됩니다.

다음 이미지는 위에 표시된 User Data 임포트 결과를 나타냅니다.

변환 후 Cinema 4D User Data

IFC 2x3

데이터스미스는 각 IFC 오브젝트에 할당된 모든 프로퍼티를 임포트하고 해당되는 언리얼 엔진 액터에 데이터스미스 메타데이터로 저장합니다.

데이터 변환 참고 사항:

  • IFC를 사용하면 프로퍼티를 그룹으로 정리할 수 있습니다. 예를 들어 위 이미지는 PSet_Revit_Mechanical, PSet_Revit_Dimensions, PSet_Revit_Identity Data 등의 그룹을 보여줍니다. 하지만 언리얼 엔진의 데이터스미스 메타데이터는 항상 키와 값을 플랫 리스트로 저장합니다. IFC 프로퍼티에 위와 같이 그룹이 있는 경우, 데이터스미스는 계층구조를 평탄화시켜 모든 그룹의 메타데이터 키 전부를 하나의 플랫 리스트에 넣습니다. 그룹 이름 자체는 버려집니다.

  • 데이터스미스는 메타데이터 키 이름에 영숫자, 하이픈, 밑줄만 허용합니다. User Data 이름에 다른 글자가 포함된 경우, 해당 글자는 밑줄로 자동 변환됩니다. 예를 들어 위 이미지에서 Fixture Units 프로퍼티는 데이터스미스 메타데이터의 Fixture_Units 로 변환됩니다.

    메타데이터 값의 모든 특수 문자는 보존됩니다.

언리얼 에디터에서 메타데이터 보기

데이터스미스 임포트 프로세스가 완료된 이후, 디테일(Details) 패널의 에셋 사용자 데이터(Asset User Data) 섹션 아래에서 레벨의 스태틱 메시 액터의 메타데이터를 볼 수 있습니다.

언리얼에서 데이터스미스 메타데이터 보기

데이터스미스 메타데이터는 현재 에디터에서 읽기 전용입니다.

블루프린트 및 Python에서 메타데이터 액세스하기

씬 오브젝트에 연관된 메타데이터에 액세스하는 방법은 여러가지입니다. 그 방법은 메타데이터에 액세스할 시점이 데이터스미스 임포트 프로세스 도중인지 완료 이후인지에 따라 달라집니다.

모든 메타데이터 키 및 값은 언리얼 엔진에 스트링으로 저장되며, 디자인 또는 CAD 프로그램의 원본 유형과는 관계없습니다. 예를 들어 3ds Max에서 메타데이터 값을 true 같은 부울이나 312 같은 숫자로 설정한 경우, 언리얼에서 스크립트로 읽으면 스트링이 됩니다. 이 값을 부울이나 숫자로 만들려면, 블루프린트 변환 노드 Utilities > String > String to Int 또는 String to Float 를 사용하거나, Python 내장 스트링 파싱 함수 int() 또는 float() 를 사용하면 됩니다.

임포트 도중 메타데이터 액세스하기

데이터스미스 임포트 프로세스 도중 메타데이터에 액세스하려면, 예를 들어 씬에 언리얼 에셋을 생성하기 전 필터로 거를 메시를 식별하려는 경우 데이터스미스 씬에서 메타데이터를 읽으면 됩니다. 입력 프로세스 도중 스크립트를 실행하는 방법과 관련한 배경 정보는 데이터스미스 임포트 프로세스 커스터마이징을 참고하세요.

데이터스미스 씬의 메시 액터 엘리먼트 에 어태치된 메타데이터를 찾을 수 있습니다.

구현 방법 선택

블루프린트

Python

필요한 노드는 Datasmith > SceneDatasmith > Element 아래에 있습니다.

이 노드를 사용하려면 컨텍스트 메뉴의 컨텍스트에 따라(Context Sensitive) 체크박스를 해제하거나 팔레트에서 해당 노드를 찾으면 됩니다.

노드

설명

Get All Metadata
Get All Metadata

데이터스미스 씬의 모든 오브젝트에 대해 기록된 모든 메타데이터 오브젝트 배열을 얻습니다.

Get All Objects and Values for Key
Get All Objects and Values for Key

데이터스미스 씬에서 지정된 키가 있는 모든 오브젝트 목록을 얻습니다. 또한 모든 오브젝트에서 그 키에 대해 기록된 모든 값 목록을 얻을 수도 있습니다.

Get Metadata for Object
Get Metadata for Object

지정된 오브젝트에 할당된 모든 메타데이터를 얻습니다.

Get Metadata Value for Key
Get Metadata Value for Key

지정된 오브젝트에 할당된 지정된 키 값을 얻습니다.

Get Metadata Keys and Values for Value
Get Metadata Keys and Values for Value

값이 String to Match 입력에 일치하는 지정된 오브젝트의 모든 키를 얻습니다.

데이터스미스 메타데이터 엘리먼트 오브젝트를 반환하는 위 노드의 경우, Datasmith > Element > Get Properties , Get Property , Get Property Count 를 사용하면 메타데이터 오브젝트에서 키와 값을 얻을 수 있습니다.

데이터스미스 메타데이터 엘리먼트

사용 예시

메타데이터 키에 할당된 값을 사용하여 프로젝트에 필요하지 않은 지오메트리를 식별하는 법을 보여주는 예시입니다. 이렇게 식별한 지오메트리를 데이터스미스 씬에서 제거한 후 스태틱 메시 에셋을 생성할 수 있습니다.

데이터스미스 임포트 프로세스 도중 unreal.DatasmithSceneElement 오브젝트를 통해 씬 오브젝트 관련 메타데이터를 구할 수 있습니다. 다음 함수에 대한 자세한 내용은 Python API 레퍼런스를 참고하세요.

get_all_metadata(object_class)
데이터스미스 씬의 모든 오브젝트에 대해 기록된 모든 메타데이터 오브젝트 배열을 얻습니다.

get_all_objects_and_values_for_key(key, object_class)
데이터스미스 씬에서 지정된 키가 있는 모든 오브젝트 목록을 얻습니다. 또한 모든 오브젝트에서 그 키에 대해 기록된 모든 값 목록을 얻을 수도 있습니다.

get_metadata_for_object(object)
지정된 오브젝트에 할당된 모든 메타데이터를 얻습니다.

get_metadata_value_for_key(object, key)
지정된 오브젝트에 할당된 지정된 키 값을 얻습니다.

get_metadata_keys_and_values_for_value(object, string_to_match)
지정된 오브젝트에서 값이 두 번째 파라미터에 일치하는 모든 키를 얻습니다.

사용 예시

메타데이터 키에 할당된 값을 사용하여 프로젝트에 필요하지 않은 지오메트리를 식별하는 법을 보여주는 예시입니다. 이렇게 식별한 지오메트리를 데이터스미스 씬에서 제거한 후 스태틱 메시 에셋을 생성할 수 있습니다.

key_name = "name"
remove_keyword = "Clutch"
meshes_to_skip = set([])
# "name" 키를 가진 씬 엘리먼트를 전부 구합니다.
objects_and_values = ds_scene_in_memory.get_all_objects_and_values_for_key(key_name, unreal.DatasmithMeshActorElement)
objects = objects_and_values[0]
values = objects_and_values[1]
# 반복작업하면서 값이 키워드에 일치하는 것을 찾습니다.
for index, value in enumerate(values):
    if remove_keyword in value:
        print("removing actor named: " + value)
        # 씬에서 메시 액터 엘리먼트를 제거하고, 목록에 나중에 제거할 메시 엘리먼트를 넣습니다.
        mesh_actor = objects[index]
        mesh = mesh_actor.get_mesh_element()
        meshes_to_skip.add(mesh)
        ds_scene_in_memory.remove_mesh_actor(mesh_actor)
# 임포트할 필요가 없는 모든 메시를 제거합니다.
for mesh in meshes_to_skip:
    mesh_name = mesh.get_element_name()
    print("removing mesh named " + mesh_name)
    ds_scene_in_memory.remove_mesh(mesh)

임포트 이후 메타데이터에 액세스하기

임포트 프로세스가 데이터스미스 씬을 마무리하여 언리얼 에셋과 액터로 가져왔으면, 데이터스미스 씬에 있는 각 메시 엘리먼트의 메타데이터를 해당 스태틱 메시 에셋의 인스턴스를 표현하는 레벨의 모든 액터에도 적용합니다. 그런 다음 블루프린트 또는 Python을 사용하여 레벨의 스태틱 메시 액터 일부 또는 전부에 대한 메타데이터를 얻을 수 있습니다.

구현 방법 선택

블루프린트

Python

특정 액터 하나에 대한 메타데이터에 액세스하는 노드는 다음과 같습니다. 퍼포먼스 영향은 매우 적어 언제든, 심지어 프로젝트에서 런타임에도 사용할 수 있습니다. 씬에서, 즉 프로젝트의 런타임 UI 내 콜아웃이나 메뉴에서 선택한 오브젝트 하나 이상에 대해 임포트한 메타데이터를 시각화할 때 런타임 블루프린트 그래프에서 사용하면 좋은 노드입니다.

데이터스미스 사용자 데이터(Datasmith User Data) 카테고리 아래에서 찾을 수 있습니다.

노드

설명

Get Datasmith User Data Value for Key
Get Datasmith User Data Value for Key

지정된 오브젝트에 지정된 키로 할당된 메타데이터 값을 얻습니다.

Get Datasmith User Data Keys and Values for Value
Get Datasmith User Data Keys and Values for Value

지정된 오브젝트에서 String to Match 입력에 지정한 값이 있는 모든 키를 얻습니다. 이 노드는 찾는 은 알지만 키 이름은 모를 때 사용합니다.

Get Datasmith User Data
Get Datasmith User Data

액터에 대해 기록된 모든 키-값 쌍이 들어있는 메타데이터 오브젝트를 얻어서, 직접 반복작업할 수 있습니다.

이와 대조적으로 현재 레벨(또는 지정한 클래스를 공유하는 모든 레벨)의 스태틱 메시 액터 전부에 대한 메타데이터를 액세스하는 노드는 다음과 같습니다. 잠재적으로 레벨에는 액터가 많고 각각 프로퍼티도 많을 수 있으므로, 이 함수는 CPU 자원을 많이 사용할 수 있으며, 런타임 게임플레이에 사용하면 퍼포먼스가 떨어질 수 있습니다. 따라서 에디터 전용 블루프린트 클래스에서 생성한 그래프에서만 사용할 수 있습니다.

이 노드는 Editor Scripting > Datasmith User Data 카테고리에서 찾을 수 있습니다.

노드

설명

Get All Objects and Values for Key
Get All Objects and Values for Key

현재 레벨에서 데이터스미스 메타데이터에 지정된 키가 있는 모든 액터 목록을 얻습니다. 또한 모든 오브젝트에서 그 키에 대해 기록된 모든 값 목록을 얻을 수도 있습니다.

Get All Datasmith User Data
Get All Datasmith User Data

현재 레벨에 있는 모든 액터에 대한 모든 메타데이터 오브젝트 전체 목록을 얻습니다.

Get Datasmith User DataGet All Datasmith User Data 노드는 데이터스미스 사용자 데이터 오브젝트 레퍼런스를 반환합니다. 이 오브젝트에서 액세스할 수 있는 변수 Metadata는 오브젝트의 데이터스미스 메타데이터를 이루는 모든 키-값 쌍의 맵입니다. 이러한 종류의 오브젝트를 사용하려면, 출력 핀을 끌어 놓고 Variables > Get Metadata 를 선택합니다.

데이터스미스 사용자 데이터 오브젝트 레퍼런스

그러면 키와 값이 맵으로 나옵니다. 그런 다음 Utilities > Map 카테고리의 유틸리티 노드를 사용하여 데이터 작업을 하면 됩니다. 예를 들어 이 그래프는 모든 키에 대해 하나씩 반복작업하면서 각 키와 연관된 값을 얻습니다.

블루프린트에서의 맵 작업에 대한 자세한 내용은

[블루프린트 맵](programming-and-scripting/blueprints-visual-scripting/Scripting#blueprintmaps)
을 참고하세요.

사용 예시

레벨에 플레이어가 선택한 오브젝트에 대해 런타임에 에셋 메타데이터를 시각화하는 방법을 보여주는 단순한 예시입니다.

UMG 위젯의 메타데이터

텍스트 칸이 둘 있는 UMG 위젯으로 텍스트를 작성했으며, 각각 스트링 변수에 바인딩됩니다. 위젯에 대한 블루프린트 그래프에서, 커스텀 액션이 커스텀 이벤트에 전달한 액터에서 데이터스미스 메타데이터 두 항목을 추출하고, 그 항목을 바인딩된 변수에 저장합니다.

UMG 위젯 이벤트 그래프

다음 레벨 블루프린트는 플레이를 시작할 때 이런 위젯을 추가하는 법, 사용자가 마우스를 클릭할 때마다 커서 아래 액터를 물려주는 방법을 보여줍니다.

UMG 로 유저 인터페이스 구축에 대한 자세한 내용은 UMG UI 디자이너 퀵스타트 가이드 및 관련 섹션을 참고하세요.

데이터스미스 임포트 프로세스가 완료된 후 unreal.DatasmithContentLibrary 클래스를 사용하여 모든 액터 또는 선택된 액터에 대한 메타데이터에 액세스할 수 있습니다. 다음 함수에 대한 자세한 내용은 Python API 레퍼런스를 참고하세요.

get_all_datasmith_user_data(object_class)
현재 레벨에 있는 모든 액터에 대한 모든 메타데이터 오브젝트 전체 목록을 얻습니다.

get_all_objects_and_values_for_key(key, object_class)
현재 레벨에서 데이터스미스 메타데이터에 지정된 키가 있는 모든 액터 목록을 얻습니다. 또한 모든 오브젝트에서 그 키에 대해 기록된 모든 값 목록을 얻을 수도 있습니다.

get_datasmith_user_data(object)
또는 액터에 대해 기록된 모든 키-값 쌍이 들어있는 메타데이터 오브젝트를 얻어서, 직접 반복작업할 수 있습니다.

get_datasmith_user_data_keys_and_values_for_value(object, string_to_match)
지정된 액터에서 값이 두 번째 파라미터로 지정한 값인 모든 키를 얻습니다. 이 노드는 찾는 값 은 알지만 키 이름은 모를 때 사용합니다.

get_datasmith_user_data_value_for_key(object, key)
지정된 액터에 지정된 키로 할당된 메타데이터 값을 얻습니다.

사용 예시

언리얼 에디터에서 실행하는 Python 스크립트에서 임포트한 후 데이터스미스 메타데이터를 사용하면 레벨의 스태틱 메시 액터 중 특수하게 처리해야 하는 것을 식별할 수 있습니다.

import unreal
new_actor_name = "Exterior Walls"
metadata_key = "Type"
metadata_value = "Wall: Exterior"
meshes_to_join = set([])
# 현재 레벨의 액터를 대상으로 반복작업합니다.
all_actors = unreal.EditorLevelLibrary.get_all_level_actors()
for actor in all_actors:
    # 위에서 설정한 키가 있으면 그에 대한 이 에셋의 데이터스미스 메타데이터 값을 얻습니다.
    actor_value = unreal.DatasmithContentLibrary.get_datasmith_user_data_value_for_key(actor, metadata_key)
    # 키가 존재하고, 그 값에 위에 설정한 키워드가 있으면, 목록에 액터를 추가합니다.
    if actor_value and metadata_value in actor_value:
        print("found a matching actor: " + actor_value)
        meshes_to_join.add(actor)
# 위에서 찾은 모든 액터를 하나의 액터 아래 여러 컴포넌트로 합칩니다.
options = unreal.EditorScriptingJoinStaticMeshActorsOptions(destroy_source_actors=True, new_actor_label=new_actor_name, rename_components_from_source=True)
unreal.EditorLevelLibrary.join_static_mesh_actors(meshes_to_join, options)
print "Merged all actors!"
언리얼 엔진의 이전 버전을 위해 작성된 페이지입니다. 현재 언리얼 엔진 5 버전을 위해 업데이트되지 않았습니다.