虚幻引擎术语:
https://dev.epicgames.com/documentation/unreal-engine/unreal-engine-terminology
- Actor = 场景里所有能存在的对象(Gameobject?)
- 灯光、摄像机、门、箱子、子弹、怪物、玩家
- Pawn = 可以被玩家或 AI 控制的 Actor
- 敌人怪物、车辆、可操控摄像机
- Character = 自带人形移动能力的 Pawn
- https://dev.epicgames.com/documentation/unreal-engine/pawn-in-unreal-engine?utm_source=chatgpt.com
- 类型转换(Casting):将会提取特定类的Actor并尝试将其作为其他类进行处理。类型转换可能成功,也可能失败。如果类型转换成功,则可以在你类型转换到的Actor上访问特定于类的功能
- 组件(Component) 是一种可以添加到Actor的功能
- 玩家控制器(Player Controller):获取玩家输入,并将其转换到游戏内的互动中。每个游戏内部都至少具有一个玩家控制器。玩家控制器通常操控一个Pawn或角色作为玩家在游戏中的呈现方式。
- AI控制器(AI Controller):就像玩家控制器操控Pawn作为玩家在游戏中的呈现方式,AI控制器(AI Controller)操控Pawn在游戏中呈现非玩家角色(NPC)。默认情况下,Pawn和角色都以基本AI控制器终结,除非它们被玩家控制器专门操控或者收到指令不允许为自己创建AI控制器。
- 玩家状态(Player State):是游戏参与者在游戏中的状态,例如人类玩家或模拟玩家的机器人。非玩家AI作为游戏世界的一部分而存在,没有玩家状态。
- 玩家状态可能包含的玩家信息示例包括:名称、当前级别、血量
- 游戏模式(Game Mode) 设置要运行的游戏的规则。这些规则可以包括:
- 玩家如何加入游戏。
- 游戏是否可以暂停。
- 任何游戏特定行为,例如获胜条件。
- ?笔刷(Brush):是用于描述3D形状的Actor,例如立方体或球体。可以将笔刷放置在关卡中以定义关卡几何体(这些几何体称为二进制空间分区或BSP笔刷)。例如,如果要快速封锁关卡,此功能非常有用。
- 体积(Volumes):是带有边界的3D空间,根据连接到体积的效果,具有不同的使用方法。例如:
- 阻挡体积(Blocking Volumes) 是可见的,用于阻止Actor通过它们。
- 施加伤害体积(Pain Causing Volume) 对与其重叠的任何Actor造成持续伤害。
- 触发器体积(Trigger Volumes) 的编程方式为,在Actor进入或退出体积时触发事件
- 关卡(Unity的Scene)

蓝图
我理解蓝图就是可视化脚本,理由是首先文档中也提到“蓝图或脚本”的说法,说明是平级概念,其次蓝图中的事件图表,其功能很像Unity中的生命周期函数
蓝图的类型
- 蓝图类型
- 最常使用的蓝图类型是 关卡蓝图 和 蓝图类。
- 完整类型列表请参见蓝图类型.
- 关卡蓝图
- 蓝图类:
- 蓝图类定义了可以作为实例放入地图中的新类或Actor类型。编辑整个项目中使用的蓝图类将更新其所有实例。
- 蓝图类是创建门、开关、可收集物品、可摧毁场景等交互资源的理想类型。更多详情请参见蓝图类。

动画蓝图不属于上面的任何一个类型蓝图的子类
图表(Graph)
- 是一个节点网络,可连接到另一个节点网络以定义该网络的执行流
- 每个蓝图都可以包含一个或多个图表,具体取决于蓝图类型,这些图表定义了蓝图特定方面的实现。蓝图中的各个图表也可以包含 子图表,这些子图表本质上是折叠到其自身单独图表中的节点集合,主要用于组织用途
- Graph 就是蓝图里的“代码区域”,只不过 UE 不是写代码,而是用节点和连线来写逻辑
界面

