行为树

< 所有主题

行为树简介

定义

行为树(Behavior Tree)是一种用于控制虚拟角色或系统行为的决策结构。它由多个节点组成,每个节点代表一个行为或决策步骤。行为树通过层次化的方式将复杂行为拆分成简单、可管理的子行为。

在 FactVerse Designer 中,行为树可以用于控制孪生体行为(例如设备的启动和停止)、孪生体的状态管理(如 AGV 小车从“待机”切换到“工作”状态)等。

执行规律

    1. 行为树的执行顺序为从上至下,从左到右。
    2. 当行为树运行到终结状态时,会回到根节点重新开始运行。
    3. 根节点只能有一个子节点。
    4. 当节点有子节点时,会优先执行它包含的子节点,当子节点按照从左至右的顺序运行完之后,再运行下一个节点。
    5. 行为树在不处于闲置状态或被删除时,是会一直按照顺序循环运行。

节点类型

根节点

创建行为树时会自动生成根节点,它是行为树执行的起始点。根节点不能被删除,而且只能连接一个子节点。

复合节点

复合节点用于控制子节点的执行顺序和逻辑判断,包括并行节点、选择节点和顺序节点。复合节点可以添加多个子节点,每个子节点可以是复合节点或动作节点。

    • 并行节点:并行节点下所有节点将一起执行。并行成功标准可以选择:
        • 一个子节点成功则成功
        • 所有子节点成功则成功
    • 选择节点:选择节点下方的子节点按照从左往右的顺序执行。只要遇到一个子节点返回成功,整个选择节点返回成功并且后面的子节点将不再执行;如果所有子节点都失败,则选择节点返回失败。
    • 顺序节点:顺序节点下方的子节点按从左到右的顺序执行。顺序节点提供两种的遍历策略:
        • 遇到子节点执行失败则返回失败
        • 全部子节点执行失败则返回失败

动作节点

动作节点表示孪生体具体的行为或任务,例如沿路径移动、等待等。动作节点是行为树中的叶子节点,可以实现复杂的逻辑。当执行动作节点时,它会执行特定的动作,并根据情况返回成功、运行中或失败三种返回值。

    • 成功:表示当前节点运行成功;
    • 运行中:表示当前节点还在运行中,下一次调用行为树时仍然运行当前节点;
    • 失败:表示当前节点运行失败。

节点的配置

节点基本操作

    1. 添加节点:从节点菜单中拖拽到编辑区。
    2. 删除节点:在编辑区中选中要删除的节点,点击工具栏中的删除按钮。
    3. 重命名节点:在编辑区中选中要重命名的节点,在属性区上方节点名称处,输入节点的新名称。
    4. 连接节点:要连接A 与B两个节点,从节点 A下方的横线处,拖拽出一条黄色的连接线,将其连接到节点B上方,松开鼠标完成连接。

5. 删除节点连接线:按住鼠标右键,在要删除的连接线上划过就可以切断两个节点之间的连线。

6. 整理节点:选中根节点,然后按下 L 键,便可以自动整理树的格式。

节点的常用设置

行为树中的节点条件和属性设置中经常会需要获取孪生体的属性、查找孪生体、获取孪生体的位置。

获取属性

获取属性方式:获取孪生体属性的方式

    • 直接选择属性:直接从孪生体模板中选择所需属性。
    • 通过 ID 查找:根据属性 ID 进行查找获取。

获取位置

    • 手动输入:用户直接手动输入属性值或 ID。
    • 孪生体的属性:选择从孪生体模板中的特定属性中获取属性值。
    • 树属性:从当前行为树的属性中获取属性值。
    • 当前属性:当行为树遍历容器内的属性时,本次遍历的属性为当前属性。

查找孪生体的方式

查找孪生体的基础方式

    • 自身:选择当前正在执行行为树的孪生体。
    • 临时孪生体:选择在执行过程中临时创建或使用的孪生体。
    • 属性中的孪生体:通过属性中存储的唯一标识符来查找并选择特定的孪生体。
        • 从属性中获取物体:
            • 孪生体的属性
            • 树属性
            • 当前属性
        • 使用 ID 查找孪生体
            • 孪生体ID
            • 属性ID
    • 场景中的所有孪生体:在整个场景中查找孪生体。
      • 孪生体过滤方式:当使用“场景中的所有孪生体”作为查找孪生体的基础方式时,可以通过不同的过滤方式来精确定位需要查找的孪生体
        • :不使用任何过滤条件,直接在场景中查找所有孪生体。
        • 在场景中通过ID查找:根据孪生体的唯一ID进行查找。每个孪生体在创建时都有一个唯一标识符(ID)。
        • 按最小距离查找孪生体:根据孪生体与当前执行行为树的孪生体之间的距离进行筛选,找到最近的孪生体。

