创建自定义Dataprep块

如何在蓝图中为Dataprep系统创建自定义过滤器和操作。

Windows
MacOS
Linux

Visual Dataprep系统提供了数十种现成的过滤器和操作,能够满足为实时可视化准备3D数据时的多数常见需求。但是,仅仅依靠预设的过滤器和操作列表是不可能满足所有潜在操作的需求的。假如您希望Dataprep图表完成某些在虚幻编辑器脚本系统中能够实现的操作,但发现现有的Dataprep块都无法满足您的需求,您就可以自己定义过滤器或操作,以便精准满足您的需求。

本页面将介绍如何为Dataprep图表创建新的过滤器和操作类型。

如何创建自定义Dataprep块

不同类型的Dataprep块,它们的创建过程基本上都是一样的。

  1. 创建一个新的蓝图类。欲知细节,请参见创建蓝图类

  2. 选择父类(Pick Parent Class) 对话框中,展开底部 所有类(All Classes) 列表。选择与要创建的块类型相对应的基础类,然后点击 选择(Select)

    欲知可选择的Dataprep父类列表,请参见下方的基础类

  3. 如有需要,可在 内容浏览器(Content Browser) 中重命名新建的类。

  4. 双击新建的类,在蓝图编辑器中打开它以便进行编辑。

  5. 重载蓝图从其父类继承的函数。根据重载的函数,您可以控制新块在Dataprep编辑器中的显示方式,并自定义块在Dataprep图表执行期间的行为方式。

    要重载函数,请将鼠标悬停在 我的蓝图(My Blueprint) 面板中的 函数(Functions) 类别上,点击显示的 重载(Override) 下拉列表,然后选择要重载的函数。

    重载蓝图中的函数

  6. 编译(Compile)保存(Save) 蓝图类。

下次打开Dataprep资产时,您将看到新节点已添加到图形编辑器左侧的控制板中。

基础类

请将下述基类中的一种用作自定义Dataprep块的父类:

说明

DataprepBoolFetcher

若您要实现的过滤器只有在特定条件为真时才会选择对象,请使用此类。

DataprepFloatFetcher

若若您实现的过滤器会基于浮点数字(即具有小数部分的数字)选择对象,请使用此类。

DataprepIntegerFetcher

若您要实现的过滤器会基于整数(即没有小数部分的整数)选择对象,请使用此类。

DataprepStringFetcher

若您要实现的过滤器会基于字符串属性选择对象,请使用此类。

DataprepOperation

若您要实现一个用于修改Actor或资产的操作,请使用此类。

DataprepEditingOperation

若您要实现的操作不仅会修改Actor或资产,还有可能添加或删除Actor和资产,请使用此类。

变量和设置

您在蓝图类中设置为公开可见的变量都会在Dataprep编辑器中作为可自定义的设置进行公开,并出现在所有属于该类型的块中。此机制能够让Dataprep图表的设计人员对函数运算的方式进行自定义。

举例而言,下图中的操作类就包含一些公开可见的变量,全部以睁眼图标表示:

蓝图类中的公共变量

在Dataprep图表中使用这种类型的块时,所有公开可见的变量都会转换为可自定义的设置:

在Dataprep块中公开为设置的公共变量

请注意,在上图中,HiddenStringVariable 未作为Dataprep块上的设置公开,因为在蓝图类中其未被标记为公开。此外还需注意,块中的设置会沿用您在蓝图类中为变量设置的默认属性。举例而言,最后一个变量 StringWithDefaultSet 拥有一个默认值。这会导致块中对应的设置在文本框中生成相同的内容。

创建自定义过滤器

创建自定义过滤器时,您可重载以下任一或所有函数:

函数

说明

Fetch

当您执行Dataprep图表并处理这类过滤块时,图表会为当前情境中的每个对象调用此函数。

该函数会对传递给Fetch函数的对象进行评估,然后生成一条特定类型的信息,比如布尔值、整数、浮点数或字符串。过滤器节点负责执行逻辑,以判断返回信息是否满足图表设置中表达的逻辑条件:例如返回的整数大于还是小于用户在块中设置的值,返回的字符串是否匹配或包含在用户在块中设置的字符串中等等。

此函数还将返回一个布尔值,说明它是否成功为当前对象计算出输出值。若此布尔值中返回 false 值,则过滤器将排除当前对象。

Get Additional Keyword

Dataprep编辑器调用此函数来获取此块的关键字列表。若用户在控制板顶部的搜索栏中输入的关键字属于函数返回的其中一个关键字,那么即便该块的名称中未出现用户输入的关键字,该块也会出现在编辑器的搜索匹配结果中。

Get Display Fetcher Name

Dataprep编辑器调用此函数以获取此块在控制板中应该显示的名称。

Get Display Fetcher Name

Dataprep编辑器调用此函数以获取所有此类块在实际Dataprep图表中应该显示的名称。

Get Tooltip Text

Dataprep编辑器调用此函数,以获取用户将鼠标移到控制板中此块名称上或Dataprep图表中此类块上时,提示文本中应该显示的文本内容。

必须重载 Fetch 函数才能使过滤器生效。其他函数为可选,但强烈建议您控制块在Dataprep编辑器控制板中的显示方式。

过滤器范例

以下范例显示如何实现 Fetch 函数,以便创建一个选择方式块,让用户根据网格体中包含的分段数量过滤静态网格体资产。

Copy Node Graph

Fetch函数实现

创建自定义操作