- 3.组件
- 在向Actor添加组件后,该ActorIU可以使用该组件提供的功能
- 组件必须附加到Actor,不能独立存在。
- 组件事件:
可以通过不同的方法将基于组件的事件和/或功能快速添加到蓝图的 事件图表(Event Graph)- 添加可以为其创建事件的组件,例如盒体组件(BoxComponent)。
- 在 细节(Details) 面板中,单击 添加事件(Add Event) 按钮并选择所需的事件类型
- 无论采用哪种方式,都会将一个新的事件节点(基于选定类型)添加到 事件图表(Event Graph),该图表将自动打开。
- 4.我的蓝图(My Blueprint)
- 选项卡显示了蓝图中图表、脚本、函数、宏等内容的树状列表。本质上其是蓝图的轮廓,以便让使用者更加便捷地查看蓝图现有元素或创建新元素。
- 右键可查看变量的引用位置

动画蓝图
- 其三个界面事件图表(Event Graph)、动画图表(Anim Graph)、状态机(State Machines)的介绍:https://dev.epicgames.com/documentation/unreal-engine/animation-blueprint-editor-in-unreal-engine
事件图表(Event Graph)
- 每个动画蓝图都有单个 EventGraph
- 使用一组与动画相关的特殊事件来启动节点序列。
- 此外EventGraph的最常见用途是更新AnimGraph节点使用的值或属性。

动画事件
- EventGraph的用法是添加一个或多个事件以充当进入点,然后连接函数、流控制节点和变量以执行所需的操作
- 有了AnimGraph中提供的CPU线程和节点函数功能,推荐尽量少使用EventGraph。这是因为EventGraph与项目中的其他大部分蓝图逻辑一起在主游戏线程上执行。因此,在动画蓝图中采用复杂的EventGraph会降低总体性能。这些事件大部分有线程安全的对应事件,应尽可能使用后者。


动画图表(Anim Graph)
AnimGraph可供你为角色创建特定于动画的逻辑。通常,这涉及创建节点来控制混合、变换骨骼、移动和其他类似动画效果。在AnimGraph中,你可以使用根据EventGraph或函数计算的值,然后将这些变量连接为AnimGraph节点的输入,例如混合空间。节点及其值的组合效果连接到 Output Pose,这是为每个帧定义角色的最终姿势的地方。

- 状态机(State Machines), 用于构建基于状态的逻辑,通常用于移动。

事件图表的节点
| 节点 | 作用 | Unity 类比 |
|---|---|---|
| Event Blueprint Update Animation | 动画蓝图每帧执行一次,类似动画系统的 Update | Update() |
| Try Get Pawn Owner | 获取当前动画蓝图绑定的角色 Pawn,也就是正在使用这个 AnimBP 的角色本体 | 获取角色对象引用,比如 GetComponentInParent<PlayerController>() |
| Is Valid | 判断获取到的 Pawn 是否存在,防止空引用报错 | if (pawn != null) |
| Get Velocity | 获取 Pawn 当前的速度向量 | rigidbody.velocity / agent.velocity |
| Vector Length | 把速度向量转换成一个数值,也就是速度大小 | velocity.magnitude |
| Set | 把计算出来的速度写入设定的变量 | animator.SetFloat(“Speed”, speed) |
混合空间
https://dev.epicgames.com/documentation/unreal-engine/blend-spaces-in-unreal-engine#混合空间概述
动画序列(Animation Sequence)
https://dev.epicgames.com/documentation/unreal-engine/animation-sequences-in-unreal-engine
角色蓝图
准备工作
- 创建AI Controller蓝图
创建角色并绑定AI控制器
- 创建Character类型的蓝图
- 设置Mesh
- 常见设置Location Z = -90 Rotation Z = -90
- 目标是:
人物站在胶囊体里面,脚在胶囊体底部,面朝蓝色箭头方向
- 选中根节点(角色绑定AI控制器)
- Details中找到Pawn
- 设置AI Controller Class为我们刚刚创建的AI controller 蓝图类资源
- Auto process Player
- 如果角色已经放置在场景中属于Placed in world,自动生成的则属于Spawned,选择两者都启用
| UE | Unity | 功能 |
| 人物蓝图 Character Blueprint | 整个 Player / Monster 预制体 + 控制脚本 | |
| 人物蓝图里的事件图表 Event Graph | 生命周期函数 | Start()、Update()、输入回调、碰撞回调、自定义函数所在的 C# 脚本 |
| AnimGraph | Unity Animator Controller / State Machine / Blend Tree | |
| 动画蓝图 AnimBP | Animator Controller + Blend Tree + 动画参数更新逻辑 | |
| Blueprint Class / 蓝图类 | Prefab + C# MonoBehaviour 脚本 |
绑定AI控制器和行为树
现在要让我们的控制器运行我们的行为树
- 打开创建的AI Controller类的蓝图
- 添加节点Run Behaviour Tree与开始节点相连
- BT Asset选择创建的NPC行为树资源
行为树设置
- 有3个节点
- slector节点:“多选一”,它会从左到右尝试子节点,只要有一个子节点成功,就认为自己成功
- ,常用于“能攻击就攻击,不能攻击就追击,再不行就巡逻”这种优先级判断;
- Sequence 可以理解成“按顺序执行”,它会从左到右依次执行子节点,只要中间有一个失败,整个 Sequence 就失败,只有所有步骤都成功才算成功
- 常用于“发现玩家 → 移动到玩家 → 执行攻击”这种连续流程
- Simple Parallel 会一边执行主任务,后台运行右侧的辅助逻辑
- 比如 AI 一边移动追玩家,一边持续检测玩家状态或播放某种行为,通常用于需要并行监控的 AI 行为。
案例1:随机位置巡逻
(左上角选项模式右侧)创建物体 – 体积 – 导航网络体边界体积
- (NavMesh Bounds Volume) 是 UE 里用来指定 AI 可以寻路的范围 的体积盒子。你可以把它理解成:告诉引擎“在这个区域内生成可行走地图”。
- 不是碰撞体,而是一个“计算范围”。AI 的
Move To、行为树里的Move To、随机巡逻点等功能,都依赖这个导航网格。 - 如果场景里有
NavMesh Bounds Volume,按 P 后你会看到地面上出现一大片绿色区域:
创建自定义任务(设定运行黑板中的MoveTarget变量的任务)
- 行为树界面 – New Task