查找孪生体的进阶方式

    • :无特定进阶方式。
    • 父孪生体:查找当前孪生体的父孪生体。例如,传送带上的货物的父孪生体是传送带。
    • 最后一个子孪生体:查找当前孪生体的最后一个子级孪生体。例如,一组生成的产品中的最后一个产品。
    • 第一个子孪生体:查找当前孪生体的第一个子级孪生体。例如,一组生成的产品中的第一个产品。
    • 所有子孪生体:查找当前孪生体的所有子级孪生体。例如,生产线上的所有产品。
    • 上一个孪生体:查找当前孪生体的前一个兄弟孪生体。例如,传送带上某个产品的前一个产品。
    • 下一个孪生体:查找当前孪生体的下一个兄弟孪生体。例如,传送带上某个产品的下一个产品。

查找对象的类型:选择要查找的目标对象,目标对象可以是孪生体本身或孪生体中的特定角色。

    • 孪生体:选择查找整个孪生体对象,用于对孪生体进行整体操作或获取其属性。例如,查找并操作一台机器人、一个生产线设备或一个货架单元。
    • 孪生体中的角色:选择查找孪生体中的特定角色。这种类型用于对孪生体内部的具体部分进行操作,例如,一个原料生成器的孪生体模板中包含生成器模型、出口和进度条几个角色。

获取位置的方式

获取位置的方式

    • 手动输入
        • 直接输入点的3维坐标值,格式x,y,z
        • 示例:输入 “10,20,30”表示具体的空间位置。
    • 孪生体的位置:使用孪生体的当前位置
    • 孪生体的属性:从孪生体的属性中获取位置。
    • 树属性:从行为树的属性中获取位置。
    • 通过属性寻找路径地图中的点位:使用属性值在路径地图中寻找点位。

坐标类型

    • 局部坐标:相对于某个参考点的坐标。传送带上的货物的局部坐标是相对于传送带中心点的坐标。
    • 坐标:全局坐标,即世界坐标。

孪生体节点

孪生体节点用于创建、删除和操作孪生体及其属性。

创建孪生体

功能:以指定姿态(位置、旋转角度)创建指定孪生体模板对应的孪生体。

示例:在工厂生产线上自动生成产品。以下示例为配置“创建孪生体”节点使孪生体 A 在自己的出口处创建新的孪生体:

    • 创建孪生体使用的模板
        • 获取属性方式:选择“直接选择属性”
        • 获取位置:选择“孪生体的属性”
        • 孪生体的属性:选择“孪生体 A 的模板” >“产生孪生体的标识符”(用户在孪生体 A 的模板中自定义的用于模板标识符的属性)
    • 查找孪生体的方式
        • 查找孪生体的基础方式:选择“自身”
    • 创建孪生体的位置
        • 获取属性方式:选择“直接选择属性
        • 获取位置:选择“孪生体的属性
        • 孪生体的属性:选择“孪生体 A 的模板”> “出口” > “出入口的位置”

删除孪生体

功能:删除指定孪生体。例如,当生产线上的产品已经过期或不再需要时,自动删除这些产品。

设置属性

功能:设置孪生体或行为树的任意属性。

设置孪生体姿态

功能:设置孪生体或孪生体内角色的位置和旋转。例如,调整机器人手臂的位置和角度以执行特定任务。

设置孪生体父物体

功能:将孪生体设置为另一个孪生体的子物体。

获取孪生体

功能:将孪生体设置为当前孪生体或者将孪生体标识符保存到目标孪生体属性。

显示隐藏孪生体

功能:显示或隐藏孪生体或孪生体中的角色。

属性转 Vector3

功能:将某个属性值转换为三维向量(Vector3)形式。

删除容器元素

功能:从指定的容器(如列表、字典)中移除一个元素。容器是可以存储和管理多个元素的属性。这些属性可以包含其他对象或基本数据类型,并且提供了一些方法来访问和操作这些元素。当前版本支持的容器类型的属性有列表(List)和字典(Dictionary)。例如,从一个装有多个产品的虚拟仓库中移除指定的产品。

路径节点

路径节点用于设置和控制孪生体的移动路径。

设置孪生体移动路径

功能:将指定路径保存到孪生体属性中。

示例:以下示例演示如何使用“设置孪生体移动路径”节点为传送带上的物品设置移动路径。

    • 要移动的孪生体
    • 指定孪生体
        • 查找孪生体的基础方式:选择“临时孪生体”
        • 查找对象的类型:选择“孪生体”
    • 目标路径
        • 获取属性方式:选择“直接选择属性”
        • 获取位置:选择“孪生体的属性”
        • 孪生体的属性:选择“传送带模板”> “配置路线”属性
    • 查找孪生体的方式
        • 查找孪生体的基础方式:自身
    • 移动的起点:当前位置
    • 设置孪生体移动的速度
        • 获取属性方式:选择“直接选择属性”
        • 获取位置:选择“孪生体的属性”
        • 孪生体的属性:选择“传送带模板”> “传送带速度”属性
    • 查找孪生体的方式
        • 查找孪生体的基础方式:选择“自身”
    • 进入路径时是否保持原始旋转角度:是

