目录

一、AI Move To

二、行为树

2.1 行为树简单使用

2.1.1 创建 AI Controller 并在 BP_AICharacterBase 中添加

2.1.2 创建行为树和黑板

2.1.3 在 AI Controller 中运行行为树

2.1.4 小总结

2.2 行为树常用节点

2.2.1 复合节点

2.2.2 任务节点

2.2.3 装饰器节点

2.3 综合小案例

2.3.1 案例一 —— AI 跟随

2.3.2 案例二 —— AI 攻击

2.3.3 案例三 —— AI 攻击升级版

2.3.4 案例四 —— 攻击 AI 扣血

2.3.5 案例五 —— AI 死亡溶解效果

2.3.6 案例六 —— 索敌

屏幕中心索敌

Tab 索敌

2.3.7 案例七 —— 角色自动回血

2.3.8 案例八 —— 下方技能栏

2.3.9 案例九 —— 技能冷却

2.3.10 案例十 —— 初始生成 AI / AI 刷新

2.3.11 案例十一 —— 技能指示器


一、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:布尔值,表示是否成功找到导航点。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