搭建AI行为树

虚幻引擎术语:

https://dev.epicgames.com/documentation/unreal-engine/unreal-engine-terminology

  • Actor = 场景里所有能存在的对象(Gameobject?)
  • 类型转换(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、使用关卡序列Actor控制过场动画、管理关卡流送
    • 关卡蓝图还可以与关卡中放置的蓝图类交互,例如读取变量和触发自定义事件。更多信息请参阅关卡蓝图
  • 蓝图类:
    • 蓝图类定义了可以作为实例放入地图中的新类或Actor类型。编辑整个项目中使用的蓝图类将更新其所有实例。
    • 蓝图类是创建门、开关、可收集物品、可摧毁场景等交互资源的理想类型。更多详情请参见蓝图类

动画蓝图不属于上面的任何一个类型蓝图的子类

图表(Graph)

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

界面

https://dev.epicgames.com/documentation/unreal-engine/blueprints-visual-scripting-user-interface-for-blueprint-classes-in-unreal-engine

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

动画蓝图

事件图表(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动画蓝图每帧执行一次,类似动画系统的 UpdateUpdate()
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,选择两者都启用
UEUnity功能
人物蓝图 Character Blueprint整个 Player / Monster 预制体 + 控制脚本
人物蓝图里的事件图表 Event Graph生命周期函数Start()、Update()、输入回调、碰撞回调、自定义函数所在的 C# 脚本
AnimGraphUnity Animator Controller / State Machine / Blend Tree
动画蓝图 AnimBPAnimator 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。
  • 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 = 是否找到了
  • 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看到运行时的值
学习笔记如有侵权,请提醒我,我会马上删除
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