行为树(Behaviour Tree):概念,AI
2018-11-22 本文已影响0人
voif
行为树(Behaviour Tree):概念,AI
--掌握行为树的方法
- 起源,为了解决什么问题
- 发展历史,解决了什么问题,怎样解决的
- 概念,抽象出了哪些东西
- 应用,需要给行为树的需求分类,掌握不同类型的需要最适合的行为树实现
- 通用的行为树工具,能力范围,扩展方式
- 特定游戏类型的行为树工具,能力范围,扩展方式
- 实现,各类行为树的实现方式
1.通用的代码组织方式,代码能力范围
2.特定游戏类型的代码组织方式,代码能力范围
--认识行为树
升级版的fsm
更灵活,可配置性更强,可以让game designer方便的参与逻辑编写
--实现方案
数据结构中的行为树
--概念收集和解读,这些概念主要来自于"ai分享站",感谢作者无私分享
- 决策(Decision)
- 根据输入选择行为
- 行为(Behavior)
- 具体输出,改变程序状态,具体来说,操作多媒体,视觉特效,和其它模块交互
- 逻辑动作(Logical Action),行为池(Behavior Pool)
- 一系列的行为
- 单一行为(Simple Behavior)
- 复合行为(Composite Behavior)
- 序列(Sequenece):一个个行为接着做
- 并行(Parallel):两个或多个行为同时进行
- 选择(Selector):从候选行为中选择一个执行,包括脚本选择,和随机选择
- 控制节点(Control Node)
- 同决策
- 行为节点(Ternimal Node)
- 同行为
- AI中的共享数据,如blackboard
- 共享数据方便
- 共享数据不容易维护
- 因为多人协作,变量可能重复,导致混乱
- 访问匿名,无法方便的找到依赖
- 使用共享数据需要制定使用规范
- AI中的LOD
- 不需要决策的停止
- 不需要频繁决策的,降低决策频率
- 注:lod: level of detail缩写,在渲染优化中,如果一个物体距离摄像机越近,那么就让它显示的细节越多,否则细节越少。从而减少渲染的量,提升性能。
- AI中的双缓冲
- 当事件发生,决策层进行处理,这个处理过程可以跑在别的线程
- 处理完的结果做完行为层的输入
- AI中的Lazy
- 当边界条件频繁变换时,ai快速响应变换,像一个傻瓜,lazy让ai淡定许多,不那么傻了
- 方法
- 定时器,ai收到world信息后过一段时间再处理
- 渐变阈值,world在某个边界变化的时候,让一个值不断收缩,如果边界又变化了,从新收缩,直到不再变化,收缩到一个值后,ai就会进行决策和行动
- AI调试
- 时机:调整ai行为,解决ai bug
- 尽量使用:脚本,参数配置
- 编辑器,解决编译缓慢问题,分离逻辑,运行时调整
- 观察器,运行时查看参数
- 远程命令,发送一段指令给引擎,使其执行相应的函数
- 回放,为了复现ai的问题,依赖引擎,需要制定良好的ai架构
- 游戏世界环境,决策层执行指令序列(用于分析行为)
- AI势力图
- 一般是一个二维数组
- 存放地图上某个格子的权值
- 可以过去或者不可以过去的程度
- 动态地图寻路算法会用到
- 势力图动态更新
- 可以用在A*算法求路径上
- 行为节点的状态,processing, successed, failed
- BT的执行流程
- 从根节点出发,寻找一个可执行节点,从那个节点开始执行
- 选择节点
- 优先级型,从左往右逐个测试,执行条件逐渐放宽
- 非优先级型,每次从上一个执行的节点开始测试准入条件,用互斥避免节点被屏蔽
- 权重型,根据权重做概率选择
- 并行节点
- 需要解决该父节点的状态是怎么由并行的子节点状态确定的
- Blackboard
- 封装行为树的输入
- 行为树间共享数据
- 节点间共享数据
- 根据上述的使用情景,一般有多个黑板
- 层次状态机 hfsm
- 解决负责状态机跳转关系混乱问题
- 把跳转分组,每组间相互跳转,组内状态相互跳转,如果组内还是负责,继续在组内分组
- 调控AI的难度
- 调整ai的感知能力
- 调整ai的决策能力
- 减少对特殊情况的处理
- 放宽条件,收窄条件,减少对玩家不利的行动
- 调整ai的行动能力
- 武器,速度,伤害,基本种类和程度的变换
- goai,目标导向的ai
- 适用于持续型的ai,不需要频繁决策
- 需要plan模块,分析实现目标需要做什么,检查是否做完,标记进度
- 游戏世界信息的收集和组织
- 信息图,游戏ai决策用到的世界信息图表,一般是二维数组
- 危险程度
- 优先程度
- lazy collect,不是每次世界更新都要更新信息图,ai用到的时候再去收集
- 分块,大的信息图进行分块,每次先选定要那一块的信息,然后让那一块的感知器进行收集
- 信息图共享,不同ai共享信息图
- 状态机转行为树的范式
- 模式1:当处在任何状态中,一旦某条件满足,即跳转到某个特定的状态:selector
- 模式2:对于同一个跳转条件,处在不同的状态会有不同的跳转:selector,sequence
- 模式3:根据条件跳转到多个状态,包括自跳转
- sequence selector
- selector
- 模式4:循环跳转:交替权重的selector
- 可预测的行为系统
- 某些情况下,决策层需要知道如果选择了某个行为未来某个时间的世界信息,此时需要行为层提供预测能力
- 基于预先设置的公式的预测
- 基于动画系统的预测,如果是动画系统会改变world信息,这个就需要做更多工作导出会造成的影响
- 被动式请求:不是玩家主动触发的行为,如:跑,跳,技能 是主动请求, 绊倒,掉血,死亡,装弹药
处理方式- 被动请求(如果有),主动请求(如果有)同时传递给选择模块,此处,选择模块在决策模块之后运行,被动请求由游戏世界直接产生
- 主动请求是决策的输出
- 在行为树的决策层中加入selector,world导致的改变不直接产生请求,而是改变决策层的状态,每次决策时决策层输出请求给行为层
- 设计ai中的参数系统
- 方便设计人员工作,减小不同工种粘合度
- 参数数据和文件可以互转
- 关联变换,静态的数据关联改变,不用计算公式运行时计算
- 注:这样数据的观测性好,但是不如直接提供一个查看器,我支持简单数据运行时计算的做法
- 共享节点型行为树
- 为了节约内存,行为树的逻辑结构部分抽离出来做为共享对象使用
- 定义一下这个共享的部分
- 表示行为树的结构信息,如sequence, selector, parallel的组织方式,表达了处理的流程