更新示例教程
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "da4522ce-bedb-42d5-8cba-63dcb4641265",
|
||||
"uuid": "2a691dda-d56d-4a72-9fef-111a999415db",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"name": "behavior-tree",
|
||||
"created": "2025-06-25T08:41:25.401Z",
|
||||
"created": "2025-06-25T14:06:55.596Z",
|
||||
"version": "1.0",
|
||||
"exportType": "clean"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"ver": "2.0.1",
|
||||
"importer": "json",
|
||||
"imported": true,
|
||||
"uuid": "b328a163-97a8-4435-b87c-9369dd76862d",
|
||||
"uuid": "598e1450-8c7a-46c7-9540-398f9809d627",
|
||||
"files": [
|
||||
".json"
|
||||
],
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "e7a0c4c4-f555-4dc5-be34-83ae26b4eb35",
|
||||
"uuid": "240e4a78-e55f-47a8-84de-39220bba1321",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"__type__": "cc.SceneAsset",
|
||||
"_name": "scene",
|
||||
"_name": "behaviour-example-scene",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"_native": "",
|
||||
@@ -11,7 +11,7 @@
|
||||
},
|
||||
{
|
||||
"__type__": "cc.Scene",
|
||||
"_name": "scene",
|
||||
"_name": "behaviour-example-scene",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"_parent": null,
|
||||
@@ -565,7 +565,7 @@
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": null,
|
||||
"minerCount": 2,
|
||||
"minerCount": 1,
|
||||
"goldMineCount": 3,
|
||||
"_id": "86AIY7iYlMNqJsDC/+LIMU"
|
||||
},
|
||||
@@ -2,7 +2,7 @@
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "1bf5f009-19d9-42b9-b6bb-b44efe349b09",
|
||||
"uuid": "1556cd72-9618-4f9f-b9e7-28152a33bde9",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
|
||||
@@ -12,7 +12,7 @@ const { ccclass, property } = _decorator;
|
||||
export class SimpleMinerDemo extends Component {
|
||||
|
||||
@property
|
||||
minerCount: number = 2;
|
||||
minerCount: number = 1;
|
||||
|
||||
@property
|
||||
goldMineCount: number = 3;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "d946c8cb-cba5-46eb-8949-5a327bdd4367",
|
||||
"uuid": "d07d95ad-f180-4b6e-9d0a-7248e75ec795",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
|
||||
@@ -5,9 +5,6 @@ import { StatusUIManager } from './StatusUIManager';
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
/**
|
||||
* 行为树组件 - 纯Cocos Creator组件,管理单个节点的行为树
|
||||
*/
|
||||
@ccclass('BehaviorTreeComponent')
|
||||
export class BehaviorTreeComponent extends Component {
|
||||
|
||||
@@ -50,12 +47,8 @@ export class BehaviorTreeComponent extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化行为树
|
||||
*/
|
||||
async initialize() {
|
||||
if (!this.behaviorTreeFile) {
|
||||
console.error(`[${this.node.name}] 行为树文件路径未设置`);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -63,22 +56,16 @@ export class BehaviorTreeComponent extends Component {
|
||||
await this.loadBehaviorTree();
|
||||
this.isLoaded = true;
|
||||
this.isRunning = true;
|
||||
|
||||
|
||||
} catch (error) {
|
||||
console.error(`[${this.node.name}] 行为树组件初始化失败: ${this.behaviorTreeFile}`, error);
|
||||
// 静默处理
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载行为树文件
|
||||
*/
|
||||
private async loadBehaviorTree(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
let jsonPath = this.behaviorTreeFile;
|
||||
resources.load(jsonPath, JsonAsset, (err, asset) => {
|
||||
if (err) {
|
||||
console.error(`[${this.node.name}] 加载行为树文件失败: ${jsonPath}`, err);
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
@@ -88,45 +75,33 @@ export class BehaviorTreeComponent extends Component {
|
||||
this.buildBehaviorTree(treeData);
|
||||
resolve();
|
||||
} catch (buildError) {
|
||||
console.error(`[${this.node.name}] 构建行为树失败: ${jsonPath}`, buildError);
|
||||
reject(buildError);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建行为树
|
||||
*/
|
||||
private buildBehaviorTree(treeData: BehaviorTreeJSONConfig) {
|
||||
// 创建事件注册表并注册基础动作
|
||||
this.eventRegistry = new EventRegistry();
|
||||
this.setupEventHandlers();
|
||||
|
||||
// 创建基础执行上下文
|
||||
const baseContext = {
|
||||
node: this.node,
|
||||
component: this,
|
||||
eventRegistry: this.eventRegistry
|
||||
};
|
||||
|
||||
// 使用@esengine/ai的BehaviorTreeBuilder构建行为树
|
||||
const result = BehaviorTreeBuilder.fromBehaviorTreeConfig(treeData, baseContext);
|
||||
this.behaviorTree = result.tree;
|
||||
this.blackboard = result.blackboard;
|
||||
this.context = result.context;
|
||||
|
||||
// 初始化黑板变量
|
||||
this.initializeBlackboard();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置事件处理器 - 根据行为树文件中实际使用的事件名称注册
|
||||
*/
|
||||
private setupEventHandlers() {
|
||||
if (!this.eventRegistry) return;
|
||||
|
||||
// 根据miner-stamina-ai.bt.json中的实际事件名称注册处理器
|
||||
this.eventRegistry.registerAction('go-home-rest', (context, params) => {
|
||||
return this.handleGoHomeRest(context, params);
|
||||
});
|
||||
@@ -148,13 +123,9 @@ export class BehaviorTreeComponent extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化黑板变量 - 简化版本
|
||||
*/
|
||||
private initializeBlackboard() {
|
||||
if (!this.blackboard) return;
|
||||
|
||||
// 简单初始化矿工状态
|
||||
this.blackboard.setValue('stamina', 100);
|
||||
this.blackboard.setValue('staminaPercentage', 1.0);
|
||||
this.blackboard.setValue('isLowStamina', false);
|
||||
@@ -164,10 +135,6 @@ export class BehaviorTreeComponent extends Component {
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 创建状态UI
|
||||
*/
|
||||
private createStatusUI() {
|
||||
if (!this.statusUIPrefab) {
|
||||
this.createSimpleStatusUI();
|
||||
@@ -186,16 +153,9 @@ export class BehaviorTreeComponent extends Component {
|
||||
}
|
||||
|
||||
private createSimpleStatusUI() {
|
||||
|
||||
this.statusUI = StatusUIManager.createStatusUIForMiner(this.node);
|
||||
if (!this.statusUI) {
|
||||
console.warn(`[${this.node.name}] 状态UI创建失败`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新状态UI显示
|
||||
*/
|
||||
private updateStatusUI() {
|
||||
if (!this.statusUI || !this.blackboard) return;
|
||||
|
||||
@@ -229,9 +189,6 @@ export class BehaviorTreeComponent extends Component {
|
||||
this.updateActionProgressUI();
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新动作进度UI
|
||||
*/
|
||||
private updateActionProgressUI() {
|
||||
if (!this.statusUI) return;
|
||||
|
||||
@@ -278,99 +235,83 @@ export class BehaviorTreeComponent extends Component {
|
||||
}
|
||||
|
||||
/**
|
||||
* 回家休息 - 简化版本
|
||||
* 回家休息 - 包含体力恢复逻辑
|
||||
*/
|
||||
private handleGoHomeRest(context: any, params: any): ActionResult {
|
||||
const blackboard = this.blackboard;
|
||||
if (!blackboard) return 'failure';
|
||||
|
||||
// 清理其他动作状态
|
||||
// 检查是否已经在家了
|
||||
const homePos = blackboard.getValue('homePosition') || this.node.worldPosition;
|
||||
const distance = Vec3.distance(this.node.worldPosition, homePos);
|
||||
|
||||
|
||||
|
||||
if (distance > 1.0) {
|
||||
// 还没到家,继续移动
|
||||
this.moveToPosition(homePos, 2.0);
|
||||
return 'running';
|
||||
} else {
|
||||
this.clearActionState('mine-gold-ore');
|
||||
this.clearActionState('store-ore');
|
||||
|
||||
// 回到出生点休息
|
||||
const homePos = blackboard.getValue('homePosition') || this.node.worldPosition;
|
||||
this.moveToPosition(homePos, 2.0);
|
||||
blackboard.setValue('isResting', true);
|
||||
|
||||
|
||||
return 'success';
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复体力 - 优化版本,缓慢恢复
|
||||
*/
|
||||
private handleRecoverStamina(context: any, params: any): ActionResult {
|
||||
const blackboard = this.blackboard;
|
||||
if (!blackboard) return 'failure';
|
||||
|
||||
const actionKey = 'recover-stamina';
|
||||
const actionKey = 'go-home-rest';
|
||||
const currentTime = Date.now();
|
||||
|
||||
// 初始化动作状态
|
||||
// 初始化休息状态
|
||||
if (!this.actionStates.has(actionKey)) {
|
||||
this.actionStates.set(actionKey, {
|
||||
isExecuting: true,
|
||||
startTime: currentTime,
|
||||
duration: 2000 // 2秒恢复一次
|
||||
});
|
||||
// 设置休息状态,确保不会被其他任务中断
|
||||
blackboard.setValue('isResting', true);
|
||||
|
||||
return 'running';
|
||||
}
|
||||
|
||||
const actionState = this.actionStates.get(actionKey)!;
|
||||
const elapsed = currentTime - actionState.startTime;
|
||||
|
||||
// 检查是否到了恢复时间
|
||||
if (elapsed >= actionState.duration) {
|
||||
// 恢复体力
|
||||
const currentStamina = blackboard.getValue('stamina');
|
||||
const newStamina = Math.min(100, currentStamina + 10); // 每次恢复10点
|
||||
const newStamina = Math.min(100, currentStamina + 10);
|
||||
|
||||
blackboard.setValue('stamina', newStamina);
|
||||
blackboard.setValue('staminaPercentage', newStamina / 100);
|
||||
blackboard.setValue('isLowStamina', newStamina < 20);
|
||||
|
||||
|
||||
|
||||
// 体力满了就完成休息
|
||||
if (newStamina >= 100) {
|
||||
blackboard.setValue('isResting', false); // 只有完全恢复后才结束休息状态
|
||||
if (newStamina >= 80) {
|
||||
blackboard.setValue('isResting', false);
|
||||
blackboard.setValue('isLowStamina', false);
|
||||
this.actionStates.delete(actionKey);
|
||||
|
||||
return 'success';
|
||||
}
|
||||
|
||||
// 重置计时器继续恢复,保持休息状态
|
||||
actionState.startTime = currentTime;
|
||||
}
|
||||
|
||||
return 'running';
|
||||
}
|
||||
}
|
||||
|
||||
private handleRecoverStamina(context: any, params: any): ActionResult {
|
||||
return 'success';
|
||||
}
|
||||
|
||||
/**
|
||||
* 挖掘金矿 - 优化版本,需要时间挖掘
|
||||
*/
|
||||
private handleMineGoldOre(context: any, params: any): ActionResult {
|
||||
const blackboard = this.blackboard;
|
||||
if (!blackboard) return 'failure';
|
||||
|
||||
// 检查是否应该执行挖矿
|
||||
const hasOre = blackboard.getValue('hasOre');
|
||||
const isLowStamina = blackboard.getValue('isLowStamina');
|
||||
const isResting = blackboard.getValue('isResting');
|
||||
|
||||
if (hasOre || isLowStamina) {
|
||||
if (hasOre || isLowStamina || isResting) {
|
||||
return 'failure';
|
||||
}
|
||||
|
||||
// 找到最近的金矿
|
||||
const gameManager = this.node.parent?.getComponent('SimpleMinerDemo');
|
||||
const goldMines = (gameManager as any)?.getAllGoldMines();
|
||||
if (!goldMines?.length) return 'failure';
|
||||
|
||||
// 简单找最近的矿
|
||||
let nearestMine = goldMines[0];
|
||||
let minDistance = Vec3.distance(this.node.worldPosition, nearestMine.worldPosition);
|
||||
|
||||
@@ -383,29 +324,24 @@ export class BehaviorTreeComponent extends Component {
|
||||
}
|
||||
|
||||
if (minDistance > 2.0) {
|
||||
// 还没到金矿,继续移动
|
||||
this.moveToPosition(nearestMine.worldPosition, 2.0);
|
||||
return 'running';
|
||||
} else {
|
||||
// 到了金矿,开始挖掘流程
|
||||
const actionKey = 'mine-gold-ore';
|
||||
const currentTime = Date.now();
|
||||
|
||||
// 初始化挖掘状态
|
||||
if (!this.actionStates.has(actionKey)) {
|
||||
this.actionStates.set(actionKey, {
|
||||
isExecuting: true,
|
||||
startTime: currentTime,
|
||||
duration: 3000 // 3秒挖掘时间
|
||||
duration: 3000
|
||||
});
|
||||
|
||||
return 'running';
|
||||
}
|
||||
|
||||
const actionState = this.actionStates.get(actionKey)!;
|
||||
const elapsed = currentTime - actionState.startTime;
|
||||
|
||||
// 挖掘完成
|
||||
if (elapsed >= actionState.duration) {
|
||||
const currentStamina = blackboard.getValue('stamina');
|
||||
const newStamina = Math.max(0, currentStamina - 15);
|
||||
@@ -415,19 +351,14 @@ export class BehaviorTreeComponent extends Component {
|
||||
blackboard.setValue('hasOre', true);
|
||||
blackboard.setValue('isLowStamina', newStamina < 20);
|
||||
|
||||
|
||||
|
||||
this.actionStates.delete(actionKey);
|
||||
return 'failure'; // 让选择器重新评估条件
|
||||
return 'failure';
|
||||
}
|
||||
|
||||
return 'running';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 存储矿石 - 优化版本,需要时间存储
|
||||
*/
|
||||
private handleStoreOre(context: any, params: any): ActionResult {
|
||||
const blackboard = this.blackboard;
|
||||
if (!blackboard) return 'failure';
|
||||
@@ -437,11 +368,12 @@ export class BehaviorTreeComponent extends Component {
|
||||
return 'failure';
|
||||
}
|
||||
|
||||
// 清理其他动作状态
|
||||
this.clearActionState('mine-gold-ore');
|
||||
this.clearActionState('recover-stamina');
|
||||
const isLowStamina = blackboard.getValue('isLowStamina');
|
||||
if (isLowStamina) {
|
||||
return 'failure';
|
||||
}
|
||||
|
||||
// 找到仓库并移动过去
|
||||
this.clearActionState('mine-gold-ore');
|
||||
const gameManager = this.node.parent?.getComponent('SimpleMinerDemo');
|
||||
const warehouse = (gameManager as any)?.getWarehouse();
|
||||
if (!warehouse) return 'failure';
|
||||
@@ -449,35 +381,27 @@ export class BehaviorTreeComponent extends Component {
|
||||
const distance = Vec3.distance(this.node.worldPosition, warehouse.worldPosition);
|
||||
|
||||
if (distance > 2.0) {
|
||||
// 还没到仓库,继续移动
|
||||
this.moveToPosition(warehouse.worldPosition, 2.0);
|
||||
return 'running';
|
||||
} else {
|
||||
// 到了仓库,开始存储流程
|
||||
const actionKey = 'store-ore';
|
||||
const currentTime = Date.now();
|
||||
|
||||
// 初始化存储状态
|
||||
if (!this.actionStates.has(actionKey)) {
|
||||
this.actionStates.set(actionKey, {
|
||||
isExecuting: true,
|
||||
startTime: currentTime,
|
||||
duration: 1500 // 1.5秒存储时间
|
||||
duration: 1500
|
||||
});
|
||||
|
||||
return 'running';
|
||||
}
|
||||
|
||||
const actionState = this.actionStates.get(actionKey)!;
|
||||
const elapsed = currentTime - actionState.startTime;
|
||||
|
||||
// 存储完成
|
||||
if (elapsed >= actionState.duration) {
|
||||
blackboard.setValue('hasOre', false);
|
||||
(gameManager as any).mineGoldOre(this.node);
|
||||
|
||||
|
||||
|
||||
this.actionStates.delete(actionKey);
|
||||
return 'success';
|
||||
}
|
||||
@@ -486,44 +410,25 @@ export class BehaviorTreeComponent extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认待机行为
|
||||
*/
|
||||
private handleIdleBehavior(context: any, params: any): ActionResult {
|
||||
|
||||
return 'success';
|
||||
}
|
||||
|
||||
// ==================== 辅助方法 ====================
|
||||
|
||||
private moveToPosition(targetPos: Vec3, duration: number) {
|
||||
tween(this.node).stop(); // 停止之前的移动
|
||||
tween(this.node).stop();
|
||||
tween(this.node).to(duration, { worldPosition: targetPos }).start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新行为树 - 简化版本
|
||||
*/
|
||||
update(deltaTime: number) {
|
||||
// 简单执行行为树
|
||||
if (this.behaviorTree && this.isRunning) {
|
||||
this.behaviorTree.tick(deltaTime);
|
||||
}
|
||||
|
||||
// 更新UI显示
|
||||
if (this.showStatusUI) {
|
||||
this.updateStatusUI();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置更新频率 - 已废弃,现在每帧执行
|
||||
*/
|
||||
setTickInterval(interval: number) {
|
||||
// 方法保留以保持兼容性,但不再有实际作用
|
||||
console.warn(`[${this.node.name}] setTickInterval已废弃,行为树现在每帧执行`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取黑板
|
||||
*/
|
||||
|
||||
@@ -31,13 +31,7 @@ export class MinerStatusUI extends Component {
|
||||
this.camera = find('Main Camera')?.getComponent(Camera) || director.getScene()?.getComponentInChildren(Camera);
|
||||
this.canvas = find('Canvas')?.getComponent(Canvas) || director.getScene()?.getComponentInChildren(Canvas);
|
||||
|
||||
if (!this.camera) {
|
||||
console.warn('[MinerStatusUI] 未找到主摄像机');
|
||||
}
|
||||
|
||||
if (!this.canvas) {
|
||||
console.warn('[MinerStatusUI] 未找到Canvas');
|
||||
}
|
||||
|
||||
if (this.nameLabel && this.followTarget) {
|
||||
this.nameLabel.string = this.followTarget.name;
|
||||
@@ -58,20 +52,17 @@ export class MinerStatusUI extends Component {
|
||||
if (!this.followTarget || !this.camera || !this.canvas) return;
|
||||
|
||||
const targetWorldPos = this.followTarget.worldPosition.clone();
|
||||
targetWorldPos.y += this.yOffset / 100;
|
||||
|
||||
const screenPos = this.camera.worldToScreen(targetWorldPos);
|
||||
|
||||
const canvasTransform = this.canvas.node.getComponent(UITransform);
|
||||
if (canvasTransform) {
|
||||
const canvasPos = new Vec3(
|
||||
screenPos.x - canvasTransform.width / 2,
|
||||
screenPos.y - canvasTransform.height / 2,
|
||||
0
|
||||
);
|
||||
|
||||
this.node.setPosition(canvasPos);
|
||||
// 根据目标类型设置不同的Y偏移
|
||||
if (this.followTarget.name.includes('Warehouse')) {
|
||||
targetWorldPos.y += 3.0; // 仓库偏移更高
|
||||
} else {
|
||||
targetWorldPos.y += 2.0; // 矿工偏移
|
||||
}
|
||||
|
||||
// 将世界坐标直接转换为UI坐标
|
||||
const uiPos = new Vec3();
|
||||
this.camera.convertToUINode(targetWorldPos, this.canvas.node, uiPos);
|
||||
this.node.setPosition(uiPos);
|
||||
}
|
||||
|
||||
setFollowTarget(target: Node) {
|
||||
|
||||
@@ -16,13 +16,9 @@ export class StatusUIManager extends Component {
|
||||
static createStatusUIForMiner(miner: Node): MinerStatusUI | null {
|
||||
const canvas = find('Canvas') || director.getScene()?.getChildByName('Canvas');
|
||||
if (!canvas) {
|
||||
console.error('[StatusUIManager] 未找到Canvas');
|
||||
return null;
|
||||
}
|
||||
|
||||
const minerIndex = this.extractMinerIndex(miner.name);
|
||||
const yOffset = minerIndex * 20;
|
||||
|
||||
const uiRoot = new Node(`${miner.name}_StatusUI`);
|
||||
canvas.addChild(uiRoot);
|
||||
|
||||
@@ -60,7 +56,6 @@ export class StatusUIManager extends Component {
|
||||
|
||||
const statusUI = uiRoot.addComponent(MinerStatusUI);
|
||||
statusUI.setFollowTarget(miner);
|
||||
statusUI.yOffset = 100 + yOffset;
|
||||
|
||||
const nameNode = new Node('NameLabel');
|
||||
uiRoot.addChild(nameNode);
|
||||
@@ -238,7 +233,6 @@ export class StatusUIManager extends Component {
|
||||
static createWarehouseUI(warehouse: Node): MinerStatusUI | null {
|
||||
const canvas = find('Canvas') || director.getScene()?.getChildByName('Canvas');
|
||||
if (!canvas) {
|
||||
console.error('[StatusUIManager] 未找到Canvas');
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -273,7 +267,6 @@ export class StatusUIManager extends Component {
|
||||
|
||||
const statusUI = uiRoot.addComponent(MinerStatusUI);
|
||||
statusUI.setFollowTarget(warehouse);
|
||||
statusUI.yOffset = 150;
|
||||
|
||||
statusUI.nameLabel = null;
|
||||
statusUI.statusLabel = null;
|
||||
|
||||
Submodule extensions/cocos/cocos-ecs/extensions/behaviour-tree updated: 07270b77ff...16d1a02d8a
9
extensions/cocos/cocos-ecs/package-lock.json
generated
9
extensions/cocos/cocos-ecs/package-lock.json
generated
@@ -6,14 +6,15 @@
|
||||
"": {
|
||||
"name": "cocos-ecs",
|
||||
"dependencies": {
|
||||
"@esengine/ai": "^2.0.13",
|
||||
"@esengine/ai": "^2.0.14",
|
||||
"@esengine/ecs-framework": "^2.1.22"
|
||||
}
|
||||
},
|
||||
"node_modules/@esengine/ai": {
|
||||
"version": "2.0.13",
|
||||
"resolved": "https://registry.npmjs.org/@esengine/ai/-/ai-2.0.13.tgz",
|
||||
"integrity": "sha512-Iwbdw7UPVEARph/zvq6XL5XIkku3TmdFk/XHxT5aU2Y3RvPNnpd4OwDaranIpjuBL4WkquZx4C/Mw7jh4FNwFg==",
|
||||
"version": "2.0.14",
|
||||
"resolved": "https://registry.npmjs.org/@esengine/ai/-/ai-2.0.14.tgz",
|
||||
"integrity": "sha512-pRv2pAq79l+VcPPHNE7RaYJ9kYvYfZR2beuCyMH6ZgjgDolKYftCd/3KQAJ1LN9fOKvXAQSsa5PHi21ekXuEWg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@esengine/ecs-framework": "^2.1.20"
|
||||
},
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@esengine/ecs-framework": "^2.1.22",
|
||||
"@esengine/ai": "^2.0.13"
|
||||
"@esengine/ai": "^2.0.14"
|
||||
}
|
||||
}
|
||||
2
thirdparty/BehaviourTree-ai
vendored
2
thirdparty/BehaviourTree-ai
vendored
Submodule thirdparty/BehaviourTree-ai updated: f3e91b9f34...7df0745b80
Reference in New Issue
Block a user