沿路径移动孪生体

功能:沿指定路径移动指定的孪生体。例如,为 AGV 小车指定路径、起始点和移动速度,使 AGV 小车能够按照设定的路径和速度移动。

移动一步

功能:使目标孪生体以配置速度移动一步。例如,在自动化生产线上,使传送带上的物体移动一步,模拟物体在传送带上逐步移动的过程。

生成路径

功能:设置孪生体的当前移动路径属性。例如,使用“生成路径”节点为孪生体(如机器人或 AGV 小车)配置“当前移动路径”属性,并且配合“沿路径移动孪生体”节点,使孪生体能够沿着预定路径移动。

追踪路径规划

功能:设置孪生体的追击目标、最短路径、起始点,自动寻路追击目标孪生体。例如,机械臂在传送带上抓取一个移动的货物。

出入口节点

入口获取孪生体

功能:从出入口获取孪生体并保存到指定属性中。

入口移除孪生体

功能:删除出入口处的孪生体。

设置孪生体到出入口

功能:将目标孪生体放置到指定出入口处。

存储区节点

出货整理

功能:将指定孪生体移出指定存储区。

入货整理

功能:将指定孪生体放入指定存储区。

角色节点

播放动画

功能:播放指定孪生体角色指定动画,默认播放一次。

示例:以下示例演示如何使用“播放动画”节点为“六轴机械臂”播放“拾取并移动物品位置”的动画。

    • 目标对象
        • 查找孪生体的基础方式:自身
        • 查找对象的类型:孪生体中的角色
        • 目标角色ID:六轴机械臂
    • 动画控制
        • 动画名称:拾取并移动物品位置
        • 动画速度:1(1倍速)

注意

    • 目标角色ID 需要手工填写,即该模型角色的名称,您可以在模板编辑器中查看。
    • 动画名称 需要手工填写,模型角色必须包含该动画,您可以在 DataMesh Importer 中打开模型查看具体动画名称。

工具节点

闲置

功能:停止行为树的运行。

示例

以下闲置节点使用“出口处是否存在孪生体”的条件进行判断,当孪生体出口处存在其他孪生体时停止运行行为树。

产生记录

功能:记录节点用于输出指定的文本内容,输出的内容显示在场景播放界面中的“场景输出信息记录”面板中。

等待

功能:等待节点用于暂停行为树的执行,直到等待时间结束为止。一旦等待时间结束,行为树将继续执行等待节点后续的节点。

行为树节点

添加行为树

功能:将目标行为树添加到目标孪生体上。

移除行为树

功能:从目标孪生体上移除目标行为树。

数学节点

数学节点用于进行各种数学运算,并将结果应用到孪生体属性中。

Sin函数

功能:将输入值转换为对应的正弦值并输出。

Cos函数

功能:将输入值转换为对应的余弦值并输出。

Tan函数

功能:将输入值转换为对应的正切值并输出。

正态函数

功能:使用输入值生成正态分布的输出数值。

泊松函数

功能:使用输入值生成泊松分布的输出数值。

随机数

功能:输出一个随机数。

加法运算

功能:选择孪生体的两个属性值进行加法运算,将计算结果替换孪生体某个指定属性值或与其相加。

减法运算

功能:选择孪生体的两个属性值进行减法运算,将计算结果替换孪生体某个指定属性值或与其相加。

乘法运算

功能:选择孪生体的两个属性值进行乘法运算,将计算结果替换孪生体某个指定属性值或与其相加。

除法运算

功能:选择孪生体的两个属性值进行除法运算,将计算结果替换孪生体某个指定属性值或与其相加。

事件节点

接收事件

功能:用于监听并响应指定事件。只有一个孪生体可以监听并响应此事件,例如,如果有两个 AGV 需要争抢同一个货物时,可以使用接收事件节点确保只有一个 AGV 响应货物到达的事件,从而避免冲突。

发送事件

功能:发送指定事件以触发其他孪生体的行为或动作。例如,在生产线上,当一个加工步骤完成后,可以发送一个事件通知下一个加工步骤的孪生体开始工作。

节点的条件

定义

节点的条件可添加在复合节点和动作节点上,是指节点是否执行所需要满足的条件。满足条件则执行;不满足则不执行,并返回给父节点。

    • 条件 :一个条件。
    • 条件组:条件组 内的条件为与的关系。它的意思是必须条件组中的每个条件都满足时,节点才可以执行。
    • 多条件组:一个节点可以创建多个条件组 。多条件组之间为或的关系。它的意思是只要满足其中一个条件组,节点就可以执行。

