概述
智能对象(Smart Objects) 是一种放置在关卡中供AI艾真体和玩家交互的对象。这些对象自带了交互所需的所有信息。
简要来说,智能对象表示关卡中的一组活动,可通过预留系统使用。该系统跟踪关卡中的所有智能对象,并允许AI艾真体"预留"一个智能对象,这样,在该智能对象再次可用之前,其他艾真体不能使用它。
目标
在本快速入门指南中,你将了解如何通过AI艾真体创建和使用智能对象。
目标
-
创建AI艾真体在访问智能对象时可以使用的AI游戏行为和行为定义。
-
创建一个智能对象来使用行为定义播放动画蒙太奇。
-
使用行为树和行为树任务创建简单的AI行为。
-
创建可以在关卡中搜索和使用智能对象的AI艾真体。
1 - 必要设置
-
基于 第三人称(Third Person) 模板新建 蓝图(Blueprint) 项目。
-
在主菜单中,转到 设置(Settings)> 插件(Plugins) ,打开 插件(Plugins) 窗口。
-
转到 游戏(Gameplay) 分段,启用 智能对象(Smart Objects) 、 AI行为(AI Behaviors) 插件和 Gameplay行为智能对象(Gameplay Behavior Smart Objects) 插件。如果出现提示,请重新启动编辑器。
阶段成果
在本节中,你创建了一个新项目并启用了智能对象和AI行为插件。你现在已经准备好为AI艾真体创建AI游戏行为。
2 - 创建AI游戏行为
在本节中,你将创建游戏行为和游戏配置蓝图,用于定义艾真体在访问智能对象插槽时将执行的操作。
-
在 内容浏览器(Content Browser) 中,右键单击并从 创建基本资产(Create Basic Asset) 分段中选择 蓝图类(Blueprint Class) 。
-
在 选取父类(Pick Parent Class) 窗口中,展开 所有类(All Classes) 分段,然后搜索并选择 游戏行为(Gameplay Behavior) 。单击 选择(Select) 并将新资产命名为 BP_SO_Behavior_PlayMontage 。
-
创建一个新的蓝图类,然后搜索并选择 游戏行为配置(Gameplay Behavior Config) 。单击 选择(Select) 并将新资产命名为 BP_SO_BehaviorConfig 。
-
在 内容浏览器(Content Browser) 中,双击 BP_SO_BehaviorConfig 将其打开。转到 细节(Details) 面板,然后单击 行为类(Behavior Class) 下拉框。选择 BP_SO_Behavior_PlayMontage 。编译并保存蓝图。
-
在 内容浏览器(Content Browser) 中,双击 BP_SO_Behavior_PlayMontage 将其打开。单击 函数(Functions) 旁边的 覆盖(Override) 下拉框,然后选择 OnTriggeredCharacter 。
-
右键单击 Event OnTriggeredCharacter 节点的 游戏对象(Avatar) 引脚,然后选择 提升为变量(Promote to Variable) 。
-
将 游戏对象(Avatar) 变量拖到 事件图表(Event Graph) 并选择 获取游戏对象(Get Avatar) 。从 Avatar 节点拖动,然后搜索并选择 Get Component by Class 。
-
单击 组件类(Component Class) 下拉框,然后搜索并选择 骨骼网格体组件(Skeletal Mesh Component) 。
-
右键单击 事件图表(Event Graph) ,然后搜索并选择 Play Montage 。
-
将 Get Component by Class 节点的 返回值(Return Value) 引脚连接到 Play Montage 节点的 在骨骼网格体中(In Skeletal Mesh Component) 引脚。
-
将 Set Avatar 节点连接到 Play Montage 节点。
-
-
单击 Play Montage 节点上的 蒙太奇播放(Montage to Play) 下拉框。从列表中选择动画蒙太奇。
如果没有可用的动画,可以从虚幻引擎商城获得免费的动画资产包,例如动画初学者内容包。你还可以右键点击动画序列,选择 创建(Create) > 创建动画蒙太奇(Create AnimMontage) ,将动画序列转换为动画蒙太奇。
1 .将 游戏对象(Avatar) 变量拖到 事件图表(Event Graph) 并选择 获取游戏对象(Get Avatar) 。从 Avatar 节点拖动,然后搜索并选择 End Behavior 。
-
将 完成时(On Completed) 和 中断时(On Interrupted) 引脚从 Play Montage 节点连接到 End Behavior 节点。
-
编译并保存蓝图。
此示例使用 Play Montage 节点,而不是 Play Anim Montage 节点,从而使用 完成时(On Completed) 和 中断时(On Interrupted) 引脚来结束行为。这可确保智能对象保持占用状态,直到动画播放完毕。
阶段成果
在本节中,你创建了游戏行为和游戏配置蓝图,艾真体访问智能对象插槽之后,将使用它们来播放动画蒙太奇。你现在可以创建智能对象将使用的行为定义。
3 - 创建智能对象定义数据资产
在本节中,你将创建智能对象定义数据资产,它将定义智能对象的每个插槽的行为。
-
在 内容浏览器(Content Browser) 中,右键单击并选择 杂项(Miscellaneous)>数据资产(Data Asset) 。
-
在 为数据资产实例选择类(Pick Class for Data Asset Instance) 窗口中,搜索并选择 智能对象定义(Smart Object Definition) 。
-
单击 选择(Select) 创建资产并将其命名为 SO_Definition_PlayMontage 。
-
-
在 内容浏览器(Content Browser) 中,双击 SO_Definition_PlayMontage 将其打开。向下滚动到 智能对象(Smart Object) 分段,然后单击 插槽(Slots) 旁边的 添加(+)"(Add (+))" 按钮以添加新插槽。这是AI艾真体在执行该行为时将使用的插槽。
-
单击 默认行为定义(Default Behavior Definitions) 旁边的 添加(+)"(Add (+))" 按钮,然后为 索引0(Index 0) 选择 Gameplay行为智能对象行为定义(Gameplay Behavior Smart Object Behavior Definition) 。单击 游戏行为配置(Gameplay Behavior Config) 下拉框并选择 BP_SO_BehaviorConfig 。
-
保存并关闭蓝图。
阶段成果
在本节中,你创建了定义智能对象的每个插槽及其默认行为定义的智能对象定义数据资产。
4 - 创建一个智能对象
在本节中,你将创建一个智能对象,该对象可以被关卡中的艾真体找到和使用。
-
在 内容浏览器(Content Browser) 中,右键单击并从 创建基本资产(Create Basic Asset) 分段中选择 蓝图类(Blueprint Class) 。
-
在 选取父类(Pick Parent Class) 窗口中,单击 Actor 类按钮以创建资产。将新资产命名为 BP_SO_RunBT 。
-
在 内容浏览器(Content Browser) 中,双击 BP_SO_RunBT 将其打开。转到 组件(Components) 窗口,然后单击 + 添加(Add) 按钮。搜索并选择 智能对象(Smart Object) 。
-
选择 SmartObject 组件后,转到 细节(Details) 面板并向下滚动到 智能对象(Smart Object) 分段。单击 定义资产(Definition Asset) 下拉框并选择 SO_Definition_PlayMontage 。
-
编译并保存蓝图。
阶段成果
在本节中,你创建了一个智能对象并添加了定义其插槽默认行为的行为定义。
5 - 为AI艾真体创建行为树
在本节中,你将为AI艾真体创建必要的行为,以便在关卡中搜索和使用智能对象。你将使用一个简单的行为树和两个自定义行为树任务来完成这个任务。
创建行为树和黑板
-
在 内容浏览器(Content Browser) 中,右键单击并选择 AI > 黑板(Blackboard) 。将黑板命名为 BB_SO_Agent 。
-
双击 BB_SO_Agent 将其打开。单击 新关键帧(New Key) 下拉框并选择 智能对象声明句柄(SmartObject Claim Handle) 。将关键帧命名为 ClaimHandle 。保存并关闭黑板。
-
在 内容浏览器(Content Browser) 中,右键单击并选择 AI > 行为树(Behavior Tree) 。将行为树命名为 BT_SO_Agent 。
创建行为树任务
寻找智能对象
-
在 内容浏览器(Content Browser) 中,右键单击并从 创建基本资产(Create Basic Asset) 分段中选择 蓝图类(Blueprint Class) 。
-
在 所有类(All Classes) 分段,搜索并选择 BT任务蓝图基类(BT Task Blueprint Base) ,然后单击 选择(Select) 。将蓝图命名为 BTT_FindSmartObject 。
-
在 内容浏览器(Content Browser) 中,右键单击 BTT_FindSmartObject 并选择 复制(Duplicate) 。将新蓝图命名为 BTT_UseSmartObject 。
-
在 内容浏览器(Content Browser) 中,双击 BTT_FindSmartObject 将其打开。在 事件图表(Event Graph) 中右键单击,然后搜索并选择 Event Receive Execute AI 。
-
从 Event Receive Execute AI 节点的 所有者控制器(Owner Controller) 引脚拖动,然后搜索并选择 Get Blackboard 。
-
右键单击 Get Blackboard 节点的 返回值(Return Value) 引脚,然后选择 提升为变量(Promote to Variable) 。将变量命名为 Blackboard 。
-
将 Event Receive Execute AI 节点连接到 Set Blackboard 节点。
-
-
从 Event Receive Execute AI 节点的 控制Pawn(Controlled Pawn) 引脚拖动,然后搜索并选择 Get Actor Location 。
-
从 Get Actor Location 节点的 返回值(Return Value) 拖动,然后搜索并选择 Subtract 。
-
从 Get Actor Location 节点的 返回值(Return Value) 拖动,然后搜索并选择 Add 。
-
这两个节点的 X 、 Y 和 Z 值都设置为 2000 。这会在艾真体周围创建一个4000x4000单位或40x40米的搜索框。
-
-
在 事件图表(Event Graph) 中右键单击,然后搜索并选择 Make Box 。
-
将 Subtract 节点连接到 Make Box 节点的 最小(Min) 引脚。
-
将 Add 节点连接到 Make Box 节点的 最大(Max) 引脚。
-
-
在 事件图表(Event Graph) 中右键单击,然后搜索并选择 Get Smart Object Subsystem 。
-
从 Smart Object Subsystem 节点拖动,然后搜索并选择 Find Smart Objects 。
-
从 Find Smart Objects 节点的 请求(Request) 引脚拖动,并选择 Make SmartObjectRequest 。
-
-
将 Make Box 节点的 返回值(Return Value) 引脚连接到 Make SmartObjectRequest 节点的 查询盒体(Query Box) 引脚。
-
从 Make SmartObjectRequest 节点的 过滤器(Filter) 引脚拖动,并选择 Make SmartObjectRequestFilter 。
-
从 行为定义类(Behavior Definition Classes) 引脚拖出引线,并搜索然后选择 Make Array 。
-
点击 Make Array 节点的下拉菜单,然后选择 GameplayBehaviorSmartObjectBehaviorDefinition 。
-
将 Set Blackboard 节点连接到 Find Smart Objects 节点。
-
-
这是蓝图目前的样子。
-
右键单击 Find Smart Objects 节点的 输出结果(Out Results) 引脚,然后选择 提升为变量(Promote to Variable) 。将 Out Results 节点连接到 Blackboard 节点。
-
从 Out Results 节点的引脚拖动,然后搜索并选择 Is Valid Index 。
-
从 Is Valid Index 节点拖动,然后搜索并选择 Branch 。将 Out Results 节点连接到 Branch 节点。
-
-
从 Branch 节点的 False 引脚拖动,然后搜索并选择 Finish Execute 。如果附近没有符合搜索条件的智能对象, 输出结果(Out Results) 将无效。
-
在 事件图表(Event Graph) 中创建一个 Smart Object Subsystem 节点。从该节点拖动,然后搜索并选择 Claim 。
-
将 Branch 节点的 True 引脚连接到 Claim 节点。
-
将 输出结果(Out Results) 变量拖到 事件图表(Event Graph) 并选择 Get Out Results 。从该节点拖动,然后搜索并选择 Random Array Item 。
-
从 Random 节点拖动并将其连接到 Claim 节点的 请求结果(Request Results) 引脚。
-
-
右键单击 Claim 节点的 返回值(Return Value) 引脚,然后选择 提升为变量(Promote to Variable) 。将变量命名为 ClaimHandle 。
-
从 Claim Handle 节点引脚拖动,然后搜索并选择 Is Valid Smart Object Claim Handle 。
-
从 Is Valid Smart Object Claim Handle 节点的 返回值(Return Value) 拖动,然后搜索并选择 Branch 。
-
-
从 Branch 节点的 False 引脚拖动,然后搜索并选择 Finish Execute 。
-
将 Blackboard 变量拖到 事件图表(Event Graph) 并选择 Get Blackboard 。
-
从 Blackboard 节点拖动,然后搜索并选择 Set Value as SOClaim Handle 。
-
将 Branch 节点的 True 引脚连接到 Set Value as SOClaim Handle 节点。
-
右键单击 Set Value as SOClaim Handle 节点的 关键帧名称(Key Name) 引脚,然后选择 提升为变量(Promote to Variable) 。
-
选择 关键帧名称(Key Name) 变量后,转到 细节(Details) 面板并启用 实例可编辑(Instance Editable) 复选框。将 默认值(Default Value) 设置为 ClaimHandle 。
-
-
拖动 ClaimHandle 变量并将其连接到 Set Value as SOClaim Handle 节点的 值(Value) 引脚。
-
从 Set Value as SOClaim Handle 节点拖动,然后搜索并选择 Finish Execute 。启用节点上的 成功(Success) 复选框。
-
编译并保存蓝图。
使用智能对象
-
在 内容浏览器(Content Browser) 中,双击 BTT_UseSmartObject 将其打开。在 事件图表(Event Graph) 中右键单击并搜索,然后选择 Event Receive Execute AI 。
-
从 Event Receive Execute AI 节点的 所有者控制器(Owner Controller) 引脚拖动,然后搜索并选择 Get Blackboard 。
-
从 Get Blackboard 节点的 返回值(Return Value) 引脚拖动,然后搜索并选择 Get Value as SOClaim Handle 。
-
右键单击 Get Value as SOClaim Handle 节点的 关键帧名称(Key Name) 引脚,然后选择 提升为变量(Promote to Variable) 。
- 选择 关键帧名称(Key Name) 变量后,转到 细节(Details) 面板并启用 实例可编辑(Instance Editable) 复选框。将 默认值(Default Value) 设置为 ClaimHandle 。
-
从 Get Value as SOClaim Handle 节点的 返回值(Return Value) 引脚拖动,然后搜索并选择 Use Claimed Gameplay Behavior Smart Object 。
-
将 Get Value as SOClaim Handle 节点连接到 Use Claimed Smart Object 节点。
-
从 Event Receive Execute AI 节点的 所有者控制器(Owner Controller) 引脚拖动并连接到 Use Claimed Smart Object 节点的 控制器(Controller) 引脚。
-
-
从 Use Claimed Smart Object 节点的 On Finished 引脚拖动,然后搜索并选择 Finish Execute 。启用节点上的 成功(Success) 复选框。
-
编译并保存蓝图。
创建行为树
-
在 内容浏览器(Content Browser) 中,双击 BT_SO_Agent 将其打开。从 根(Root) 节点拖动并选择 Selector 。
-
从 Selector 节点拖动并选择 Sequence 。
-
从"Selector"节点拖动并选择 等待(Wait) 。如果初始搜索不成功,该节点将让艾真体等待5秒再搜索新智能对象。
-
确保 Sequence 节点位于 Wait 节点的左侧。这确保序列首先在行为树中执行。
-
-
从 Sequence 节点拖动并选择 BTT_FindSmartObjects 。
-
从 Sequence 节点拖动并选择 BTT_UseSmartObjects 。
-
从 Sequence 节点拖动并选择 Wait 。选择节点后,将 等待时间(Wait Time) 设置为 2.0 ,将 随机偏差(Random Deviation) 设置为 0.5 。该节点将让艾真体等待1.5至2.5秒,然后再搜索新的智能对象。
-
保存并关闭行为树。
阶段成果
在本节中,你创建了允许艾真体在关卡中查找和使用智能对象的行为树和行为树任务。
6 - 创建AI艾真体
在本节中,你将创建在关卡中搜索智能对象的AI艾真体。
-
在 内容浏览器(Content Browser) 中,双击 BP_ThirdPersonCharacter 蓝图将其打开。
-
选择 事件图表(Event Graph) 中的所有节点并将其删除。右键单击 事件图表(Event Graph) ,然后搜索并选择 Event Possessed 。
-
从 Event Possessed 节点的 新控制器(New Controller) 引脚拖动,然后搜索并选择 Cast to AI Controller 。将 Event Possessed 节点连接到 Cast to AI Controller 节点。
-
从 Cast to AI Controller 节点的 作为AI控制器(As AIController) 引脚拖动,然后搜索并选择 Run Behavior Tree 。单击 BTAsset 下拉框并选择 BT_SO_Agent 。
-
编译并保存蓝图。
阶段成果
在本节中,你创建了在关卡中搜索智能对象的AI艾真体蓝图。你还修改了动画蓝图以确保动画蒙太奇可以正确播放。
7 - 测试智能对象
现在,将测试艾真体以确保它可以查找和使用关卡中的智能对象。
-
在主工具栏中,单击 添加内容 ( + ) > 体积(Volumes) > NavMeshBoundsVolume ,将新的 寻路网格体(Navigation Mesh) Actor添加到关卡。将网格体缩放至可以覆盖关卡,以便艾真体可以寻路到其目的地。
-
将多个 BP_SO_RunBT 蓝图拖到关卡中。
-
将 ThirdPersonCharacter 蓝图拖到关卡中。
-
按 模拟(Simulate) 可以查看艾真体在关卡中查找和使用智能对象。

阶段成果
在本节中,你确认了艾真体可以在关卡中查找和使用智能对象。