关于Behavior Designer的简单认知
什么是行为树,为什么要用行为树
行为树:
英文是Behavior Tree,简称BT,是一棵用于控制 AI 决策行为的、包含了层级节点的树结构。
为啥要用:
1.行为树在复杂的情况比有限状态机更清晰,更可拓展
2.行为树有利于逻辑的重用
3.设计得好的行为树可以千变万化!AI设计更完美!
Behavior Designer的资源和结构
资源链接
地址:https://download.csdn.net/download/Mihongzhong/13035594
插件结构:
Composites:组合节点
常用,可以充当某个具体逻辑的父节点,这个模块的运行受父节点也就是组合节点的控制:
比如:
Selector:顺序运行子节点,若子节点运行成功则返回成功,否则继续运行直到所有失败返回失败。
Sequence:顺序运行子节点,若子节点运行失败则返回失败,否则继续运行直到所有成功返回成功。
Conditionals:检测节点又名选择节点
常用,基本需要根据项目进行自己写(下文有怎么扩展节点),用来判断是否满足部分条件来返回具体的bool值。
Can See Object:检查一下是否有物体在特工的视线范围内。若在返回成功。
Is Button Down:当按下指定的按钮时返回成功。
Actions:行为节点
常用,实现具体的行为逻辑,基本需要根据项目进行自己写(下文有怎么扩展节点)
比如:
Log:打印日志
Patrol:几点之间进行巡逻
Decorators:修饰节点
不常用,对节点的返回结果进行修饰,主要是为了保证节点复用性上对节点返回结果进行修饰比如取反或者其他。
比如:
Until Success:将继续执行它的子任务,直到子任务返回成功
Repeater:循环运行多少次子节点后再返回最后一次运行状态
使用时候的部分坑:
关于运行状态
TaskStatus.Inactive 不活跃状态
TaskStatus.Success 成功状态
TaskStatus.Failure 失败状态
TaskStatus.Running 运行状态
注意:行为树的运行状态有两种,一种是某个节点或者组合模块不断进行运行状态,一种是行为树不断的进行update遍历。
看个人需求去使用了。
关于内存存储
Behavior Designer自己 有SharedVariable类型的数据类型工具,用在全局属性或者黑板功能使用多些 ,比如类型SharedGameObject、SharedFloat、SharedVector3等等,一般使用不会有问题,但是遇见过通过引用类型查找其他组件属性的时候偶然出现不等于预期的结果,个人感觉是有容错机制在里面。
在我的项目中,我用abc插件去控制角色的血量,行为树实现AI逻辑,在运行行为节点通过打印发现,极个别情况下,在行为树中获取对应的SharedGameObject身上的abc组件获取血量不是实际血量,拿到的是初始值(编译时的血量状态)
关于行为树节点脚本的编译
首先加入域名空间:BehaviorDesigner.Runtime.Tasks
第二:继承对于的需要扩展的父节点:Action或者Conditional或者其他
第三:重写部分父方法:
生命周期和功能和unity的生命周期一致。