常见条件

出入口是否存在孪生体

此条件用于判断孪生体的出口或入口处是否存在其他孪生体。

配置参数

    • 目标出入口:设置需要检查的出入口。
      • 出入口所在孪生体:指定哪个孪生体的出入口需要检查。
        • 查找孪生体的基础方式:选择查找孪生体的基础方式。
        • 查找孪生体的进阶方式:选择查找孪生体的进阶方式。
        • 出入口名称:选择具体需要检查的出入口。

示例

下面的示例判断当前执行行为树的孪生体的入口处是否存在其他孪生体。

比较两个孪生体的属性

此条件用于比较两个特定属性值,以确定是否满足特定条件。根据比较结果进行相应的行为逻辑处理。

配置参数

    • 源属性
      • 获取属性方式:选择如何获取源属性。
      • 获取位置:设置获取源属性的方式。
      • 查找孪生体的方式:选择如何查找孪生体。
    • 对比属性
      • 获取属性方式:选择如何获取目标属性。
      • 获取位置:设置获取属性值的方式。
      • 查找孪生体的方式:选择如何查找孪生体。
    • 比较方式
      • 等于:源属性值等于对比属性值。
      • 大于:源属性值大于对比属性值。
      • 小于等于:源属性值小于等于对比属性值。
      • 大于等于:源属性值大于等于对比属性值。
      • 不等于:源属性值不等于对比属性值。

示例

假设我们需要比较两个孪生体A和B的“位置”是否相同,可以按照以下步骤进行设置:

    1. 源属性
      • 获取属性方式:选择“直接选择属性”。
      • 获取位置:选择“孪生体的属性”。
        • 孪生体的属性:选择孪生体A的模板中的 “位置”属性。
      • 查找孪生体的基础方式:选择“自身”,即当前执行行为树的孪生体A。
    1. 对比属性
      • 获取属性方式:选择“直接选择属性”。
      • 获取位置:选择“孪生体的属性”。
        • 孪生体的属性:选择孪生体B的模板中的 “位置”属性。
      • 查找孪生体的方式
        • 查找孪生体的基础方式:选择“场景中的所有孪生体”。
        • 孪生体过滤方式:选择“在场景中通过ID查找”。
        • 使用ID查找孪生体:选择“孪生体ID”。
        • 值:“孪生体B
    1. 比较方式:选择“等于”。

判断两个点间的距离

比较两个点之间的距离,根据距离参考值的比较结果执行相应的行为。

配置参数

    • 第一个点
      • 获取位置的方式:选择如何获取第一个点的位置。
        • 手动输入:直接输入点的3维坐标值,格式x,y,z
        • 孪生体的位置:使用孪生体的位置作为第一个点的位置。
        • 孪生体的属性:从孪生体的属性中获取位置。
        • 树属性:从行为树的属性中获取位置。
        • 通过属性寻找路径地图中的点位:使用属性值在路径地图中寻找点位。
      • 坐标类型:选择使用的坐标类型。
        • 局部坐标:相对于某个参考点的坐标。传送带上的货物的局部坐标是相对于传送带中心点的坐标。
        • 坐标:全局坐标,即世界坐标。
      • 查找孪生体的方式:选择如何查找孪生体。
    • 第二个点
      • 获取位置的方式:选择如何获取第二个点的位置。
      • 坐标类型:选择使用的坐标类型,局部坐标或坐标。
      • 查找孪生体的方式:选择如何查找孪生体。
    • 距离参考值
      • 获取属性的方式:选择获取距离参考值的方式。
      • 获取位置:选择从哪里获取距离参考值。
    • 比较方式:选择比较方式,用于判断两个点之间的距离与参考值的关系。
      • 等于: 两个点的距离等于参考值。
      • 小于:两个点的距离小于参考值。
      • 大于:两个点的距离大于参考值。
      • 小于等于:两个点的距离小于等于参考值。
      • 大于等于:两个点的距离大于等于参考值。
      • 不等于:两个点的距离不等于参考值。

示例

假设我们需要判断传送带上两个临时孪生体(产品)A 和 B 之间的距离是否小于指定的安全距离,可以按照以下步骤进行设置:

    1. 第一个点
      • 获取位置的方式:选择“孪生体的位置”。
      • 坐标类型:选择“局部坐标”。
      • 查找孪生体的基础方式:选择“临时孪生体”,即孪生体A。
    2. 第二个点
      • 获取位置的方式:选择“孪生体的位置”。
      • 坐标类型:选择“局部坐标”。
      • 查找孪生体的基础方式:选择“临时孪生体”。
      • 查找孪生体的进阶方式:选择“上一个孪生体”,即孪生体B。
    3. 距离参考值
      • 获取属性的方式:选择“直接选择属性”。
      • 获取位置:选择“手动输入”。
      • 手动输入:“1”。
    1. 比较方式
      • 选择小于

存储区是否有物体

此条件用于判断指定的存储区中是否有物体存在。

配置参数

    • 目标存储区:设置需要检查的存储区。
      • 存储区所属孪生体:指定存储区所属的孪生体。
        • 查找孪生体的基础方式:选择如何查找存储区所属的孪生体。
        • 查找孪生体的进阶方式:进一步精确查找存储区所属的孪生体的方式(如按特定条件过滤)。

示例

下面的示例判断当前执行行为树的孪生体的存储区中是否有物体。

孪生体是否可以放入存储区

判断某个孪生体是否可以放入指定的存储区。

配置参数

    • 目标存储区:指定目标存储区。
      • 存储区所属孪生体:用于指定存储区所在的孪生体。
        • 查找孪生体的基础方式:选择查找目标存储区所属孪生体的基础方式。
        • 查找孪生体的进阶方式:进一步精确查找目标存储区所属孪生体。
      • 要存放的孪生体:指定要存放的孪生体。
        • 查找孪生体的基础方式:选择查找要存放孪生体的基础方式。
        • 查找孪生体的进阶方式:进一步精确查找要存放孪生体。

示例

假设我们需要判断某个货物是否可以放入当前执行行为树的A孪生体的存储区,可以按照以下步骤进行设置:

    1. 目标存储区
      • 存储区所属孪生体
        • 查找孪生体的基础方式:选择“自身”。
    1. 要存放的孪生体
      • 查找孪生体的基础方式:选择“临时孪生体”。

孪生体是否相同

此条件用于判断两个孪生体是否相同。

配置参数

    • 比较孪生体
      • 查找孪生体的基础方式:选择如何查找比较孪生体。
      • 查找孪生体的进阶方式:进一步精确查找比较孪生体的方式(如按特定条件过滤)。
    • 指定孪生体ID
      • 查找孪生体的方式:选择如何查找对比孪生体。

编辑行为树

基本流程

编辑行为树的基本流程可以分为以下几个步骤:

1. 功能拆分

将复杂的功能拆分为多个独立的子功能。例如,对于一个原料生成器,可以将功能拆分为“生产”和“输出”两个子功能。

2. 准备孪生体模板

a) 创建孪生体模板

b) 添加资源:根据功能拆分的结果,为每个子功能实现的具体目标添加资源。例如,原料生成器的生产功能需要添加一个出口,以便将生成的物品输出。

c) 属性设置:为每个子功能设置相关的属性。例如,对于原料生成器的生产功能,需要设置生产间隔和生产物品所需使用的模板这两个属性。

3. 编辑行为树:使用行为树编辑器,为每个子功能定义具体的行为逻辑。例如,原料生成器的生产功能可以设置为以一定时间间隔(等待节点)进行生产(创建孪生体节点)。输出功能可以使用设置孪生体出入口的节点发送货物至出口。

示例

原料生成器的基本功能

1. 功能拆分:“生产”和“输出”。

2. 准备孪生体模板:

a) 创建孪生体模板:创建一个孪生体模板,并在模板中添加一个原料生成器模型(“/Public Directory/FactVerseDLC/ChuangJianQi_DLC”)。

b) 添加资源:为原料生成器的生产功能添加一个“出口”。

c) 属性设置:

i. 在孪生体模板窗格中,点击元数据旁的︙,选择添加结构“Part_1”。

ii. 设置生产间隔属性:在“Part_1”下添加一个“产生孪生体间隔时间”(Double 类型)属性,并作如下设置:

            • 单位:“秒”;
            • 默认值:“3”;
            • 勾选“是否在孪生体中显示”选项。勾选此项后,用户在场景编辑器中使用此模板生成孪生体时,可以编辑此项属性。

iii. 设置生产物品所需使用的模板的 ID 属性:在“Part_1”下添加一个“产生孪生体的标识符”(String类型)属性,并作如下设置:

            • 用途:选择“孪生体模板”;
            • 勾选“是否在孪生体中显示”选项。

iv. 保存模板:点击工具栏中的【保存】按钮 进行模板的保存。

3. 行为树编辑:

a) 创建行为树

i. 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

ii. 在打开的窗口中,选择存储路径,并填写行为树名称。

iii. 点击【新建】按钮完成行为树的新建。

iv. 点击工具栏中的【保存】按钮 进行模板的保存。

b) 编辑行为树:新建的行为树“原料生成器行为树”只包含一个根节点,下面的步骤将为“原料生成器行为树”添加节点和节点的运行条件。

