type
status
date
slug
summary
tags
category
icon
password
游戏AI分类
1. 有限状态机(FSM)
最基本的AI实现方式。AI在不同的状态之间进行切换,每个状态都有特定的行为和条件。
实现步骤:
定义状态(例如:巡逻、追踪、攻击、逃跑)。
为每个状态编写行为逻辑。
定义状态转换条件(例如:玩家进入视野时从巡逻状态切换到追踪状态)。
使用一个状态管理器来控制当前状态和状态转换。
2. 行为树(Behavior Tree)
一种层次结构的决策模型,用于创建复杂的AI行为。由节点组成,每个节点代表一个行为或决策。
实现步骤:
创建根节点,并添加子节点(可以是行为节点或决策节点)。
行为节点执行具体的动作(例如:移动到指定位置)。
决策节点根据条件选择子节点(例如:如果看到玩家,则执行追踪行为)。
行为树的执行从根节点开始,依次执行子节点,直到找到一个成功的行为。
3. 路径规划(Pathfinding)
用于计算AI角色从一个点移动到另一个点的最优路径,最常用的算法是A*算法,博客主页的精选文章中有介绍。
实现步骤:
创建一个网格或导航网格(NavMesh)来表示游戏世界。
使用A*算法计算起点到终点的最短路径。A*算法结合了启发式搜索和代价函数来找到最优路径。
AI角色沿着计算出的路径移动。
4. 感知系统(Perception System)
感知系统使AI能够“看到”、“听到”或“感觉到”周围的环境。
实现步骤:
视觉感知:定义视野范围和视角,检测视野内的玩家或物体。
听觉感知:定义听觉范围,检测范围内的声音事件。
触觉感知:检测AI角色是否与其他物体碰撞。
5. 决策树(Decision Tree)
决策树是一种树形结构,用于根据条件进行决策,每个节点表示一个条件或决策。
实现步骤:
创建根节点,并添加条件节点和动作节点。
条件节点根据某个条件进行判断,选择子节点。
动作节点执行具体的行为。
从根节点开始,依次进行条件判断,直到执行一个动作节点。
6. 神经网络(Neural Networks)
神经网络是一种复杂的AI模型,可以用于学习和预测。常用于更高级的AI行为,如模式识别和预测玩家行为。
实现步骤:
选择合适的神经网络架构(例如:卷积神经网络、循环神经网络)。
收集训练数据(例如:玩家行为数据)。
使用训练数据训练神经网络模型。
在游戏中使用训练好的模型进行实时预测和决策。
7. 群体行为(Flocking Behavior)
群体行为用于模拟一群个体(例如:鸟群、鱼群)的集体运动。
实现步骤:
定义三个基本规则:分离(避免碰撞)、对齐(与邻居对齐)、凝聚(向邻居靠拢)。
对每个个体计算这三个规则的影响力,并更新其位置和方向。
结合路径规划和感知系统,使群体行为更加真实。
8. 规划系统(Planning System)
规划系统用于生成一系列动作,以达到某个目标。常用的算法是GOAP(Goal-Oriented Action Planning)。
实现步骤:
定义一组动作,每个动作有前置条件和效果。
定义目标状态。
使用规划算法(例如:A*或回溯搜索)生成从当前状态到目标状态的动作序列。
执行动作序列,直到达到目标状态。
这些AI技术可以单独使用,也可以组合使用,以创建更复杂和智能的游戏AI。每种技术都有其优缺点,选择哪种技术取决于具体的游戏需求和设计目标。
行为树和决策树的区别
其实看介绍就能发现,行为树要比决策树更加复杂,
行为树(Behavior Tree)
特点及用途
- 用于复杂行为逻辑管理:
- 行为树主要用于管理和组织复杂的行为逻辑,适合需要处理多个行为和状态的游戏角色。
- 节点类型丰富:
- 行为树包含多种节点类型,如选择节点(Selector Node)、序列节点(Sequence Node)、并行节点(Parallel Node)、装饰节点(Decorator Node)等。
- 这些节点类型使得行为树可以表达复杂的控制流和行为状态转换。
- 灵活性和模块化:
- 行为树提供了高度灵活和模块化的行为管理方式,可以通过简单地重新组合和修改节点结构来快速调整和扩展行为逻辑。
- 状态和任务管理:
- 行为树能很好地管理角色的状态和任务,确保在特定条件下执行合适的行为。
决策树(Decision Tree)
特点及用途
- 用于简单的决策逻辑:
- 决策树常用于基于简单条件的人为规则系统,对于需要做出一系列固定决策的游戏角色非常适用。
- 节点定义简单:
- 决策树的每个内部节点都表示一个决策或条件,叶子节点表示具体的行为或结果。
- 直观可解释:
- 决策树的决策路径是基于特定特征和阈值的,易于理解和解释。
比较
特性 | 行为树 (Behavior Tree) | 决策树 (Decision Tree) |
主要用途 | 复杂行为管理和状态控制 | 简单决策逻辑 |
节点类型 | 多种节点类型(选择、序列、装饰、并行等) | 决策节点和行为节点 |
灵活性 | 高灵活性,易于扩展和修改 | 灵活性相对较低 |
复杂行为处理 | 能处理高度复杂的行为 | 适合简单的条件决策 |
直观简洁 | 可能较复杂 | 决策路径清晰,易于解释 |
可扩展性 | 高,可复用子树 | 低,需重构树结构完成扩展 |
何时使用行为树 vs. 决策树
- 使用行为树:
- 当需要处理复杂的角色行为逻辑时,行为树是更好的选择。行为树的多种节点类型和层级设计可以帮助你轻松管理和扩展角色行为。
- 使用决策树:
- 当角色行为逻辑相对简单且基于固定条件决策时,决策树是更直观和高效的选择。决策树易于理解和构建,适合用来实现基于规则的简单决策。
总结
行为树和决策树在游戏AI中有各自的优势和适用场景。行为树更适合复杂的行为管理和状态控制,而决策树则适用于简单且明确的决策场景。在实际应用中,可以根据具体的需求选择合适的树结构来实现游戏角色的行为逻辑。
GOAP算法
GOAP(Goal-Oriented Action Planning,即以目标为导向的行动规划)是一种常用于游戏AI的行为规划算法。它以角色目标为中心,通过动态规划选择操作序列来实现这些目标。GOAP 强调灵活性和智能化,提高了游戏角色在复杂环境中的自主决策能力。以下是对 GOAP 详细的介绍:
核心概念
- 目标(Goals)
- 目标是AI试图达到的状态。每个目标都有优先级或价值,决定角色当前最重要的目标是什么。
- 动作(Actions)
- 动作是AI可以执行的行为,每个动作都有预条件(Preconditions)和效果(Effects)。
- 预条件:必须满足的条件才能执行该动作。
- 效果:执行动作后,世界状态会改变以反映效果。
- 世界状态(World State)
- 世界状态是对环境中所有关键信息的抽象,通常表示成一组属性及其值(如"有食物": true"、"健康": 80等)。
GOAP 的工作流程
- 定义世界状态:
- 确定角色和环境的初始状态。这些状态包括所有与决策相关的属性及其初始值。
- 设立目标:
- 定义一些AI可能需要达到的目标,并为每个目标指定优先级。
- 定义动作:
- 列出角色可以执行的全部动作,并为每个动作指定预条件和效果。
- 搜索和规划:
- 通过启发式搜索算法(如A*搜索算法)寻找可以实现目标的动作序列。搜索过程考虑当前的世界状态、目标状态以及每个动作的预条件和效果,最终生成一个行动计划。
- 执行计划:
- 按照搜索得出的行动计划,角色依次执行动作,并不断更新世界状态和重新评估当前目标是否已经达到。
示例
假设一个游戏角色需要在一张图中寻找食物,并且定义初始世界状态、目标和动作如下:
初始世界状态
目标
动作
- 搜索食物:
- 预条件:
- 效果:
- 找到食物:
- 预条件:
- 效果:
- 吃食物:
- 预条件:
- 效果:
行动计划生成
通过GOAP,搜索算法会发现通过以下动作序列可以实现目标“Eat Food”:
- 搜索食物:将位置从"home"切换到"forest"。
- 找到食物:将"has_food"从false切换到true。
- 吃食物:将"is_hungry"从true切换到false。
优点
- 灵活性和智能化:
- GOAP允许AI根据不同的环境状态和目标动态生成行动计划,表现出更智能和自适应的行为。
- 模块化和扩展性:
- 动作和目标的定义是模块化的,可以相对轻松地进行添加、删除或修改。这给游戏开发者在行为编写和调整上提供了很大的灵活性。
- 降低复杂度:
- 使用启发式搜索策略(如A*算法)可以有效地在复杂的行为空间中找到最优解,降低了规划的计算复杂度。
缺点
- 计算开销:
- 尽管使用了启发式搜索,GOAP在特别复杂的环境或状态空间中仍然可能面临较高的计算开销。
- 需求预定义:
- 需要较详细地预定义世界状态、动作和目标,初始配置复杂,对于大型游戏项目可能需要更多开发资源。
实现示例
以下是一个简单的GOAP实现伪代码示例:
总结
GOAP因为其灵活性和智能化而在现代游戏AI开发中得到广泛应用。它允许角色在动态和复杂的环境中自主决策,并生成适应当前情况的行为计划,提高了游戏的真实感和挑战度。
例子
在《只狼:影逝二度》中,BOSS战斗的复杂性和高质量表现,导致许多开发者和玩家都对其AI系统充满兴趣。
为什么使用行为树?
- 复杂行为管理:
- 行为树能以层次化和模块化的方式管理复杂的行为逻辑。BOSS的行为往往包含多个状态(如待机、攻击、逃跑、防御等),每个状态又包含细分的行为动作,行为树非常适合这种复杂性。
- 灵活性和可扩展性:
- 游戏开发过程中,BOSS的行为可能需要频繁调整和扩展。行为树结构使得添加或修改特定行为节点非常简便,提高了开发效率。
- 分层次行为选择:
- 行为树中的选择节点、序列节点、并行节点等可以根据条件(如BOSS的血量、玩家的距离等)动态选择和执行行为,这符合BOSS战斗中需要实时决策的特点。
可能实现方式
行为树基本结构
行为树的基本结构通常包含多个节点类型,每种类型管理特定的行为逻辑:
- 选择节点(Selector):
- 尝试执行其子节点,直到某个子节点成功。
- 序列节点(Sequence):
- 按顺序执行所有子节点,若某个子节点失败,整个序列节点失败。
- 并行节点(Parallel):
- 同时执行多个子节点,可设置成功或失败的条件(如只要一个成功/失败,或所有都成功/失败)。
- 装饰节点(Decorator):
- 修改或增强其他节点行为,可以用来检查条件、限时执行等。
示例:实现只狼中的一个BOSS行为树
假设我们有一个名为Genichiro的BOSS,具备多种状态和行为:
具体节点行为示例
- *Condition: Health < 30%**:
- 返回true或false,检查BOSS当前血量是否低于30%。
- Action: Enter Battle Stance:
- BOSS进入特殊的战斗模式,可能改变攻击模式和策略。
- Condition: Player Distance < 3 meters:
- 返回true或false,检查玩家距离是否小于3米。
- Action: Melee Attack:
- 执行近战攻击动作,如果成功攻击玩家,则返回成功。
- Action: Ranged Attack:
- 执行远程攻击动作。
- Action: Idle:
- 默认待机动作,可能包括警戒、寻找玩家等。
以上只是一些基础的逻辑分析,如果要进一步研究更加高级的AI逻辑,比如宫崎英高的作品《只狼》中经典的Boss“巨型忍者枭”(以下简称“枭”),就需要更加深入地研究其游荡索敌逻辑与行为逻辑。

首先,“枭”的整体表现是非常灵动的,因此可以看出其游荡逻辑并非完全固定,即不是直接用一个固定的选择节点,而是按照优先级来判断其游荡索敌的行为,甚至可以进一步推测“枭”的游荡索敌逻辑应该是结合了一部分行为逻辑的。例如,其前进的游荡行为很多时候是用“突刺型”的技能来代替的,而其后退的行为很多时候由几个“后跳”技能来实现。只有在玩家积极进攻后,“枭”才会进入一段真正的游荡时间。这种行为逻辑与游荡索敌逻辑结合的实现方式,使“枭”的战斗风格更加丰富,不会陷入呆板的游荡循环之中。
其次,“枭”的行为逻辑与一般的行为逻辑也有较大的差别。一方面,“枭”的多个技能之间都做了衔接动作,使技能衔接的可能性大大提高,这也就形成了他丰富的“变招”——攻击技能的不同状态机之间的灵活切换;另一方面,“枭”的大部分技能都带有较远的位移距离,因此其判断条件不会过多地考虑玩家与他之间的距离,而会更多地根据玩家的操作,如“格挡”“垫步”“进攻”等,来调整自己的攻击方式。
“枭”的AI逻辑复杂度相对较高,具体的行为树枝叶太过繁盛,还请有兴趣的读者自行尝试,或与笔者进一步交流。本文在这里给出一个简单的局部行为树示意图,仅供参考。


图7 《只狼》游戏中Boss“巨型忍者枭”局部行为树图
图7中行为树的左侧部分主要针对玩家的被动行为,比如玩家在接近或逃离时,“枭”的游荡与进攻所对应的行为逻辑;而右侧部分则针对于玩家的主动行为,比如倒地时要应对“枭”的“处决”技能,比如进攻时需应对“枭”的“弹反”技能。
最后,对本文所描述的行为树的内容进行一个总结:
(1)行为树拥有3种节点:条件节点、动作节点以及组合节点。其中,组合节点又可以分为三种基本类型:顺序节点、选择节点和平行节点;
(2)行为树结合状态机的使用,可以使动作游戏中的怪物(或角色)产生拟人的行为模式,适用于复杂的AI场景;
(3)行为树有利于逻辑的重用,因为优秀的行为树逻辑(如游荡索敌逻辑、技能衔接逻辑等)可以被不同的对象反复地调用。

- Author:lzzd
- URL:https://lazy-zed.com/article/u3d_4
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!