(老规矩:广告位留给自己)
欢迎喜欢或者从事CocosCreator开发的小伙伴请加入我的大家庭CocosCreator游戏开发Q群:26855530
行为树的定义:控制AI实体决策流程的分层节点树。游戏中Npc的活动,或者主角挂机行为都十分依赖行为树,本章开始,封装适用CococCreator使用的TypeScript行为树,如果不了解行为树的小伙伴请自行问度娘,这里就不重复知识点,直接上正菜
首先先看看目录结构
我逐一简单介绍一下:
1.base目录存放本章行为树的基类接口文件,例如BTTree,BTParent,BTNode等...
2.biz目录是存放实现base目录接口的具体实现类,例如树节点,叶子节点,顺序节点,条件节点等等
3.conditional目录是存具体游戏AI业务判定逻辑
4.enum是个定义枚举目录,存放行为树的一些枚举常量
5.manager是行为树的管理器
6.tree顾名思义就是具体的行为树代码了
7.BehaviorManager.ts是行为树的挂件,只要挂在这个脚本,即可安排AI行为(#^.^#)
8.BlackBoard.ts顾名思义黑板,数据共享用的
吐槽下,打字好累啊~~~~~~~~~~~~~
接下就先看看基类的各种定义吧.也就是base目录的庐山真面目,我也不想打字,毕竟有没有人看也是两说的,直接上干货,走你!
抽象接口: 树
import BTNode from "./BTNode";
export default abstract class BTTree{
root:BTNode
}
抽象接口: 节点
import {NodeStatus} from "../enum/BTStatus";
export default abstract class BTNode {
_node: cc.Node;
constructor(node?: cc.Node) {
this._node = node;
}
private _status: NodeStatus = NodeStatus.Inactive;
get status(): NodeStatus {
return this._status;
}
set status(newStatus: NodeStatus) {
this._status = newStatus;
}
run(): NodeStatus {
if (this.status === NodeStatus.Inactive) {
this.onStart();
}
let nodeState = this.onUpdate();//具体业务逻辑
if (nodeState !== NodeStatus.Running) {
this.onEnd();
}
return nodeState;
}
onStart() {
this.status = NodeStatus.Running;
}
onUpdate(): NodeStatus {
return NodeStatus.Success;
}
onEnd() {
this.status = NodeStatus.Inactive;
}
}
抽象接口: 父节点
import BTNode from "./BTNode";
import {NodeStatus} from "../enum/BTStatus";
export default abstract class BTParent extends BTNode {
children: Array<BTNode> = [];
private _index: number = 0;
get index(): number {
return this._index;
}
set index(value: number) {
this._index = value;
}
constructor(children: Array<BTNode>) {
super();
this.children = children;
}
abstract canExecute(): boolean;
abstract onChildExecuted(status: NodeStatus, index: number): void
decorate(nodeState: NodeStatus): NodeStatus {
return nodeState;
}
onConditionalAbort(index: number) {
}
canRunParallelChildren(): boolean {
return false;
}
onChildStarted() {
}
}
抽象接口:行为节点
import BTNode from "./BTNode";
export default abstract class BTAction extends BTNode {
}
抽象接口:条件节点
import BTNode from "./BTNode";
export default abstract class BTConditional extends BTNode {
}
抽象接口:复合节点
import BTParent from "./BTParent";
import {AbortType} from "../enum/BTStatus";
import BTNode from "./BTNode";
export default abstract class BTComposite extends BTParent {
abortType: AbortType;
constructor(children: Array<BTNode> = [], abortType: AbortType = AbortType.Node) {
super(children);
this.abortType = abortType;
}
}
抽象接口:装饰节点
import BTParent from "./BTParent";
export default abstract class BTDecorate extends BTParent {
}
由于文章代码涉及量比较多,只能分好几期分享了,另外看看人气度,毕竟比较偏门,冷门...