i. 在孪生体模板窗格中,双击行为树栏下新建的“原料生成器行为树”,打开行为树编辑器。

ii. 为“原料生成器行为树”添加一个选择节点,连接根节点选择节点。关于连接方式请参考节点基本操作

iii. 添加闲置节点,连接选择节点闲置节点。设置闲置节点的运行条件,使其当出口存在生产的物品时停止。

iv. 添加顺序节点,连接选择节点顺序节点

v. 添加等待节点,连接等待节点与顺序节点。设置等待节点的属性:

            • 等待时间
              • 获取位置:孪生体的属性
              • 孪生体的属性:产生孪生体间隔时间

vi. 为生成器添加生产物品的节点:添加一个创建孪生体节点,连接顺序节点创建孪生体节点,设置创建孪生体节点的属性:

            • 创建孪生体使用的模板
              • 获取属性方式:直接选择属性
              • 获取位置:孪生体的属性
              • 孪生体的属性:产生孪生体的标识符
            • 创建孪生体的位置
              • 获取属性方式:直接选择属性
              • 获取位置:孪生体的属性
              • 孪生体的属性:原料生成器 > 出口_1 > 出入口的位置

vii. 添加设置孪生体到出入口的节点,连接顺序节点与设置孪生体到出入口节点,设置节点的属性:

            • 目标出入口
              • 出入口所在孪生体
                • 查找孪生体的基础方式:自身
              • 出入口名称:原料生成器 > 出口_1
            • 设置到出口的孪生体:“临时孪生体”

viii. 点击工具栏中的【保存】按钮 保存行为树。

会移动的小球

1. 创建一个球体孪生体模板:

a) 点击主页中的【新建模板】,打开模板编辑器。

b) 将工具窗格中的“球体”拖拽到场景区中,并调整其合适位置。

c) 将小球的颜色改为绿色。

d) 点击工具栏中的保存按钮 ,保存模板名称为“移动的小球”。

2. 为“移动的小球”模板添加主功能结构:

a) 在孪生体模板窗格中,点击元数据旁的︙,选择添加结构

b) 下拉滚动条找到新添加的结构 “Part_1”,点击“Part_1”,在属性区修改结构名称为“主功能”。

c) 在“主功能”结构下添加 “实时位置”(Vector3)属性。

3. 为“移动的小球”模板添加驱动小球移动的行为树:

a) 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

b) 保存行为树并命名为“移动小球”。

4. 编辑行为树逻辑

a) 双击“移动小球”行为树,打开行为树编辑器。

b) 在根节点下添加一个顺序节点

c) 在顺序节点下添加一个设置孪生体姿态节点“设置孪生体姿态1”,并为该节点做如下属性设置:

指定孪生体

        • 查找孪生体的基础方式:自身
        • 查找对象的类型:孪生体

设置孪生体的位置

        • 获取属性方式:直接选择属性
        • 获取位置:手动输入
        • 手动输入:0.5,0,0

d) 在顺序节点下添加一个等待节点“等待1”,并设置等待时间的手动输入值为“5”。

e) 添加一个设置孪生体姿态节点:

i. CTRL+C 复制 “设置孪生体姿态1”节点,CTRL+V 即在顺序节点下添加一个新的设置孪生体姿态节点“copy_设置孪生体姿态1”。

ii. 重命名为“设置孪生体姿态2”。

iii. 将设置孪生体的位置手动输入设置为“0.5,0,-0.5”。

f) CTRL+C 复制 “等待1”节点,CTRL+V 即在顺序节点下添加一个新的等待节点“copy_等待1”,并将节点重命名为“等待2”。

g) 通过复制“设置孪生体姿态1”节点的方式添加一个“设置孪生体姿态3”节点,并将设置孪生体的位置手动输入设置为“0,0,-0.5”。

h) CTRL+C 复制 “等待1”节点,CTRL+V 即在顺序节点下添加一个新的等待节点“copy_等待1”,并将节点重命名为“等待3”。

i) 点击工具栏中的【保存】按钮 保存行为树。

j) 点击 < 退出行为树编辑器。

k) 保存“移动的小球”模板。点击主页按钮退出模板编辑器。

5. 创建一个场景,在场景中添加一个会移动的小球。

a) 新建一个场景命名为“移动的小球”。

b) 使用“移动的小球”模板创建一个 “移动的小球1”。

c) 将“移动的小球1”添加到场景中。

d) 播放场景,预览小球移动的效果。

响应信号改变方块的颜色

在本例中,我们将使用事件节点监听和响应事件,从而改变方块的颜色属性。

前提

请先按创建全新的模板中的步骤准备好“会变色的方块”模板。

1. 创建一个球体孪生体模板:

a) 点击主页中的【新建模板】,打开模板编辑器。

b) 将工具窗格中的“球体”拖拽到场景区中,并调整其合适位置。

c) 点击工具栏中的保存按钮 ,保存模板名称为“发送信号的小球”。

2. 为“发送信号的小球”模板添加主功能结构:

a) 在孪生体模板窗格中,点击元数据旁的︙,选择添加结构

b) 下拉滚动条找到新添加的结构 “Part_1”,点击“Part_1”,在属性区修改结构名称为“主功能”。

c) 在“主功能”结构下添加 “信号”(Int)属性。

3. 为“发送信号的小球”模板添加发送信号的行为树:

a) 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

b) 保存行为树并命名为“发送信号”。

4. 编辑行为树逻辑:本例中发送三个信号 “100”、“200”和“300”。

a) 双击“发送信号”行为树,打开行为树编辑器。

b) 在根节点下添加一个顺序节点,并使用默认属性。

c) 在顺序节点下添加一个发送事件节点“发送信号100”,设置这个节点的属性如下:

        • 事件类型
          • 获取属性方式:直接选择属性
          • 获取位置:手动输入
          • 手动输入:100

d) 在顺序节点下添加一个等待节点“等待1”,并设置等待时间的手动输入值为“2”。

e) 添加“发送信号200”节点:

i. 复制粘贴“发送信号100”节点,节点将自动添加到顺序节点下方。

ii. 将其重命名为“发送信号200”。

iii. 重新连接顺序节点和“发送信号200”节点。

iv. 修改“发送信号200”节点的事件类型中的手动输入值为“200”。

f) 添加一个等待节点“等待2”,并设置等待时间的手动输入值为“2”。

g) 添加“发送信号300”节点:

i. 复制粘贴“发送信号100”节点,节点将自动添加到顺序节点下方。

ii. 将其重命名为“发送信号300”。

iii. 重新连接顺序节点和“发送信号300”节点。

iv. 修改“发送信号300”节点的事件类型中的手动输入值为“300”。

h) 添加一个等待节点“等待3”,并设置等待时间的手动输入值为“2”。

下图为完整的行为树结构:

i) 保存行为树并退出行为树编辑界面。

j) 保存模板并返回主页界面。

5. 为“会变色的方块”模板添加接收信号并变色的行为树。

a) 打开“会变色的方块”模板。

b) 将方块颜色改为白色。

c) 在模板里新建一个“事件响应”行为树。

d) 双击行为树“事件响应”打开行为树编辑界面。

e) 在根节点下添加一个并行节点

f) 在并行节点下添加一个顺序节点“顺序节点1”。

g) 在“顺序节点1”下添加一个接收事件节点“接收信号100”,设置接收事件节点的属性如下:

        • 事件类型
          • 获取属性方式:直接选择属性
          • 获取位置:手动输入
          • 手动输入:100
          •  

h) 在“顺序节点1”下添加一个设置属性节点,重命名为“设置颜色”,并且设置“设置颜色”节点的属性如下:

          • 目标属性
            • 获取属性方式:直接选择属性
            • 属性来源:孪生体的属性
            • 数值的设置策略:替换原始值
            • 孪生体的属性:颜色(选择“会变色的方块”的“颜色”属性)
            • 指定孪生体
              • 查找孪生体的方式:自身
          • 目标属性值
            • 获取属性方式:直接选择属性
            • 获取位置:手动输入
            • 手动输入:255,254,145,10 (对应颜色为

i) 在并行节点下添加一个顺序节点“顺序节点2”。

j) 在“顺序节点2”下添加一个接收事件节点“接收信号200”,设置接收事件节点的属性如下:

        • 事件类型
          • 获取属性方式:直接选择属性
          • 获取位置:手动输入
          • 手动输入:200
        •  

k) 在“顺序节点2”下添加一个设置属性节点,重命名为“设置颜色”,并且设置“设置颜色”节点的属性如下:

        • 目标属性
          • 获取属性方式:直接选择属性
          • 属性来源:孪生体的属性
          • 数值的设置策略:替换原始值
          • 孪生体的属性:颜色(“会变色的方块”的“颜色”属性)
          • 指定孪生体
            • 查找孪生体的方式:自身
        • 目标属性值
          • 获取属性方式:直接选择属性
          • 获取位置:手动输入
          • 手动输入:100,100,200,200 (对应颜色为

 l) 在并行节点下添加一个顺序节点“顺序节点3”。

m) 在“顺序节点3”下添加一个接收事件节点“接收信号300”,设置接收事件节点的属性如下:

        • 事件类型
        • 获取属性方式:直接选择属性
        • 获取位置:手动输入
        • 手动输入:300
        •  