当您创建自定义操作时,可重载以下任一或所有函数:

函数

说明

Get Additional Keyword

Dataprep编辑器调用此函数来获取此块的关键字列表。若用户在控制板顶部的搜索栏中输入的关键字属于函数返回的其中一个关键字,那么即便该块的名称中未出现用户输入的关键字,该块也会出现在编辑器的搜索匹配结果中。

Get Category

Dataprep编辑器调用此函数以确定此块应当位于控制板中 操作(Operations) 列表下的哪个子类中。

若不重载此函数,则操作块将出现在在 用户定义(User-defined) 类别下。

Get Display Operation Name

Dataprep编辑器调用此函数以获取此块在控制板中应该显示的名称,以及所有此类型块在实际Dataprep图表中应该显示的名称。

Get Tooltip

Dataprep编辑器将调用此函数,以获取用户将鼠标移到控制板中此块名称上或Dataprep图表中此类块上时,提示文本中应该显示的内容。

On Execution

当您执行Dataprep图表并处理这类操作块时,图表会调用此函数以便修改导入的资产和Actor。通过在这个蓝图后添加更多节点,您可以针对操作中上个块传递给您的资产和Actor,对它们执行更多操作。

欲知图表的详细实现方式,请参见以下章节。

您必须重载 Event On Execution 事件才能使操作生效。函数都是可选的,但强烈建议您控制块在Dataprep编辑器控制板中的显示方式。

Dataprep情境

如果Dataprep系统在执行Dataprep图表时触发了操作块的 执行时(On Execution) 事件,它就会传入一个 情境 对象供您在蓝图图表中使用。这实际上是一张列表,包含了操作可修改的所有Actor和资产。若在Dataprep操作中,操作块位于过滤器块的上方,则此情境对象将包含导入到Dataprep世界中的所有资产和Actor。否则,情境对象所包含的Actor和资产,都是当前Dataprep操作中操作块上方的过滤器筛选后的结果。

您可以使用 Break DataprepContext 节点从情境中获取对象数组。然后,您可以修改情境中的所有对象,或者您可以缩小对象范围,让它们匹配特定类型的对象。

从Dataprep情境中获取对象

例如,上图中的操作只会修改静态网格体中的设置,而不会修改Dataprep情境中可能包含的其它对象(例如Actor、纹理资产或材质资产)。所以,它会遍历情境中的对象数组,然后尝试将每个对象都转换为静态网格体。然后只有当转换成功时才会进行修改。

操作和编辑操作

操作块有两个父类:DataprepOperationDataprepEditingOperation。使用哪一个取决于您需要执行的编辑操作。若只需修改Dataprep情境中已包含的对象,则可将 DataprepOperation 用作父类。若需创建新对象(例如在内容浏览器中创建资产,在关卡中生成新的Actor或修改Dataprep情境中的对象列表),则必须将 DataprepEditingOperation 用作父类。

当您从 DataprepEditingOperation 派生出类时,可以在 Dataprep>编辑操作(Editing Operations) 类别下访问蓝图编辑器(Blueprint Editor)中的其他专用函数:

Dataprep编辑操作

举例而言,可以使用 添加资产(Add Asset) 将资产添加到Dataprep情境中,以便将其包含在Dataprep情境中,进而传递给同一Dataprep操作中的其他块。

正常情况下,应尽可能使用 Dataprep>编辑操作(Editing Operations) 类别中的函数执行操作,而不是使用其他拥有类似作用的节点。Dataprep系统中用于保管所有导入数据的临时场景十分独特;您只能通过这些函数来修改它。

举例而言,应始终使用 Dataprep > Editing Operations > Create Actor 节点生成新Actor,不要使用常规的 Editor Scripting > Level Utility > Spawn Actor from ClassSpawn Actor from Object

操作范例

移除UV通道

下图中的 On Execution 事件会找到情境中的所有静态网格体资产并移除其UV通道。UV通道的移除依据源于一个名为 索引(Index) 的变量。在这个例子中,索引(Index) 变量被标记为可公开编辑,因此它会作为一项设置出现在Dataprep图表中的块中。

移除UV通道的自定义块

Copy Node Graph

On Execution函数实现

这个简单示例旨在展示如何将静态网格体从当前情境中拆分出来,以及如何使用蓝图中公开的操作来修改这些网格体。然而在有些时候,只用单个常量索引值来指定要移除的通道并不实际。例如,当静态网格体的UV通道数量比指定的索引值要小时,或者当指定的索引值等于静态网格体用来保存光照贴图(无法移除)的索引值时,上述方法就不管用了。假如您想实现一种较为实用的Dataprep块来操作UV通道,您可能需要考虑您在编辑静态网格体时使用的规范。

分配静态网格体Actor

在下图中, On Execution 事件会找到情境中的所有静态网格体Actor,然后以网格形式将它们重新分配到空间中。网格的最小值和最大值源自名为 最小值(Min)最大值(Max) 的变量。它们都被标记为可公开编辑,因此会作为设置出现在Dataprep图表中的块中。但是,Actor 变量(用于在场景中存储静态网格体Actor数组)未标记为可编辑。因此,它不会出现在Dataprep图表中的块中。

用于重新分配静态网格体资产的自定义块

Copy Node Graph

On Execution函数实现

将对象添加到层

下图中的 On Execution 事件会在情境中寻找Actor,然后将其添加到编辑器中的指定层。

将Actor添加到层的自定义块

Copy Node Graph

On Execution函数实现

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback