使用Datasmith元数据

介绍将资源相关的自定义元数据导入虚幻,及利用蓝图和Python脚本同时在编辑器中和运行时处理使用此类元数据的方法。

Choose your operating system:

Windows

macOS

Linux

Datasmith导入器可自动导入其处理对象相关的 元数据 :即在3D设计或CAD应用程序中设置的对象信息。元数据常用于存储资源代表的机械部件或建筑元素的真实信息,如部件成本、制造材质、物理特性(如重量、隔热率)或使用信息(如应用到部件的最大扭矩)。还可使用元数据存储项目所需资源的其他相关信息。

在虚幻编辑器和虚幻引擎中启用此元数据,可提供以下两类帮助:

  • 在资源流程中: 导入资源和设置关卡时可使用元数据,以区分需不同处理的不同类型的资源和Actor。例如:

    • 可在Datasmith导入期间使用元数据,以辨识最终场景中无需的资源类型,从而跳过导入。

    • 导入后,可使用元数据辨识关卡中要合并、连接、替换或替换其材质的Actor。

  • 游戏运行时: 可在运行时使用元数据,向用户显示源设计工具中的Actor相关选择信息。例如:

    • 若关卡中的对象包含BIM数据,且此类数据含有自身结构属性信息,则在玩家在场景中选择此类对象时,需在互动体验中显示此类信息。

    • 如项目为产品配置器,玩家可利用其选择不同设计方案,则可能需设置游戏逻辑,以基于指定到可见资源的成本元数据,计算和显示玩家当前选择的总运行成本。

本页将对通过Datasmith导入流程将元数据导入到虚幻,及在编辑器中和运行时访问脚本中元数据的方法进行讲解。

元数据源

Datasmith目前可从以下设计工具中导入元数据:

Datasmith目前仅处理几何体上的元数据,而非如光源或相机等其他场景对象。

Autodesk 3ds Max

对象属性(Object Properties) 窗口的 用户定义(User Defined) 选项卡上,将元数据添加到3ds Max对象。

Metadata in 3ds Max User Defined Properties

要在3ds Max中访问网格体的此面板:

  1. 在大纲视图或视口中选择该网格体。

  2. 右键点击并从快捷菜单中选择 属性 对象属性 ,或在主菜单中选择 编辑 > 属性

  3. 键 = 值 对的格式将将元数据输入到该面板中,如上所示。

    无比在等号(=)两端各保留一个空格 。否则Datasmith将无法识别元数据,也无法正常导入元数据。

还可 使用MAXScript 设置用户定义的属性。

若最初在Revit中创建的模型被导入3ds Max,则3ds Max导入工具应已使用模型BIM信息预设用户定义的属性。

Autodesk Revit

在Revit视图中选择元素时, 属性 控制板将显示指定到该元素的所有实例属性列表。可随意修改此类值,并添加自定义属性。

欲了解设置和使用此类属性的详细方法,参见 Revit帮助

使用Datasmith将Revit场景导入虚幻编辑器时,Datasmith会将各Revit元素的所有实例属性作为元数据,指定到其在虚幻引擎关卡中创建的元素静态网格体Actor上。该元数据还包括对象Revit类型的所有非空类型属性。

由于Datasmith元数据固定为键值对的简单列表,因此不包括属性控制板中的类别标题(如上图中的 约束(Constraints) 结构(Structural) 维度(Dimensions) 辨识数据(Identity Data) )。仅保留实际属性的命名和值。

Dassault Systèmes SolidWorks

导入SolidWorks文件时,Datasmith会向其创建的各静态网格体Actor添加最少量的预设元数据,以表明该网格体在原始SolidWorks设计中的部件命名和程序集。但Datasmith目前无法继承添加到部件和程序集的自定义元数据属性。

Trimble SketchUp Pro

对于在SketchUp中创建的各组件,可设置其的 高级属性 ,如价格、尺寸和状态等:

Metadata in SketchUp Pro Advanced Attributes