n) 在“顺序节点3”下添加一个设置属性节点,重命名为“设置颜色”,并且设置“设置颜色”节点的属性如下:

        • 目标属性
          • 获取属性方式:直接选择属性
          • 属性来源:孪生体的属性
          • 数值的设置策略:替换原始值
          • 孪生体的属性:颜色(“会变色的方块”的“颜色”属性)
          • 指定孪生体
            • 查找孪生体的方式:自身
        • 目标属性值
          • 获取属性方式:直接选择属性
          • 获取位置:手动输入
          • 手动输入:255,100,100,100 (对应颜色为

下图为完整的行为树结构:

o) 点击工具栏中的【保存】按钮 保存行为树。

p) 点击 < 退出行为树编辑器。

q) 保存模板并返回主页界面。

6. 创建一个新场景,命名为“事件响应”

7. 在场景中添加一个能发送事件的球体、两个能接收事件的正方体。

a) 使用“会变色的方块”模板创建两个方块“方块1”、“方块2”。

b) 使用“发送信号的小球”模板创建一个 “发信号的球体1”。

c) 将“方块1”、“方块2”和“发信号的球体1”添加到场景中。

8. 保存场景。

9. 播放场景

追击移动的小球

本示例介绍如何在虚拟场景中创建一个方块孪生体,并通过行为树逻辑,使其自动追击一个移动的小球。

1. 创建一个方块孪生体模板:

a) 点击主页中的【新建模板】,进入模板编辑器。

b) 将工具窗格中的“方块”拖拽到场景区中,并调整其合适位置。

c) 点击工具栏中的保存按钮 ,将模板命名为“追击目标的方块”。

2. 为“追击目标的方块”模板添加驱动小球移动的行为树:

a) 在孪生体模板窗格中,点击行为树栏旁的︙,选择新建行为树选项。

b) 保存行为树并命名为“追击目标的方块”。

3. 编辑行为树逻辑

a) 双击“追击目标的方块”行为树,打开行为树编辑器。

b) 在根节点下添加一个顺序节点

c) 在顺序节点下添加一个追踪路径规划节点,并配置如下属性:

        • 路径保存到
          • 获取属性方式:直接选择属性
          • 属性来源:孪生体的属性
          • 数值的设置策略:替换原始值
          • 孪生体的属性:当前移动路径(“追击目标的方块”的“当前移动路径”属性)
        • 起始点
          • 获取属性方式:直接选择属性
          • 获取位置:手动输入
          • 手动输入:point0
        • 要追击的目标
          • 指定孪生体
            • 查找孪生体的基础方式:场景中所有孪生体
            • 孪生体过滤方式:在场景中通过ID查找
            • 从属性中获取物体:孪生体的属性
            • 使用ID查找孪生体:孪生体ID
            • 值:“1435”(“会移动的小球”示例中“移动的小球1”的 ID,可在属性面板中查看该孪生体的 ID)
            • 查找对象的类型:孪生体

e) 在顺序节点下添加一个沿路径移动孪生体节点,并配置如下属性:

          • 设置路径
            • 获取属性方式:直接选择属性
            • 获取位置:孪生体的属性
            • 孪生体的属性:当前移动路径(“追击目标的方块”的“当前移动路径”属性)
          • 是否设置速度:
            • 目标速度:“10”

f) 点击工具栏中的【保存】按钮 保存行为树。

g) 点击 < 退出行为树编辑器。

h) 保存“追击目标的方块”模板,然后点击主页按钮退出模板编辑器。

4. 创建一个场景:新建一个场景命名为“追击移动小球”。

5. 在场景中添加一个追击目标的方块和一个移动的小球

a) 使用“追击目标的方块”模板创建一个 “追击目标的方块1”,并将其添加到场景中,位置设为“0,0,0”。

b) 将“移动的小球1”添加到场景中,位置设为“0.5,0,-0.5”。

6. 创建四个点位互相连通的路径

a) 隐藏“追击目标的方块1”和“移动的小球1”,以免创建路径时路径点的位置被遮挡导致路径点无法准确放置或无法看清,从而影响路径的创建。

b) 进入路径规划界面,使用构建模式创建以下四个点位,并将它们相互连接起来。这些点位将构成“追击目标的方块1”的移动路径,其中“point0”是其起始点。方块将在这四个路径点构成的路径中计算追击“移动的小球1”的最短路径。

        • point0 (0,0,0)
        • point1 (0.5,0,0)
        • point2 (0.5,0,-0.5)
        • point3 (0,0,-0.5)

c) 切换至选择模式,将连线方向改为双向。

d) 保存路径并退出路径规划界面。

e) 将“追击目标的方块1”和“移动的小球1”切换至显示状态。

7. 保存场景。

8. 播放场景:“追击目标的方块1”会按照最短路径追击“移动的小球1”。

目录