- 创建事件接收执行 AI(Event Receive Execute AI) 节点
- Owner Controller:表示当前控制这个 AI 的 AIController,可以理解成 AI 的“大脑”。
- Controlled Pawn:表示被这个 AIController 控制的角色本体
- Controlled Pawn → Cast To NPC
- 拿到当前 AI 控制的角色,并确认它是不是你的
NPC蓝图。 - 如果转换成功,说明当前被控制的对象就是 NPC。
- 拿到当前 AI 控制的角色,并确认它是不是你的
- Set As NPC
- 把转换成功后的 NPC 存成变量,方便后面使用。
- Get Actor Location
- 获取 NPC 当前所在的位置
- Get Random Location in Navigable Radius
- 在指定范围内寻找一个 AI 可以走到的随机点。
Origin = NPC 当前坐标,Radius = 200:在 NPC 周围 200 范围内,找一个 NavMesh 上可行走的位置 - 输出1:Random Location = 找到的随机位置
- 输出2:Return Value = 是否找到了
- 在指定范围内寻找一个 AI 可以走到的随机点。
- Branch
- 判断有没有成功找到可行走位置。
- Set Blackboard Value as Vector如果找到了,就把随机点写入黑板。
- Key = NavigationTarget
Value = Random Location- 把随机巡逻点保存到黑板变量 NavigationTarget 里
当前 AI 控制的角色
→ 转成 NPC
→ 获取 NPC 当前坐标
→ 在 NPC 附近半径 200 内随机找一个 NavMesh 上的点
→ 如果找到了
→ 把这个点写入黑板变量 NavigationTarget
→ 后面的 Move To 节点移动到这个点
- Blackboard Key Selector类型 黑板键选择器
- Blackboard Key Selector 是行为树节点中用于引用并选择黑板变量的类型,它本身不存储具体数据,只保存“要访问哪个 Blackboard Key”的信息。
- 黑板就是数据交换中心,不同task之间的这种数据交互就是通过黑板来交互的,不然task多了之后,不同任务之间的数据交换就会变得凌乱。
- 公开设置黑板参数的变量Nevigation,需要点开小眼睛,同时在蓝图的左上角点击compile
如果角色没有跟着播放动画怎么办?
- 查看状态机的条件,去掉多余的条件,在这个例子中是加速度,可通过debug看到运行时的值