Datasmith会将所有此类高级属性(包括类型值(如有))导入元数据。

可将Datasmith元数据附加到场景层级中代表组件的Actor,而非附加到代表该组件几何体的单个静态网格体Actor。若场景需进行以上操作,需按照本页下文内容,调整蓝图和Python范例。

Maxon Cinema 4D

在Cinema 4D中,可选择 属性(Attributes) 面板中的 用户数据(User Data)> 管理用户数据(Manage User Data) ,将用户数据添加到场景中的每个对象。

在Cinema 4D中在对象上设置的用户数据

欲了解如何进行此操作的更多信息,请参阅 Cinema 4D文档

关于数据转换,有几条重要的注意事项:

  • 在Cinema 4D中,可将用户数据组织为分层的组,但虚幻引擎中的Datasmith元数据始终是键和值组成的扁平列表。如用户数据包含任何组(如上图所示),Datasmith会使层级扁平化,将所有组中的所有元数据键放到一个扁平列表中。组名本身会被丢弃。

    例如在下图中,可以看到组没有导入,而内嵌的属性( IntegerData VectorData ColorData BooleanData )都变成了 StringData FloatData 的同级。

  • 无论在Cinema 4D中为用户数据设置怎样的数据类型,存储在Datasmith元数据中的值始终是字符串。只要有可能,Datasmith就会将原始数据值转换为字符串,对其进行解析即可提取相关信息。但某些复杂的或特殊用途的Cinema 4D数据类型不受支持,如梯度、指向其他场景对象的链接、优先级值、样条等。

    例如,下图显示了 ColorData VertexData 项如何被分别转换为包含原始颜色RGB值和原始顶点XYZ值的字符串。

  • Datasmith只允许在元数据键名中使用字母数字字符、连字号和下划线。如用户数据的名称包含其他任何字符,这些字符将自动转换为下划线。

下图显示导入上图所示用户数据的结果:

转换后的Cinema 4D用户数据

IFC 2x3

Datasmith会导入指定给每个IFC对象的所有属性,在相应的虚幻引擎Actor上将它们另存为Datasmith元数据。

关于数据转换的注意事项:

  • IFC允许将属性整理到组中。例如,上图显示了多个组: PSet_Revit_Mechanical PSet_Revit_Dimensions PSet_Revit_Identity Data 等。但虚幻引擎中的Datasmith元数据始终是键和值组成的扁平列表。如IFC属性包含任何组(如上图所示),Datasmith会使层级扁平化,将所有组中的所有元数据键放到一个扁平列表中。组名本身会被丢弃。

  • Datasmith只允许在元数据键名中使用字母数字字符、连字号和下划线。如用户数据的名称包含其他任何字符,其将自动转换为下划线。例如在上图中, Fixture Units 属性转换为Datasmith元数据中的 Fixture_Units

    元数据值中的所有特殊字符都会保留。

在虚幻编辑器中查看元数据

Datasmith导入流程完成后,可在 细节 面板中的 资源用户数据(Asset User Data) 部分下,查看关卡中静态网格体Actor的元数据:

Viewing Datasmith metadata in Unreal

编辑器中的Datasmith元数据当前为只读状态。

在蓝图和Python中访问元数据

有多种访问关联场景对象的元数据的方法。应根据在Datasmith导入流程期间或导入完成后访问元数据,选择要使用的方法。

忽略设计或CAD应用程序的所有元数据键和值原始类型,均以字符串形式存储于虚幻引擎中。例如,若将3ds Max中的元数据值设为布尔值(如 true )或数字(如 312 ),在虚幻脚本中读取此类元数据时,将以字符串形式显示。如需布尔值或数字值,使用蓝图转换节点(如 工具(Utilities)>字符串(String)> String to Int String to Float ),或内置Python字符串解析函数(如 int() float() )。

导入时访问元数据

