UE5 基础应用 —— 09 - 行为树 简单使用
在 BP_AICharacterBase 中,【Pawn】-【AI Controller Class】- 添加我们创建的 BP_AIController。但 AI 一般是在场景里放置的 Character(或 Pawn),或者运行时用 SpawnActor 动态生成的。是蓝图里的移动节点,不在行为树内部。AI Move To:让 AI 移动到目标位置或目标 Actor。首先创建 BP_AICont
目录
2.1.1 创建 AI Controller 并在 BP_AICharacterBase 中添加
一、AI Move To
AI Move To:让 AI 移动到目标位置或目标 Actor。
它直接调用了导航系统(Nav Mesh)去寻路。是蓝图里的移动节点,不在行为树内部。
二、行为树
2.1 行为树简单使用
2.1.1 创建 AI Controller 并在 BP_AICharacterBase 中添加
首先创建 BP_AIController。
在 GameMode 中,主要配置的是 与玩家相关的类。但 AI 一般是在场景里放置的 Character(或 Pawn),或者运行时用 SpawnActor 动态生成的。那么我们应该如何配置呢?
在 BP_AICharacterBase 中,【Pawn】-【AI Controller Class】- 添加我们创建的 BP_AIController。
2.1.2 创建行为树和黑板
行为树 规范命名为 BT_;黑板 规范命名为 BB_。
注:一个黑板可以被多个行为树共用。
用行为树实现 AI Move To 逻辑,具体如下。
在黑板中创建 FinishLocation。
创建自定义任务节点。使用 Set Blackboard Value as xx 节点为 FinishLocation 赋值。
最后记得使用 Finish Execute 节点。
Move To 节点中黑板键 选择 FinishLocation。
2.1.3 在 AI Controller 中运行行为树
推荐使用第一种 Event On Possess + Run Behavior Tree。
2.1.4 小总结
- 不管是 BP_CharacterBase 还是 BP_AICharacterBase,通过 Get Owner 节点获取的都是其控制器。
- 使用 Get AIController 节点时注意前面不要忘记连上 Controllered Actor。
2.2 行为树常用节点
2.2.1 复合节点
Selector:运行其子节点直到其中一个成功。
Sequence:按顺序运行子节点,直到一个失败或全部成功。
Simple Parallel:同时运行多个子节点。
2.2.2 任务节点
执行实际的行为,如移动到一个地点、播放动画或者攻击玩家。下面介绍几种比较常见的任务节点:
Rotate to face BB entry:朝向
Move To:移动到目标位置
Wait:等待一段时间
Run Behavior:调用子行为树
除上述任务节点之外,自定义任务节点创建有如下两种方式。
2.2.3 装饰器节点
装饰器是行为树里的“条件控制器”,用来决定某个节点是否能运行。
Blackboard:检查黑板里的某个键是否满足条件,只有满足时,节点才会被执行。
2.3 综合小案例
2.3.1 案例一 —— AI 跟随
实现功能:当角色靠近 AI 时,AI 跟随角色。当角色远离 AI 时,AI 乱跑。
在行为树中创建逻辑。(建议按照如下设置,否则会有一些组件自带的 bug)
在黑板中创建键。IsSeeing 设置为 True。
在 BP_AIController 中控制装饰器节点的“开关”。
2.3.2 案例二 —— AI 攻击
行为树逻辑如下。
补充一下,Rotate to face BB entry 节点想要生效需要做出如下设置:
【角色移动(旋转设置)】- 勾选【Use Controller Desired Rotation】
【角色移动(旋转设置)】- 取消勾选【Orient Rotation to Movement】
自定义任务节点内部逻辑如下。
2.3.3 案例三 —— AI 攻击升级版
我们为 AI 技能创建多个子树。
通过 Run Behavior 调用子树。
技能 —— 天降盾牌。
经测试,下方逻辑在生成球体检测时,无法做到盾牌砸到人时才造成伤害。
技能 —— 空律大招
在 BP_AICharacterBase 中创建多个 Arrow(🗡所在位置)。
控制 🗡 飞向角色。
2.3.4 案例四 —— 攻击 AI 扣血
https://blog.csdn.net/CandyU2/article/details/151627345?spm=1001.2014.3001.5501
本案例为上述链接 1.7.4 外部通知 —— 角色造成伤害的补充版本。
创建 WBP_HealthBar,使用双层血条。
Progress Bar_Dyamic 位于底层。
ProgressBar 位于顶层。设置背景颜色为透明,保留前景颜色。并将其 Percent 创建绑定。
在 BP_AICharacterBase 中创建 3D UI。具体逻辑如下。(设置 Widget 的旋转时,原理是让 Widget 始终看向我们的摄像机,所以 Start 我们设置为 Widget 的位置。Target 我们设置为摄像机的位置)
Get Widget:获取 Widget Component 使用的控件
将 ProgressBar 中的 Percent 与 BP_AICharacterBase 中的 BPC_CharacterAttribution 组件的 Current Health 做绑定。
Progress Bar_Dyamic 中的 Percent 更新逻辑如下:
现在 AI 已经可以实现角色攻击扣血啦。
但现在 AI 死亡后依旧会跟随角色,所以我们在行为树中做一点小改动。
2.3.5 案例五 —— AI 死亡溶解效果
创建材质函数。
经过测试,Noise 节点参数如下设置比较合理。
在 AI 材质编辑器使用我们刚刚创建的材质函数。(案例中 AI 的 Mesh 虽然有多个材质实例,但都是基于一个材质创建的,所以相对简单)
如果有武器的话,也需要使用我们刚刚创建的材质函数。这里就不做演示啦。
在 AI 死亡时我们动态修改其参数,实现溶解效果。
这里我们使用了一个比较通用的逻辑。
2.3.6 案例六 —— 索敌
屏幕中心索敌
Tab 索敌
略。
2.3.7 案例七 —— 角色自动回血
创建角色血条和蓝条,并创建绑定。
回血回蓝效果实现。
2.3.8 案例八 —— 下方技能栏
重新回顾一下我们以前的知识,这里我使用循环的方式动态创建。
不过略有不同,之前我们采用结构体(为结构体赋值)的方式,如下所示:
现在我尝试使用数据表格的方式做一下,下面就要开始啦。
创建结构体。
创建技能图标。
这里我们使用了 Set Brush from Texture 节点。
创建 Excel 表格。
通过复制引用填入关键信息,并将表格另存为 CSV 格式。
在 UE5 中导入该表格。
UE5 会给我们创建一个数据表格。(当然你要是自己从零创建一个数据表格,然后一个个添加元素也是可以的)
在 MainWidget 中循环创建即可。
Get Data Table Row Names:获取数据表格所有行的名字,返回一个数组。
Get Data Table Row:根据行名,读取该行对应的数据。
2.3.9 案例九 —— 技能冷却
创建技能冷却材质。
CustomRotator:将 UV 坐标旋转 90°(0.25 * 360° = 90°)
Subtract(0.5):将 UV 的中心从(0,0)移动到(0.5,0.5)
VectorToRadialValue:将二维坐标转换成极坐标
这里老师做了一些改动(在外部使用 Create Dynamic Material Instance 的方法),为什么要这么做呢?
个人理解:这里实现的效果是相同的,唯一的区别是我们在外部创建了材质实例。好处是什么呢?因为我们需要用到 Set Timer by Function Name 节点,每隔 0.01 秒做一下变化。如果在函数内部创建材质实例,这样开销就太大了。
引入 Time 变量。
修改 To Text (Float) 参数,保留一位小数。
Format Text 用于拼接文本。
现在我们就可以通过按键实现技能冷却啦。
2.3.10 案例十 —— 初始生成 AI / AI 刷新
使用伪随机的方式,在世界场景中放置多个重生点。
初始生成 AI 逻辑如下:
AI 死亡刷新逻辑如下:
2.3.11 案例十一 —— 技能指示器
创建材质。
创建贴花 Actor。
生成贴花逻辑如下。
通过按键生成贴花,并通过射线追踪实时更改贴花位置。
松开按键时生成特效。
同时我们禁止角色接收贴花。
现在我们的技能指示器就写好啦。但现在我还有一个需求,我想让我的技能只能在地面上释放,不能在墙体等释放,怎么办呢?
ProjectPointToNavigation:将一个任意世界坐标点投影到导航网格(NavMesh)上,返回一个有效的可导航位置。
- Query Extent:它定义了一个三维搜索范围(盒子),用于在该区域内查找离输入点最近的导航网格(NavMesh)表面。
- Return Value:布尔值,表示是否成功找到导航点。
更多推荐
所有评论(0)