Files
kunpocc-behaviortree/src/behaviortree/BehaviorTree.ts

61 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-06-04 23:10:59 +08:00
import { Blackboard } from "./Blackboard";
import { BaseNode } from "./BTNode/BaseNode";
import { createUUID } from "./header";
import { Ticker } from "./Ticker";
/**
*
*
*/
export class BehaviorTree {
/** 行为树ID @internal */
private _id: string;
/** 行为树跟节点 @internal */
private _root: BaseNode;
/**
* constructor
* @param root
*/
constructor(root: BaseNode) {
this._id = createUUID();
this._root = root;
}
/**
*
* @param subject
* @param blackboard
* @param ticker
*/
public tick(subject: any, blackboard: Blackboard, ticker?: Ticker): void {
ticker = ticker || new Ticker(subject, blackboard, this);
ticker.openNodes.length = 0;
this._root._execute(ticker);
// 上次打开的节点
let lastOpenNodes = (blackboard.get("openNodes", this._id) || []) as BaseNode[];
2025-06-04 23:10:59 +08:00
// 当前打开的节点
let currOpenNodes = ticker.openNodes;
let start = 0;
for (let i = 0; i < Math.min(lastOpenNodes.length, currOpenNodes.length); i++) {
start = i + 1;
if (lastOpenNodes[i] !== currOpenNodes[i]) {
break;
}
}
// 关闭不需要的节点
for (let i = lastOpenNodes.length - 1; i >= start; i--) {
lastOpenNodes[i]._close(ticker);
}
/* POPULATE BLACKBOARD */
blackboard.set("openNodes", currOpenNodes, this._id);
blackboard.set("nodeCount", ticker.nodeCount, this._id);
}
get id(): string {
return this._id;
}
get root(): BaseNode {
return this._root;
}
}