如需在Datasmith导入流程 期间 访问元数据(例如,在生成场景的虚幻资源前辨识要过滤的特定网格体),可在Datasmith场景中读取元数据。欲了解如何在输入过程运行脚本的背景信息,参见 自定义Datasmith导入流程

您会发现元数据已附加到Datasmith场景中的 网格体Actor元素

选择实现方法:

Blueprints

Python

所需节点位于 Datasmith > 场景(Scene) Datasmith >元素(Element) 下。

要使用此类节点,需在快捷菜单中禁用 情境相关(Context Sensitive) 复选框,或在控制板中寻找所需节点。

节点

说明

获取所有元数据
Get All Metadata

获取Datasmith场景中所有对象记录的全部元数据对象数组。

获取键的所有对象和值
Get All Objects and Values for Key

获取Datasmith场景中具有指定键的所有对象列表。还可获得此类对象中该键记录的所有值列表。

获取对象的元数据
Get Metadata for Object

获取指定到指定对象的所有元数据。

获取键的元数据值
Get Metadata Value For Key

获取指定到指定对象的指定键值。

获取值的元数据键和值
Get Metadata Keys and Values for Value

获取指定对象上,值与 String to Match 输入匹配的所有键。

对于上述返回Datasmith元数据元素对象的节点,可使用 Datasmith > 元素(Element)> 获取属性(Get Properties) 获取属性(Get Property) 获取属性数(Get Property Count) ,在元数据对象中获取键和值:

Datasmith Metadata Element

使用范例

本范例将展示使用指定到元数据键的值,识别项目中无需的几何体,并在创建其静态网格体资源前,将其从Datasmith场景中删除的方法:

Datasmith导入流程期间,可通过 unreal.DatasmithSceneElement 对象,获取场景对象的相关元数据。欲了解以下函数的详情,参见 Python API参考

get_all_metadata(object_class)
获取Datasmith场景中所有对象记录的全部元数据对象数组。

get_all_objects_and_values_for_key(key, object_class)
获取Datasmith场景中具有指定键的所有对象列表。还可获得此类对象中该键记录的所有值列表。

get_metadata_for_object(object)
获取指定到指定对象的所有元数据。

get_metadata_value_for_key(object, key)
获取指定到指定对象的指定键值。

get_metadata_keys_and_values_for_value(object, string_to_match)
获取指定对象上值与第二参数匹配的所有键。

使用范例

本范例将展示使用指定到元数据键的值,识别项目中无需的几何体,并在创建其静态网格体资源前,将其从Datasmith场景中删除的方法:

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)
        # 从场景中删除网格体Actor元素,并将网格体元素放入列表以便稍后删除
        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)

导入后访问元数据

在导入流程将Datasmith场景导入虚幻资源和Actor后,其同时会将Datasmith场景中各网格体元素的元数据,应用到关卡中代表该静态网格体实例的所有Actor。之后可使用蓝图或Python获取关卡中任意或所有静态网格体Actor的元数据。

选择实现方法:

Blueprints

Python

以下节点会访问一个特定Actor的元数据。其对性能的影响较小,因此可随时(甚至项目中运行时)使用此类节点。若要可视化场景中一个或多个选定对象的导入元数据(例如,项目运行时UI中的注记或菜单内),可在运行时蓝图图表中使用以下节点。

此类节点位于 Datasmith用户数据(Datasmith User Data) 类别下。

节点

说明

获取键的Datasmith用户数据值
Get Datasmith User Data Value for Key

使用指定到指定对象的指定键,获取元数据的值。

获取值的Datasmith用户数据键和值
Get Datasmith User Data Keys and Values for Value

获取指定对象上,包含**String to Match** 输入中指定值的所有键。已知要查找的 *值*,但不知键命名时,可使用此节点。

获取Datasmith用户数据
Get Datasmith User Data

获取包含Actor记录的 所有 键值对的元数据对象,以便之后进行迭代。

