流程控制
基本操作
延迟节点:sleep
分支节点:if else
序列节点:按顺序执行后续节点(但是并发)
执行n次节点:,reset重置,counter执行次数计数器
多重执行一次节点:,对于不同输入都有输出选择,并且共享一次机会
循环节点:,completed循环结束时执行
反向循环,数组循环同理
翻转/交替节点:,轮流执行A和B
门节点:open执行后可以使用,close执行后不允许使用,toggle改变门状
态,Start Closed初始化
多重门节点:每次按顺序把输出执行,共一轮.reset重置一轮,loop循环执行不会阻断,isRandom随机执行,StartIndex初始输出
switch
整数型:,通过selection的值选择执行某个分支
切换节点:A,B交替触发
不同的型决定了选择和执行的变量的数据类型
数据类型
数组
设置数组元素,item为index[i]赋值,Size to fit可与二者配合扩展数组大小
STL:
对应vector,set,map
枚举:一种数据类型,定义了一组具有描述性的常量,这些常量通常代表特定的选项、状态或类别。可看作有限的、无状态的数据集合.总之,枚举类中只存一些不可修改的名称同时用其中一个来表示变量当前的状态
于枚举器中添加命名 编译后在细节处可选择添加命名于变量中
常于switch共同使用
结构:
常通过break获取元素的值
数据表格:只能读不能写,常通过如下方法获取表信息
Isvalid:校验某资产蓝图是否存在
函数与宏:在库中创建的函数/宏为全局函数/宏
宏可以在设置时在输入输出添加不同的执行来实现不同的结果
在不同的蓝图类中可以调用不同的引擎预制蓝图
● 函数允许有一个执行引脚和一个输出引脚,事件只允许有一个执行引脚,宏允许有多个执行引脚和多个输出引脚。
● 函数和宏允许有返回值,而事件不允许有返回值。 ● 事件和宏中可以使用UE提供的延迟节点(如:TimeLine),函数不可以。
● 函数和事件可以跨蓝图类访问,而宏只能在定义的蓝图类中调用。
● 函数可以被继承,而宏不可以被继承,子类无法使用父类中定义的宏。
● 宏库可以跨蓝图类访问
● 函数和宏的调用是同步执行,需要等待函数或宏内部逻辑执行完毕才进行接下来的逻辑,事件是异步执行,触发事件的地方无需关心事件内部的逻辑,只需要触发事件即可执行接下来的逻辑。
自定义事件:可被函数/蓝图其他节点调用,可更改事件于服务器/客户端运行以区分服务器和客户端
蓝图通信
cast to
类型强制转换,内存开销大,少用
直接通信
直接获得引用示例
碰撞通信:在self前后的位置设立一个球形追踪获取接收到的pawn类型后调用获取到的引用
get:通过get函数获取玩家应用/ / /并添加强转来获取并操作
getall:通过getall函数获取所有带有某特征的actor并循环强转调用
蓝图接口:通过创建有相同输入输出的接口并在不同的类中实现接口以做到通信后不同的类不同的反应
蓝图接口的优势在于提升了代码的灵活性、可扩展性、可维护性和模块化程度,使得不同模块和类之间可以通过标准化的接口进行通信,而不需要直接依赖对方的具体实现。相比之下,直接通信会增加类之间的耦合度,降低系统的可扩展性和灵活性。
一方激活接口,一方实现接口
如接口中的函数没有返回值则可做为事件实现(相同方法的不同实现)
事件分发器:
发送者执行分发事件后,其余蓝图根据条件判定是否保定事件到该分发器,若绑定了变收到事件后执行某函数
事件
动画animation
需要:meshes网络(骨骼体)-蒙皮 骨骼 动画资产() 随后导入动画(可于ue中切分)
动画编辑器
1. 骨架(Skeleton)
- 定义:由骨骼(Bone)组成的树状层级结构,定义了角色的关节(Joint)和运动约束关系。例如,人体骨架包含根骨骼(Hips)、脊柱(Spine)、四肢(Arm/Leg)等层级。
- 作用:
- 运动控制:通过关键帧数据驱动骨骼的旋转、位移和缩放,形成动画基础。
- 层级绑定:父骨骼影响子骨骼的运动(如手臂摆动时肩部带动肘部)。
2. 骨架网格体(Skeletal Mesh)
- 定义:绑定到骨架的3D模型,由顶点(Vertex)和骨骼权重(Bone Weight)组成。每个顶点受一个或多个骨骼影响,权重决定变形程度。
- 作用:
- 外观呈现:定义角色的几何形状(如人体肌肉、服装细节)。
- 蒙皮(Skinning):根据骨骼变换动态调整顶点位置,实现模型形变(如弯曲手臂时皮肤拉伸)。
3. 动画序列(Animation Sequence)
- 定义:记录骨骼在时间轴上的变换数据(关键帧),如行走时骨骼的周期性运动。
- 作用:
- 动作存储:保存独立动画片段(如站立、奔跑、攻击)。
- 关键帧驱动:通过插值计算生成平滑动画(如从站立到奔跑的过渡)。
- 混合基础:为动画蓝图提供输入源,支持混合、叠加等操作
瞄准偏移:
用以实现瞄准相关动画
动画重定向:
为新模型搭配旧模型的动画
创建IK绑定,选择新模型的骨骼网格体
在新模型确定重定向根后根据旧模型的链条新增重定向链(链必须是单向唯一)
新建IK重定向器[IK(反向动力学)]选择新旧模型,点击下方动画看两个模型同样动画演示效果
调试后可到处新模型动画
重定向后动画不匹配可能原因---动画序列中IK-骨骼 与 骨骼 位置不对
可在绑定控制节点中改变骨骼位置以矫正
绑定控制节点是动画蓝图的一种工具,用来控制角色或物体的骨骼动画。简单来说,它让你能够把角色的动画(比如走路、跑步、跳跃等)和角色的身体部位(比如手、脚、头)或者外部因素(比如玩家的输入、物理效果等)连接起来,并对它们进行控制。
更改前后
状态机
定义角色的状态
动画蓝图-locomotion
将状态机缓存为一个状态可方便别的状态集内调用
箭头表示状态切换
状态内,拖入动画序列再连接到输出节点可简单完成一个状态
状态别名
状态别名(State Alias)的核心作用类似于将具有相同逻辑特征或关联性的多个状态“封装”为一个逻辑单元,通过别名节点统一管理它们的输入输出关系,从而避免冗余连线并提升可维护性
混合空间:
供动画蓝图调用,用以衔接不同状态的动画切换
制作混合空间
选择骨骼后新建混合空间
将资产浏览器中动画去序列拖入下方变为一个点,单击点可于上方设置点的具体位置
按住Ctrl控制线上绿色×预览动画变化
左侧边栏可更改线上坐标值名称,长度(轴值)等数值
保存后在状态节点内拖入混合空间即生成节点
根据混合空间中各个动画序列的触发参数值可控制角色不同状态下的运动动画
如长按shift奔跑(此处两个最大行走速度数值分别为跑步和走路动画序列在混合空间中的触发值)
产生滑步等不协调解决方案之一:
于左侧分析器选择该状态所属状态机,并选择所需要关键骨骼,单机刷新便自动更改轴值与点(动画序列)的位置
拆分动画序列
如此操作后
绑定后于动画序列所在文件夹生成一个文件夹,文件夹中存放一个Sequence文件(关卡序列)
打开Sequence后角色出现在世界原点位置,为方便新建关卡-选择新地图操作
将动画开始的绿条与终止的右侧红条拖到需要截取的帧位置
右键骨骼-选择烘培动画序列-选择文件夹-保持默认导出
即刻获得截取的动画序列
设置蹲伏
进入角色蓝图-选择角色移动组件--细节-移动能力-开启可蹲伏
角色蓝图-self-蹲伏-提升为变量------>即可利用角色自带的可蹲伏变量掌控角色蹲伏状态
于世界蓝图更新动画中添加获取角色是否蹲伏的变量
进入动画蓝图-主状态机-添加蹲伏状态以及状态别名ToCrouching-勾选locomotion与idle表示可以从悠闲和移动状态变为蹲伏状态,并设置状态转换条件(直接根据变量是否蹲伏是否)
进入Crouching状态节点-添加状态机-将状态计输出连接到输出动画姿势节点
进入状态机
添加状态与转换-进入状态选择动画序列输出
根据是否蹲伏与速度大小设置转换函数
完成.
混合姿势
该节点通过布尔值切换动画,便于根据场景与主动输入切换动画
实现拿起/背上武器的不同移动动画
于动画蓝图-事件图表初始化时,从角色处获取设置的相同意义的变量值
通过"按布尔混合姿势"节点将不同的动画播放器连接,根据变量"is Weapon in Hand"决定输出的是拿起武器时的走路/待机动画还是未拿起武器时的走路/待机动画
蒙太奇动画:
动画蒙太奇在动画蓝图中以插槽输出姿势
蒙太奇动画支持在动画的特定时刻触发事件,例如角色进行攻击时可以触发音效、粒子效果或其他游戏逻辑。它还支持基于动画的条件控制,例如当某个条件满足时自动播放某个动画。
虚幻引擎中的动画蒙太奇编辑器 | 虚幻引擎 5.5 文档 | Epic Developer Community
蒙太奇编辑
创建蒙太奇动画后
下方添加插槽可插入动画序列,不同名称的插槽可影响角色的不同骨骼(全身/上半身..)
右下侧可更改蒙太奇的顺序等片段(?
播放蒙太奇节点
输入端一定要有对象引用并选择蒙太奇资产
节点执行后会将插槽轨道的动画序列传递至动画蓝图对应名称的插槽中
动画蓝图通过Slot Node
将插槽中的动画与基础姿势(如移动动画)自动混合。
每个骨骼的分层混合节点
-
局部骨骼动画覆盖
允许对特定骨骼(如脊椎、手臂)的动画进行分层混合,而其他骨骼保持原有姿势。 -
动态混合权重控制
通过权重参数(如Blend Weights 0
)动态调整不同骨骼动画的混合强度,实现平滑过渡或剧烈切换。0--1
[输入姿势]
│
├─ Base Pose(基础姿势,如状态机动画)
├─ Blend Poses 0(待混合的姿势,如蒙太奇动画)
└─ 添加引脚(可扩展更多混合姿势)
│
[层设置]
│
├─ 骨骼名称(指定目标骨骼,如spine_01)
├─ 混合深度(控制混合影响的骨骼层级)
└─ 输出混合后的姿势 → 驱动骨骼网格体
以上共同完成了触发动画蒙太奇节点后在不同状态下都能执行换武器的动画
动画通知
创建动画通知无法在动画蓝图中找到事件?
看一下是不是没在事件图表编辑.
动画蒙太奇中右键通知轨道可以添加动画通知(在某一帧)和动画通知状态(一段事件)
创建动画通知后即可与关联的动画蓝图中创建通知事件,当动画蒙太奇执行到通知所在帧时执行
编辑动画
实例:解决动画移动位置与组件设置位置的偏差
选择需要编辑的动画-烘焙到sequence-将武器蓝图拖入sequence-并右键附加到当前当前动画骨骼网格体骨骼的插槽/骨骼
显示处可关闭组件上的圆
将武器事件轨道白条拉满(否则动画播放到没有白条的帧武器会在角色脚下显示(原点?))
控制器不出现怎么办?
选中
不然就把文件删了重来
在视图中通过控制器调整最关键的帧角色动作的位置(如手臂/武器移动的终点)
点击"在曲线编辑器中显示动画关键帧"进入sequence曲线
选中在此帧中主要移动的骨骼,将当前帧两侧相邻的部分帧删去以免跳帧情况
再通过插值,选中区域后来补全删去部分的动画
控制器
玩家控制器于此处激活 or 世界场景设置确定后确定默认pawn类+玩家出生点
获取控制器基本流程(蓝图中):
将玩家输入(如按键、鼠标、手柄)通过增强输入子系统映射到控制器动作(如移动、跳跃),并确保输入与游戏逻辑的关联。 在映射上下文节点需要添加输入映射情景
输入映射情景:
创建输入后将其添加到情境中
对于值类型为axis2D的输入类型,其输入默认方向为x正方向,拌合输入轴值可切换方向为y,否定可当前默认方向取反
触发器选项决定了输入事件的触发条件和方式,具体功能如下:
触发器选项 | 作用 | 对应增强输入输出示例 |
---|---|---|
None | 不绑定任何触发条件,仅记录按键状态 | 需手动在蓝图中检测按键状态 |
下移 | 检测按键被按下后的持续位移(如摇杆下移) | 通常绑定Ongoing 输出,用于持续输入逻辑 |
已按下 | 检测按键被按下瞬间的单次触发 | 对应Triggered 或Started |
已松开 | 检测按键释放瞬间的单次触发 | 对应Completed 或Canceled |
弦操作 | 检测组合按键(如Ctrl+C) | 需配合Modifier 实现复杂输入条件 |
点按 | 检测短按一次(按下并快速释放) | 对应Triggered 或Completed |
组合(测试版) | 实验性功能,支持多键组合输入(如Shift+A) | 需自定义逻辑处理组合键 |
脉冲 | 按固定时间间隔重复触发(如每0.5秒一次) | 对应Ongoing ,用于周期性逻辑(如自动射击) |
长按 | 检测持续按压超过设定时间阈值 | 绑定Started (开始长按)和Ongoing (持续) |
长按和松开 | 同时检测长按触发和松开触发(需两个独立映射) | 绑定Started (长按)和Completed (松开) |
创建输入操作后可调用新的事件节点以对按键不同状态控制
- Triggered:用于持续响应输入条件(如移动、攻击),触发次数由触发器类型决定。
- Started:用于初始响应输入动作(如跳跃、换弹),仅触发一次。
- | Ongoing | 输入持续生效期间每帧触发(例如按住蹲键不放时) | 对应
UEnhancedInputAction
的OnOngoing
支持每帧更新逻辑。 |
Canceled | 输入被提前中断时触发(例如蹲键被中途松开或被其他操作打断) | 需在输入配置中设置Cancel Condition
(如按下跳跃键取消蹲下)。 |
| Completed | 输入自然结束时触发**(例如完整执行完蹲下动作后松开按键) | 需配合InputAction
的Completed
事件,表示输入周期完整结束。 |
维度 | 输入映射触发器选项 | Enhanced Input输出事件 | 关系 |
---|---|---|---|
定位 | 定义输入的触发条件(如何被激活) | 定义输入的响应阶段(激活后做什么) | 触发器是条件,输出是结果 |
冲突根源 | 条件重叠或互斥 | 输出逻辑不兼容 | 条件错误导致输出错乱 |
合理组合 | 单一触发器绑定明确的输出(如“点按”→Triggered) | 复杂逻辑需多阶段输出(如“长按”→Started+Ongoing) | 协同实现精准控制 |
简单的移动模板
1. 获取控制旋转(Get Control Rotation)
功能:
相当于读取驾驶员的"身体动作"(点头、转头、翻滚)。
- 输入:你的手柄/键盘操作(比如转动鼠标、按住W键)。
- 输出:一个包含三个方向的"动作指令"(俯仰Pitch、偏航Yaw、翻滚Roll)。
- Pitch:点头(向前倾)或仰头(向后仰)。
- Yaw:左右转头(像看左右两边)。
- Roll:身体侧翻(比如赛车漂移)。
在移动中的作用:
比如你按W键向前走时,Yaw决定了你面朝哪个方向走(比如面朝Y轴则往Y轴走,面朝Z轴则往Z轴走)。
获取向前向量(Get Forward Vector)
功能:
把你的"转头动作"(Yaw)转化为"前进方向"。
- 输入:
控制旋转
(比如Yaw=90°表示你向右转头)。 - 输出:一个三维向量(X,Y,Z),代表你面朝的方向
添加移动输入(Add Movement Input)
功能:
把你的"按键力度"(如按W键的深浅)和"方向"结合起来,驱动角色移动。
- 输入:
World Direction
:刚才算出的"前进方向"向量。Axis Value
:你按W/S键的力度(-1~1,比如按到底是+1)。
- 输出:
对角色物理组件(如腿脚)发指令:"用这个方向和力度往前跑!"
简单鼠标视角控制模板
使用此两项可以做到静止可自由观察,移动自动朝向正面
装备武器等组件
为其创建蓝图并添加骨骼网格体
为角色添加childActor组件并将蓝图导入
调整组件位置
进入角色蓝图,于角色骨骼要添加的骨骼位置处 添加插槽-添加预览资产-利用预览场景设置中的预览动画调整位置
如此可以调整将网格体绑定到骨骼/插槽后的形态,但不是真骨骼
将子类组件细节-插槽处选择创建并调整好的插槽,武器会自动移动到调整过的位置
武器可视性设计逻辑:先设置组件可视,再将具体子组件引用附加到网格体的对应骨骼插槽
获取childActor下添加的蓝图引用
射线追踪
按通道经行(多)线条追踪
核心逻辑
- 依赖碰撞通道:通过预定义的碰撞通道(如
Visibility
、Blocker
)过滤物体。 - 物理引擎内置:直接利用UE5物理系统的碰撞预设(Collision Preset)配置。
受检测物体需要如此设置以被检测
输入参数关键点
参数 | 说明 |
---|---|
Trace Channel | 选择碰撞通道(如Visibility 检测可见物体,Blocker 检测阻挡物)。 |
Trace Complex | 是否检测物体的所有碰撞体(复杂碰撞,适用于薄物体穿透)。 |
Actors to Ignore | 忽略指定Actor(如自身角色)。 |
mutil探测多个物体需要循环输出结果
获取网格体/(第一人称)
在指定长度内经行射线追踪,将追踪到的对象打印
按对象进行(多)线条追踪
核心逻辑
- 依赖对象属性:通过对象的类(如
Pawn
、StaticMeshActor
)或自定义标签(如Enemy
、Collectible
)过滤结果。 - 灵活但性能稍高:需手动配置检测条件,但能绕过碰撞通道的限制。
探测对象需设置
输入参数关键点
参数 | 说明 |
---|---|
Object Classes | 需要检测的Actor类数组(如Pawn 类表示所有角色)。 |
Tags | 需要匹配的标签(如Enemy 标签表示所有带此标签的物体)。 |
Trace Distance | 射线最大长度(类似Line Trace By Channel 的End 参数)。 |
物体对象类型设置需与探测数组一致
在指定长度内经行射线追踪,将路径上追踪到的所有物理形体类打印
实现摄像头目标锁定
设置锁定对象与是否锁定两个变量记录状态
代码逻辑:如果以锁定就取消锁定,将锁定对象变量设置为空
否则进行射线追踪,追踪到指定类型actor(Pawn)则给两个变量赋值
执行锁定:
如果锁定对象节点有效则通过"寻找查看旋转"节点获取self与锁定对象的旋转体,再通过"设置控制旋转"传入控制器和旋转体控制
鼠标点击
实现显示鼠标并用右键获取到点击的物体
bShowMouseCursor设置鼠标广播显示
有了预定义的碰撞描述文件,并希望简化管理和设置,可以选择 Trace by Profile(按照描述文件进行线条追踪)
代码逻辑:按右键显示鼠标光标,并通过鼠标位置发射射线并打印追踪到的物体
创建发射物
阻挡,重叠和忽略
阻挡
双方都挡才能挡
重叠
生成重叠是前提
一方重叠就可以
忽略
一方忽略都忽略
碰撞逻辑:
添加碰撞体积和网格体后
发射逻辑:
//播放蒙太奇动画节点中将网格体与蒙太奇动画正确输入
function投射物
获取骨骼变换需在网格体骨骼中找到正确的骨骼件
生成函数需要选择要生成的蓝图类
设置伤害
施加伤害方运用"应用伤害","点状伤害节点","放射状伤害节点"
维度 | 应用伤害节点 | 点状伤害节点 | 放射状伤害节点 |
---|---|---|---|
作用范围 | 单一目标 | 点/小范围(半径可设) | 圆形区域 |
参数复杂度 | 基础参数(伤害量、类型) | 需指定作用位置和半径 | 需定义中心点、半径及衰减方式 |
适用逻辑 | 单体伤害逻辑 | 精确点伤害或小范围伤害 | 复杂范围伤害(如多段伤害) |
性能消耗 | 低(仅计算一次) | 中(需检测点周围碰撞体) | 高(需遍历圆形区域内的所有物体) |
被命中物体可设置血量等变量后调用任意伤害事件或其他伤害的对应事件来执行其他操作(如掉血)
回血可用事件分发器实现
设置掉落伤害与重生
掉落伤害
受伤逻辑同上
根据掉落时间计算掉落伤害
使用着陆事件应用伤害
重生
玩家销毁后转换调用控制蓝图,于控制蓝图中设置事件获取玩家引用,并于指定位置加载并控制.
可用同样方法设置重生点
时间
时间膨胀/加速减速
设置世界时间膨胀:将游戏的运行速度*系数
局部时间膨胀set custom time dilation:将actor的运行速度设置为世界运行速度*系数
时间轴
可以让你在蓝图中控制动画、平滑过渡、以及时间相关的事件
它通常用于控制物体的动画或状态变化,基于时间驱动各种变化
轨道
进入时间轴节点添加不同轨道可为节点添加不同输出
轨道有四种
浮点型/向量型:横轴时间纵轴值
颜色型:横轴时间+颜色
通过添加关键帧(点)设置值随时间的变化
长度到tick组之间5个选项
1开启后运行到最后一个关键帧停止
2自动播放
3循环播放
4已复制?
5忽视时间膨胀
节点输入值
play:开始/继续播放
play from start:从头开始播放
stop:停止播放(播放结束/停止会使点到已经移动到的位置)
reverse:反向播放
Set New Time:输出new time时刻的值
节点输出值:
Update:运行时执行
Finished:结束执行
Direction:
可以用来获取时间轴的播放方向(正向/反向)
轨道:获取当前时间轨道的值
案例
通过与插值函数结合控制门的旋转
插值函数:Result = A + Alpha * (B - A)
物理引擎
chaos破坏
①于破裂模式处选择要添加的物体后,选择文件夹创建GC_几何体集
②根据续修选择Fracture破裂类型并调解参数后单击破裂,生成破裂网格体,碎片可二次破裂
③创建蓝图类,添加几何体集组件,再将创建好的GC文件导入
该蓝图可通过任意伤害任意伤害事件添加"设置碰撞已启用""销毁actor"等节点实现其他功能
实现打击后破裂效果
为子弹类添加力
第一种:子弹类-应用物理-添加质量(效果差)
第二种:
于项目自带文件夹处有如此力场类
从左到右分别为[无效力场],[方向力场],[爆炸力场]....
②根据其创建子类
可于此处调节施放时间来控制力的大小
③子弹类命中逻辑中
设置生成此类的逻辑释放力造成破坏
第三种
将爆照破裂逻辑写入被打击的物体,子弹类仅保留命中和伤害逻辑
添加物理缓存
通过预制破坏并添加至物理缓存可方便制作过场动画的破坏效果
使用UE Chaos破坏系统缓存机制制作可同步的破坏效果 - 知乎
物理
缆索
始端设置方式:将缆索添加到其他actor下
末端设置方式:
蓝图节点设置始末端
物理柄组件
抓取节点
输入被抓取component的引用/骨骼/旋转/位置
用于实现基于物体的物理组件(如网格、碰撞体等)来抓取和拖拽物体的功能
抓取物体蓝图逻辑
抓到了就通过"释放组件"节点释放,并设置未抓取
否则就射线追踪,通过"在位置抓取带旋转的组件"实现抓取,并利用时间轴缓慢移动到所设置的组件位置,并标记已抓取
约束
细节-约束处可绑定其他组件
通过线性约束和角度约束/禁用碰撞等可以调整约束物体的活动范围
马达处可设置物体受力位置偏移后想回到设置目标xyz的力(强度)
以及减缓某个方向速度的力
驱动模式
位置相关驱动
切换位置目标
实现物体一个方向来回运动
"以事件设置定时器"+loop--每隔time段时间执行一次事件
事件:每次前/后移动100并唤醒
定时器如此清除
对物体运动的方向和阻尼进行设置
切换速度目标
关闭位置目标
将设置线性位置换为设置线性速度即可
角度相关驱动
切换角度目标
时钟指针顺时针运动
切换角速度目标
通过切换球面插值和 扭曲和摇摆来控制指针自由摆动与按指定速度摆动
重要节点
使用UE Chaos破坏系统缓存机制制作可同步的破坏效果 - 知乎设置物体的碰撞属性,目标对channel的new respond
使得一个已经应用约束的物体恢复到自由状态,或停止与其他物体的物理约束互动
通过物理约束组件将不同的component捆绑
持续力
斥力
实现初始化点产生任意个方块在圆的范围内
构造函数中循环五十次产生新的网格体与约束组件,并约束
控制"添加.."函数所填加的细节于右侧选择,与一般..细节面板一致
"添加物理约束组件"节点所设置的约束位置并不是直接由“目标”输入的位置决定的
注意要将新产生的网格体组件添加进网格体组件数组方便控制
实现产生一个径向力
随机在产生的网格体组件中添加一个径向力
"添加径向力组件"于产生
"目标"输入为力所作用的物体
实现点击后消除径向力再添加
引力
仅需将斥力的强度取反并把组件位置设置为根节点位置即可
持续力
实现物体持续超箭头方向前进
添加作用力节点输入参数accel change开启后添加的力改为加速度,即无视质量
设置物体位置
Move: 移动组件
Stop: 停止组件移动
Return: 返回组件
Component: 选择组件
Target Relative Location: 设置组件相对于目标的位置(X/Y/Z轴坐标)
Target Relative Rotation: 设置组件相对于目标的旋转(X/Y/Z轴角度)
Ease Out: 缓出效果
Ease In: 缓入效果
Over Time: 设置动画持续时间(值=0.2秒)
Force Shortest Rotation Path: 强制最短旋转路径
冲力
唤醒机制与敏感度调节
唤醒机制:UE5引擎为节省资源将静态网格体在一般情况或完成一些功能后进入休眠状态
开始唤醒:使物体一开始便处于唤醒状态
休眠族系:有"正常""敏感""自定义",由唤醒到休眠的时间"敏感">"正常"
自定义休眠阈值乘数:当休眠族系选择自定义时,乘数越大进入休眠越快
休眠事件
开启"生成唤醒事件"后可使用如下组件
物理材质中的休眠参数
"休眠线性速度阈值":当速度低于_休眠
"休眠线性角速度阈值":当角速度低于_休眠
"休眠计数器阈值":当以上都满足后_tick后休眠
另外,由于激活物体解除未激活物体会导致物体无法休眠,所以应用该组件将物体模拟物理取消从而实现休眠.
物理材质-碰撞(摩擦/弹力)
开启重载摩擦力合并模式后,根据摩擦力合并模式接触无物体双方的摩擦系数计算总系数求摩擦
恢复力决定碰撞损耗,
值越小损耗越大
密度:导入网格体后计算质量
将质量升入幂:根据幂值来调整物体放大后质量的的变化
类型转换:
存档
新建存档类
变量中添加需要保存的变量
角色蓝图中操作
该节点创建一个存档类实例并返回
该节点在默认保存位置保存输入的存档类并命名为输入字符串,返回是否成功创建文件的布尔
常通过存档名+编号模式设置Slot Name
加载存档节点
基本逻辑
存档:创建存档对象-获取存档对象并把当前的各个变量赋值给存档对象-保存存档到插槽并命名
加载:根据存档名获取插槽中的存档对象-将存档类中的各个值赋给角色/场景
获取变量可能用到cast类型转换
AI
初识ai
设置ai小人在世界中 导航网格体边界体积中随机移动
新建ai控制器类
新建角色蓝图-导入网格体与动画类等基础人物设置,开启旋转朝向运动
添加ai控制器类
AI MoveTo节点:让拥有ai控制器的pawn简单移动到指定位置(ai不掉落不跳跃)
蓝图逻辑:通过ai自身位置随机获取其周围半径内一个点,并让其到达那个点.延迟2s后递归
解决ai移动不播放跑步动画
进入动画蓝图如此设置,蓝色为移动组件
ai行为树与黑板
- AI 控制器 是 AI 的“大脑”,负责管理 AI 的逻辑和行为。
- 行为树 是用来定义和执行 AI 行为的工具,通过一系列的条件判断和动作节点来控制 AI 的行为流程。
- 黑板 是用于存储和共享信息的数据结构,使得行为树能够根据实时数据做出决策。
- AI 控制器可以管理多个行为树,根据不同的情况选择合适的行为树来执行。
- 行为树通常与一个黑板配合工作,来管理该行为树所需的所有数据。
行为树界面:
简单行为树样例(从上到下,从左到右执行,循环不断,每个节点都会为其父节点返回执行成功/失败)
selector执行sequence,执行失败则执行simple parallel
sequence:从左到右执行多个节点
simple parallel:执行左边的同时 并行执行右边
创建任务
行为树顶部点击新建任务后选择文件夹命名创建
任务节点仅自带一个事件图标,同时有六个可重载函数
函数名称 | 功能 | 输入参数 | 返回值 | 使用方法 | 应用场景 |
---|---|---|---|---|---|
Receive Execute | 任务节点被首次激活时触发,用于初始化逻辑(如启动行为、设置初始状态) | 无直接参数 | 无显式返回值,通过执行引脚控制流程(继续或停止) | 在蓝图中覆盖此事件,连接初始化逻辑(如播放动画、启动计时器) | 初始化非AI专用任务(如播放攻击动画、初始化目标位置) |
Receive Execute AI | AI任务节点初始化入口,传递AI控制器和Pawn引用 | AIController (AI控制器对象), ControlledPawn (被控制的Pawn) | 无显式返回值,通过执行引脚控制流程 | 覆盖此事件,直接操作AI相关对象(如获取导航组件、设置巡逻目标) | AI专用初始化(如设置巡逻路径、调用AI行为模块) |
Receive Tick | 每帧调用,用于持续更新任务状态(如移动控制、动态检测) | DeltaSeconds (帧时间增量,单位:秒) | 无显式返回值,需手动返回Continue 或Stop | 覆盖此事件,连接每帧逻辑(如追踪目标、避障) | 实时更新任务(如移动导航、动态调整行为) |
Receive Tick AI | AI任务的每帧更新入口,传递AI上下文 | DeltaSeconds , AIController , ControlledPawn | 无显式返回值,需手动返回Continue 或Stop | 覆盖此事件,操作AI组件(如更新感知系统、调整移动速度) | AI实时逻辑(如动态感知刷新、速度调整) |
Receive Abort | 任务被外部中断时触发(如行为树切换、优先级抢占),用于清理资源 | AbortReason (枚举值,如AbortedByParent ) | 无显式返回值,需手动调用Finish Abort 结束任务 | 覆盖此事件,处理中断逻辑(如停止动画、释放资源) | 中止非AI任务(如取消移动请求、停止声音播放) |
Receive Abort AI | AI任务被中断时的清理逻辑,传递中断原因和AI上下文 | AbortReason , AIController | 无显式返回值,需手动调用Finish Abort | 覆盖此事件,重置AI状态(如清除黑板键值、切换行为状态) | AI中断处理(如威胁检测中断时切换警戒状态) |
重设移动到随机位置
于新建任务中设置任务执行逻辑(到达可到达范围内一个随机点,并返回执行结果)
任务必须要返回成功或失败
将该任务连接到行为树
于ai控制器中执行该行为树
视觉感知
组件 事件与代码
ai角色蓝图-组件-添加ai感知组件(只感知角色,感知其他蓝图可添加刺激源组件)
ai感知组件细节处可选择不同的感官配置
感官类型 | 功能 | 核心参数 | 使用方法 | 典型场景 |
---|---|---|---|---|
AI视觉感知 | 检测可见范围内的目标(如玩家、敌人) | - 视线半径:最大检测距离(默认3000单位) - 视野角度:水平视野范围(默认90°) - 检测间隔:检测频率(如0.2秒) - 归属检测:区分敌/友/中立 | 1. 添加AIPerceptionSense_Vision 配置2. 绑定 OnPerceptionUpdated 事件监听目标3. 设置黑板键存储目标信息 | - 敌人巡逻时发现玩家后触发追逐行为 - 动态调整NPC的视线方向 |
AI听觉感知 | 检测环境中的声音来源(如枪声、脚步声) | - 听觉半径:声音传播距离(默认3000单位) - 声音类型过滤:如"Gunshot" - 衰减曲线:声音强度随距离变化 | 1. 添加AIPerceptionSense_Hearing 配置2. 在 OnHearingEvent 中响应声音事件3. 设置声音衰减参数 | - 守卫听到玻璃破碎声后转向声源 - 潜行模式下仅响应高频脚步声 |
AI团队感知 | 识别队友或敌人团队,实现协作或对抗逻辑 | - 团队标识:通过数据资产定义团队ID - 感知模式: Friendly (友军)或Hostile (敌军) | 1. 创建AIPerceptionTeam 数据资产2. 在感知组件中绑定团队数据 3. 通过 Get Team Perception 获取团队信息 | - 敌对AI自动攻击其他团队成员 - 队友共享玩家位置信息 |
AI触摸感知 | 检测物理接触(如碰撞、近战攻击) | - 触发距离:接触生效范围(默认50单位) - 响应类型: Collision 或Attack | 1. 添加AIPerceptionSense_Touch 配置2. 在 OnTouchStarted 事件中处理接触逻辑3. 绑定碰撞事件 | - 玩家近战攻击命中时触发受击动画 - 车辆碰撞检测防止AI被击飞 |
AI预感感知 | 预测动态目标的移动轨迹(如逃跑的玩家) | - 预测时间:推测目标未来位置的时间(默认1.5秒) - 速度权重:根据目标速度调整预测精度 | 1. 添加AIPerceptionSense_Prey 配置2. 在行为树中使用预测位置作为导航目标 3. 结合EQS优化路径 | - 猎人AI预判玩家逃跑路线并包抄 - 动态调整追击路线避免目标闪避 |
AI伤害感知 | 检测受到的伤害来源,触发报复或状态变化 | - 伤害类型过滤:如火焰/物理伤害 - 伤害来源标签:通过Actor标签筛选攻击者 - 持续时间:伤害生效窗口 | 1. 添加AIPerceptionSense_Damage 配置2. 在 OnDamageEvent 中响应伤害事件3. 记录仇恨值 | - 被玩家攻击后触发反击行为 - 记录最近攻击者用于仇恨系统 |
选择视觉感知并添加(可设置感知频率节省开支)
参数名称 | 参数含义 | 示例值/状态 | 备注 |
---|---|---|---|
视线半径 | AI能够检测目标的最大可见距离(半径范围)。 | 3000.0 cm | 超出此距离的目标会被视为不可见。 |
失去视线半径 | 当目标超出此距离时,AI会判定失去视线(即使之前可见)。 | 3500.0 cm | 通常比视线半径略大,用于平滑过渡视线丢失的判定。 |
周边视觉半角 | AI水平视野的角度范围(类似人眼余光)。 | 50.0° | 与垂直视野无关,仅控制水平方向的可视角度。 |
到上个已见位置的自动成功范围 | 用于记录目标上次可见时的位置偏移或追踪衰减参数。 | -1.0 cm | 负值表示禁用此功能,正值表示视野突然消失后消失点半径内ai都算可见 |
视点向后偏移 | AI视角相对于Pawn身体的后方偏移量(如模拟头部自然转动)。 | 0.0 cm | 0表示无偏移,正值会使视角略微后移(需配合动画蓝图)。 |
接近剔除半径 | 当目标进入此半径时,AI会忽略该目标(用于优化性能)。 | 0.0 cm | 0表示不启用,需手动设置正值(如200cm)以剔除近距离目标。通常配合"视点向后偏移"使用 |
最大年龄 | AI对目标可见状态的最长跟踪时间(超过此时间未更新则遗忘)。 | 0.0 s | 0表示永久跟踪,需设置为正数(如5.0s)以限制记忆时长。 |
开始点已启用 | 是否在游戏开始时自动激活此视力配置。 | ✅ 已勾选 | 若取消勾选,需通过蓝图或代码手动启用。 |
添加事件"目标感知更新时"
当有刺激物触发函数时,函数自动输出刺激物的引用与信息(stimulus)
Stimulus
的信息与AI感知组件中配置的感官(如ai视力配置)类型直接相关
创建HandleSightSense函数(输入连接如上图)
代码逻辑:检验刺激对象是否为角色/刺激信息的感官是否为视力,否则返回
随后如果成功刺激就将对象引用存入黑板,否则将刺激位置写入黑板
黑板装饰器
黑板装饰器(Blackboard Decorator)是行为树中用于动态控制节点执行条件的节点,其核心功能是通过黑板变量的值来决定是否执行被修饰的节点或子树.(可中断行为树节点的执行)
右键行为树任务-添加装饰器
blackboard
选择blackboard添加该节点,根据黑板中键的值来判断行为树任务是否该执行
结果改变时 | 仅当装饰器的布尔结果(如Is Set 或Is Not Set )发生变化时触发。 | 布尔型条件(如目标是否存在)。 |
值改变时 | 当黑板键的实际值(如Actor对象、坐标等)发生变化时触发。 | 需要监听具体值变化的场景(如玩家位置更新)。 |
根据所选黑板的键是否达成"键查询"的查询要求来判断是否执行任务树
自建装饰器
选择新建装饰器
进入装饰器蓝图-可于函数处重载函数
- AI专用函数(带AI后缀):自动传递AI组件引用,简化AI相关逻辑开发。
- 普通函数:适用于非AI场景,需手动处理参数。
函数名称 | 功能 | 触发时机 | 输入参数 | 输出 | 使用场景 |
---|---|---|---|---|---|
接收观察者已启用 | 当观察者(黑板键监听)被启用时触发,用于初始化监听逻辑。 | 行为树启动或观察者被动态启用时 | Observer Aborted (枚举:None /Self /Both )Blackboard Key | 无显式返回值 | 注册事件监听(如开始监控玩家位置) |
接收观察者已启用AI | AI专用的观察者启用逻辑,自动传递AI组件引用。 | 行为树启动或观察者被动态启用时 | Observer Aborted AI Controller Controlled Pawn | 无显式返回值 | 需要AI组件的监听(如结合感知系统) |
接收观察者已停用 | 当观察者被禁用时触发,用于清理监听资源。 | 观察者被手动禁用或行为树切换时 | Observer Aborted | 无显式返回值 | 取消事件注册(如停止追踪玩家) |
接收观察者已停用AI | AI专用的观察者停用逻辑,自动传递AI组件引用。 | 观察者被手动禁用或行为树切换时 | Observer Aborted AI Controller Controlled Pawn | 无显式返回值 | 需要AI组件的清理(如释放感知资源) |
接收执行开始 | 装饰器节点开始执行时触发,用于前置条件检查或初始化。 | 装饰器节点被行为树激活时 | Owner Comp Controlled Pawn | 通过Continue Execution 引脚控制是否继续执行子节点 | 加载动画资源或初始化变量 |
接收执行开始AI | AI专用的执行开始逻辑,自动传递AI组件引用。 | 装饰器节点被行为树激活时 | Owner Comp AI控制器Controlled Pawn AI ControllerAI角色 | 无显式返回值 | 需要AI组件的初始化(如预计算路径) |
接收执行完成 | 装饰器节点执行结束时触发,用于后置处理或状态保存。 | 装饰器节点逻辑完成或被中断时 | Owner Comp Controlled Pawn | 无显式返回值 | 保存任务状态或触发事件 |
接收执行完成AI | AI专用的执行完成逻辑,自动传递AI组件引用。 | 装饰器节点执行结束或被中断时 | Owner Comp Controlled Pawn AI Controller | 无显式返回值 | 需要AI组件的清理(如释放目标标记) |
接收Tick | 每帧调用,用于通用逻辑更新(非AI专用)。 | 每帧执行 | Delta Seconds | 无显式返回值 | 非AI相关逻辑(如UI更新) |
接收Tick AI | 专为AI设计的每帧更新逻辑,自动传递AI组件引用。 | 每帧执行 | Delta Seconds AI Controller Controlled Pawn | 无显式返回值 | 持续追踪目标位置或更新导航路径 |
执行条件检查 | 核心条件判断函数,返回布尔值决定下游节点是否执行。 | 装饰器节点被激活时(行为树启动或条件变化时) | Owner Comp Controlled Pawn | 布尔值(True /False ) | 动态条件判断(如目标是否在范围内) |
执行条件检查AI | AI专用的条件检查函数,自动传递AI组件引用。 | 装饰器节点被激活时 | Owner Comp Controlled Pawn AI Controller | 布尔值(True /False ) | 需要AI组件的条件判断(如结合感知信息) |
选择"执行条件检查AI"函数重载
函数逻辑:
从黑板键中获取TargetActor变量的信息并获取其中actor引用,如果引用无效就返回false,有效则根据actor的缩放值与设置的最大可接受值的大小关系返回布尔值.
黑板键选择器
在蓝图中或在开启"可编辑实例"后在蓝图外装饰器细节处选择要绑定的黑板键
回到行为树添加装饰器
行为树逻辑
如果黑板中TargetActor未设置(即未看到玩家)->移动到随机点
如果获取到了TargetActor且其缩放大小小于MaxAccepable,则则走向TargetActor的位置
此时若是丢失TargetActor则走到最后一次获取到的TargetActor的位置
疑问1
ai控制器蓝图变量中没有显式的黑板变量,其与"将值设置为XX"节点都要取消"情景关联"后才能放置
直接使用黑板变量会报错,改为使用方法获得变量
原因:
即使未在AI控制器蓝图中显式声明黑板变量,以下机制仍允许合法引用:
-
隐式黑板组件绑定
- AI控制器默认包含
Blackboard Component
,该组件会自动关联行为树中创建的黑板资源。 - 通过
Get Blackboard
节点获取组件后,可直接操作已绑定的黑板变量。
- AI控制器默认包含
-
动态键名解析
- UE5允许通过字符串名称(如
"TargetLocation"
)访问黑板变量,无需在蓝图中预定义变量类型。 - 系统会在运行时根据行为树的黑板键名自动匹配。
- UE5允许通过字符串名称(如
AI控制器通过行为树组件(BehaviorTreeComponent
)动态绑定不同的黑板资源,即使管理多个行为树
疑问2
各个节点内容
获得感官配置的类属性
创建一个文字命名
传入黑板目标,将名字为keyName变量的关键帧的值设置为ObjectValue
疑问3
为什么有时候ai追我后我躲在障碍物后面,黑板中TargetActor是None,但是行为树却一直是MoveToTatgetActor,且能一直往玩家角色的位置走?
待解决
听觉感知
设置ai感官
于ai控制器中新建函数,ai感知组件感知被触发并检验来源和属性后将声音位置写入黑板
角色落地发出声音
行为树新建任务-清除黑板键
修改行为树
如果TargetActor未设置且获取了TargetLocation(已听见)
则走到声音位置,三秒后清除位置信息
路径巡视
建立巡逻点蓝图
新建actor BP_PatroPoint
添加一个圆柱体并添加材质,设置无碰撞并添加到场景
建立巡逻组件并添加进NPC蓝图
新建蓝图继承actor组件
新建变量map<BP_PatroPoint,浮点>,并设置变量公有 可编辑
进入ai角色蓝图,将组件添加其中
随后即可在关卡细节中将场景的巡逻点添加如组件并设置巡逻时间
新建任务
控制ai巡逻逻辑
当任务开始执行
如果黑板中actor获取组件中map的大小不为0,则执行按路径巡逻函数
路径巡逻函数
获取map中当前下标的巡逻点的位置叫ai移动过去,
等待从map[当前下标引用]得到的时间后执行更新下标函数
更新下标函数
[index++]%map.size()保证下标循环以循环巡逻后递归路径巡逻函数
多种巡逻路径选择
新建枚举并添加枚举值
修改更新下标函数
函数逻辑
新建方向变量值为1/-1
更新下标:下标+=方向;
检查下标是否越界,没越界则直接前往,越界了则将下标设置为0(loop)/方向变量反向并下标-1
None不用连接完成执行,否则ai不会停止而是根据行为树返回其他任务(随机移动)
触觉/预判感知
触摸:碰撞获得targetActor
预判
在视觉感知函数中添加
使用"请求Pawn预感事件"预测一秒后角色位置,并对LastKnownLocation初始化
进入行为树勾选观察黑板值以灵活移动到更新的位置
导航网格体修改器
设置导航网格体修改器
设置-导航网格体-勾选绘制多边形边缘+绘制多边形开销
此时导航网格体每一格出现开销,ai会优先选择开销少的路径
添加导航修改器体积
可选择通行要求(增大开销,限制姿势...)
继承NavArea新建自定义导航区域
细节处可更改开销
动态修改导航网格
建立一个火焰蓝图
添加碰撞体并于碰撞体细节开启动态阻碍
效果:
取消勾选"使用系统默认障碍区域类"后可添加自建障碍区域类
游戏中主动修改导航网格实现
设置-导航网格体-运行时生成选择"仅动态修改"
角色蓝图中添加生成火焰代码即可
EQS-环境查询系统
- EQS 通过生成器、测试器和排序器,帮助AI实现环境感知、动态决策和智能行为.
工作流程:
- 生成器 只是负责生成候选目标。
- 测试器 负责对这些候选目标进行评估并给出分数。
- 最终的选择是基于 测试器 评估后的得分,通常会选出得分最高的目标。
- 最后由行为树
新建场景查询类
进入新建类中可以从各个节点下方下添加生成器
生成器(Generator) 是EQS系统的核心模块,负责在场景中生成数据点或场景对象集合,作为后续测试和筛选的输入。
- 数据点:可以是坐标位置(如网格点、圆形区域点)、路径节点等。
- 场景对象:如特定类别的Actor(敌人、道具等)。
核心作用:将场景中的复杂信息转化为可量化的数据集合,供测试器(Test)评估和筛选。
生成器名称 | 功能描述 | 典型应用场景 |
---|---|---|
Actors Of Class | 收集场景中指定类别的Actor(如敌人、道具)的位置。 | 寻找附近的敌人或可交互对象。 |
Composite | 组合多个生成器的结果(如同时生成敌人位置和路径点)。 | 多条件综合查询(如“寻找敌人并避开障碍”)。 |
Current Location | 生成查询发起者(如AI角色)的当前位置。 | 以自身为起点进行环境分析(如撤退路径规划)。 |
Perceived Actors | 收集AI当前感知到的Actor(依赖感知组件,如视野、听觉)。 | 分析可见敌人或威胁分布。 |
Points: Circle | 在指定半径的圆形区域内生成均匀分布的点。 | 检测周围区域内的目标(如范围攻击覆盖区域)。 |
Points: Cone | 在锥形区域内生成点(如前方扇形视野)。 | 检测前方扇形范围内的威胁或目标。 |
Points: Grid | 将区域划分为网格,生成网格交点作为数据点。 | 全局区域扫描(如寻找最优路径点)。 |
Points: Pathing Grid | 在导航网格(NavMesh)上生成可行走区域的数据点。 | 路径规划(如避开不可行走区域)。 |
Points: Donut | 在环形区域内生成数据点(中心空洞的环形)。 | 分析环形区域内的资源分布(如绕过中心陷阱)。 |
新建生成器Point:Grid 功能如图↓
新建测试器类
拖入场景中-选择场景查询类即可显示方才生成器生成的item
生成器测试
右击生成器添加测试(射线/距离..)
选择distance-进入细节面板
测试目的-过滤与打分:为每个item过滤/打分
过滤:筛选范围
分数:根据距离于"得分等式"计算每个item的得分
选择仅得分,回到视图可看见每个item的得分
自定义环境查询上下文
继承该节点创建蓝图
进入并重载函数"提供单一actor",并返回玩家角色
于生成器中再添加可视性检验与到自身距离最短检验
可视性检验与到玩家距离最长检验中添加新建的EQS上下文查询
可视性检验细节面板与参数详情
检测目的 | 定义测试器的核心逻辑: - 仅过滤:仅排除不符合条件的数据点,不参与评分。 | 设置为“仅过滤” | 过滤被阻挡的路径,但不影响其他评分逻辑。 |
检测模式 | 检测类型: - 按通道几何体:基于碰撞通道(如可视性)进行物理追踪。 | 设置为“按通道几何体” | 使用碰撞通道(如Visibility)判断路径是否被阻挡。 |
检测通道 | 指定用于检测的碰撞通道(如 Visibility )。 | 设置为“可视性” | 仅检测与 Visibility 通道碰撞的物体(如墙壁、障碍物)。 |
检测形状 | 检测的几何形状: - 行:直线路径检测(从起点到目标点的射线)。 | 设置为“行” | 生成一条直线,检测路径上是否有遮挡物。 |
仅阻挡命中 | 勾选后,仅当路径被阻挡时触发过滤;若未命中(无遮挡),则保留数据点。 | 已勾选 | 仅过滤被阻挡的路径,未被阻挡的路径不受影响。 |
从情境检测 | 检测起点的来源: - 勾选:使用EQS查询上下文(如 EnvQueryContext_Character )作为起点。 | 未勾选 | 起点由EQS查询上下文(如AI角色位置)自动提供。 |
情境 | 指定检测起点的上下文对象(如AI角色)。 | 设置为 EnvQueryContext_Character | 测试器会从该角色的位置发起可见性检测。 |
于是实现EQS检验离玩家最短离自身最近且无法被玩家看到的点
修改行为树
Run EQS Query任务细节
添加所设置的EQS与修改的黑板键(接受EQS返回值)
当EQS查询中同时包含 位置生成器(如 Points: Grid
)和 对象生成器(如 Actors Of Class
)时,行为树的 Run EQS Query
任务黑板键下可能不会直接显示多个选项。这是因为:
- EQS默认返回类型统一:EQS会将所有生成器的数据合并为同一类型(如
Actor
或Vector
),或通过复合逻辑处理混合数据。 - 黑板键类型限制:单个黑板键只能存储单一类型数据(如
Vector
或Actor
),无法直接存储混合类型。
方法1:分阶段运行EQS查询(推荐)
方法2:复合生成器 + 统一数据类型(EQS中使用composit合成多个生成器+结构体键)
方法3:优先级筛选
从而实现ai躲猫猫(每次跑到玩家视线外)
EQS测试
其余EQS测试项
点乘
线条(向量)A:AI的向前单位向量
线条B:ai与item的单位向量
根据点乘筛选点
例子:
标签
根据不同表达式匹配标签,根据匹配结果筛选
Overlap
为每个item生成一个碰撞体进行碰撞检测
细节处修改碰撞体体积等细节
路径查询
检测ai可到的地方
可以设置寻路模式
Project
保存与生成器相同的投射数据,用于进行更复杂的测试操作
寻找掩体
生成网格
筛选:玩家不可视&&与墙壁碰撞
打分:距离玩家/ai越近分越高
寻找掩体并蹲下
创建蓝图接口I_combot并使ai角色实现
导入动画初学者内容包-选择骨骼网格体重定向并保存
动画蓝图中通过角色移动组件设置正在蹲伏变量
状态机中根据isCrouching输出直立/下蹲姿势
创建任务并添加到行为树中
其他
管理操作:双击连线调整连线形状