相反,以下节点可访问当前关卡中所有静态网格体Actor(或共享给定类的静态网格体Actor)的元数据。由于关卡可能包含大量具有诸多属性的Actor,若在运行时游戏进程中使用此类函数时,会导致CPU资源开销较高,且性能较差。因此,仅可在纯编辑器蓝图类上创建的图表中使用此类节点。

此类节点位于 编辑器脚本(Editor Scripting)> Datasmith用户数据(Datasmith User Data) 类别下。

节点

说明

获取键的所有对象和值
Get All Objects and Values for Key

获取当前关卡中,在Datasmith元数据内具有指定键的所有Actor列表。还可获得此类对象中该键记录的所有值列表。

获取所有Datasmith用户数据
Get All Datasmith User Data

获取当前关卡中所有Actor的全部元数据对象完整列表。

上述 Get Datasmith User Data Get All Datasmith User Data 节点返回Datasmith用户数据对象参考。该对象拥有一个名为Metadata的可访问变量,其是组成对象Datasmith元数据的所有键值对的Map。要使用此类对象,从输出引脚连出引线,并选择 变量(Variables)> Get Metadata**:

Datasmith User Data Object References

此操作将以Map形式提供键和值。然后可使用 工具(Utilities)> Map 类别中的工具节点使用数据。例如,此图表对所有键进行逐个迭代,并获取各键关联的值:

欲了解在蓝图中使用Map的更多详情,参见 蓝图Map

使用范例

本章节将展示简化范例,对在运行时可视化关卡中玩家选定对象的资源元数据的方法进行讲解。

Metadata in a UMG widget

使用包含两个文本域的UMG控件编写文本,各文本域与字符串变量绑定。在控件的蓝图图表中,自定义操作从传入自定义事件的Actor中提取Datasmith元数据的两个项目,并将此类项目保存到绑定变量。

UMG widget Event Graph

以下关卡蓝图将展示范例,对开始运行时添加此类控件,及用户按下鼠标键时使用光标下的Actor进行填充的方法进行讲解。

欲了解在UMG中编译用户界面的更多详情,参见 UMG UI设计器快速入门 和相关章节。

完成Datasmith导入流程后,可使用 unreal.DatasmithContentLibrary 类访问所有Actor或选定Actor的元数据。欲了解以下函数,参见 Python API参考

get_all_datasmith_user_data(object_class)
获取当前关卡中所有Actor的全部元数据对象完整列表。

get_all_objects_and_values_for_key(key, object_class)
获取当前关卡中,在Datasmith元数据内具有指定键的所有Actor列表。还可获得此类对象中该键记录的所有值列表。

get_datasmith_user_data(object)
获取包含指定Actor记录的所有键值对的元数据对象,以便之后进行迭代。

get_datasmith_user_data_keys_and_values_for_value(object, string_to_match)
获取指定Actor上,包含第二参数中指定值的所有键。已知要查找的值,但不知键命名时,可使用此节点。

get_datasmith_user_data_value_for_key(object, key)
使用指定到指定Actor的指定键,获取元数据的值。

使用范例

在虚幻编辑器内运行的Python脚本中,可在导入后使用Datasmith元数据,辨识关卡中要应用部分特殊流程的静态网格体Actor。

import unreal
new_actor_name = "Exterior Walls"
metadata_key = "Type"
metadata_value = "Wall:Exterior"
meshes_to_join = set([])
# 迭代当前关卡中的Actor
all_actors = unreal.EditorLevelLibrary.get_all_level_actors()
for actor in all_actors:
    # 获取该Actor的上述键Datasmith元数据值(如有)
    actor_value = unreal.DatasmithContentLibrary.get_datasmith_user_data_value_for_key(actor, metadata_key)
    # 如键存在,且其值包含上述关键字,将Actor添加到列表
    if actor_value and metadata_value in actor_value:
        print("found a matching actor:" + actor_value)
        meshes_to_join.add(actor)
# 将之前找到的所有Actor放入具有诸多组件的单个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!"
欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消