更新示例教程

This commit is contained in:
YHH
2025-06-25 23:17:55 +08:00
parent 0b4a6b77e2
commit 78577db3f9
16 changed files with 91 additions and 201 deletions

View File

@@ -2,7 +2,7 @@
"ver": "1.2.0", "ver": "1.2.0",
"importer": "directory", "importer": "directory",
"imported": true, "imported": true,
"uuid": "da4522ce-bedb-42d5-8cba-63dcb4641265", "uuid": "2a691dda-d56d-4a72-9fef-111a999415db",
"files": [], "files": [],
"subMetas": {}, "subMetas": {},
"userData": { "userData": {

View File

@@ -310,7 +310,7 @@
], ],
"metadata": { "metadata": {
"name": "behavior-tree", "name": "behavior-tree",
"created": "2025-06-25T08:41:25.401Z", "created": "2025-06-25T14:06:55.596Z",
"version": "1.0", "version": "1.0",
"exportType": "clean" "exportType": "clean"
} }

View File

@@ -2,7 +2,7 @@
"ver": "2.0.1", "ver": "2.0.1",
"importer": "json", "importer": "json",
"imported": true, "imported": true,
"uuid": "b328a163-97a8-4435-b87c-9369dd76862d", "uuid": "598e1450-8c7a-46c7-9540-398f9809d627",
"files": [ "files": [
".json" ".json"
], ],

View File

@@ -2,7 +2,7 @@
"ver": "1.2.0", "ver": "1.2.0",
"importer": "directory", "importer": "directory",
"imported": true, "imported": true,
"uuid": "e7a0c4c4-f555-4dc5-be34-83ae26b4eb35", "uuid": "240e4a78-e55f-47a8-84de-39220bba1321",
"files": [], "files": [],
"subMetas": {}, "subMetas": {},
"userData": {} "userData": {}

View File

@@ -1,7 +1,7 @@
[ [
{ {
"__type__": "cc.SceneAsset", "__type__": "cc.SceneAsset",
"_name": "scene", "_name": "behaviour-example-scene",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_native": "", "_native": "",
@@ -11,7 +11,7 @@
}, },
{ {
"__type__": "cc.Scene", "__type__": "cc.Scene",
"_name": "scene", "_name": "behaviour-example-scene",
"_objFlags": 0, "_objFlags": 0,
"__editorExtras__": {}, "__editorExtras__": {},
"_parent": null, "_parent": null,
@@ -565,7 +565,7 @@
}, },
"_enabled": true, "_enabled": true,
"__prefab": null, "__prefab": null,
"minerCount": 2, "minerCount": 1,
"goldMineCount": 3, "goldMineCount": 3,
"_id": "86AIY7iYlMNqJsDC/+LIMU" "_id": "86AIY7iYlMNqJsDC/+LIMU"
}, },

View File

@@ -2,7 +2,7 @@
"ver": "1.2.0", "ver": "1.2.0",
"importer": "directory", "importer": "directory",
"imported": true, "imported": true,
"uuid": "1bf5f009-19d9-42b9-b6bb-b44efe349b09", "uuid": "1556cd72-9618-4f9f-b9e7-28152a33bde9",
"files": [], "files": [],
"subMetas": {}, "subMetas": {},
"userData": {} "userData": {}

View File

@@ -12,7 +12,7 @@ const { ccclass, property } = _decorator;
export class SimpleMinerDemo extends Component { export class SimpleMinerDemo extends Component {
@property @property
minerCount: number = 2; minerCount: number = 1;
@property @property
goldMineCount: number = 3; goldMineCount: number = 3;

View File

@@ -2,7 +2,7 @@
"ver": "1.2.0", "ver": "1.2.0",
"importer": "directory", "importer": "directory",
"imported": true, "imported": true,
"uuid": "d946c8cb-cba5-46eb-8949-5a327bdd4367", "uuid": "d07d95ad-f180-4b6e-9d0a-7248e75ec795",
"files": [], "files": [],
"subMetas": {}, "subMetas": {},
"userData": {} "userData": {}

View File

@@ -5,9 +5,6 @@ import { StatusUIManager } from './StatusUIManager';
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
/**
* 行为树组件 - 纯Cocos Creator组件管理单个节点的行为树
*/
@ccclass('BehaviorTreeComponent') @ccclass('BehaviorTreeComponent')
export class BehaviorTreeComponent extends Component { export class BehaviorTreeComponent extends Component {
@@ -50,12 +47,8 @@ export class BehaviorTreeComponent extends Component {
} }
} }
/**
* 初始化行为树
*/
async initialize() { async initialize() {
if (!this.behaviorTreeFile) { if (!this.behaviorTreeFile) {
console.error(`[${this.node.name}] 行为树文件路径未设置`);
return; return;
} }
@@ -63,22 +56,16 @@ export class BehaviorTreeComponent extends Component {
await this.loadBehaviorTree(); await this.loadBehaviorTree();
this.isLoaded = true; this.isLoaded = true;
this.isRunning = true; this.isRunning = true;
} catch (error) { } catch (error) {
console.error(`[${this.node.name}] 行为树组件初始化失败: ${this.behaviorTreeFile}`, error); // 静默处理
} }
} }
/**
* 加载行为树文件
*/
private async loadBehaviorTree(): Promise<void> { private async loadBehaviorTree(): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let jsonPath = this.behaviorTreeFile; let jsonPath = this.behaviorTreeFile;
resources.load(jsonPath, JsonAsset, (err, asset) => { resources.load(jsonPath, JsonAsset, (err, asset) => {
if (err) { if (err) {
console.error(`[${this.node.name}] 加载行为树文件失败: ${jsonPath}`, err);
reject(err); reject(err);
return; return;
} }
@@ -88,45 +75,33 @@ export class BehaviorTreeComponent extends Component {
this.buildBehaviorTree(treeData); this.buildBehaviorTree(treeData);
resolve(); resolve();
} catch (buildError) { } catch (buildError) {
console.error(`[${this.node.name}] 构建行为树失败: ${jsonPath}`, buildError);
reject(buildError); reject(buildError);
} }
}); });
}); });
} }
/**
* 构建行为树
*/
private buildBehaviorTree(treeData: BehaviorTreeJSONConfig) { private buildBehaviorTree(treeData: BehaviorTreeJSONConfig) {
// 创建事件注册表并注册基础动作
this.eventRegistry = new EventRegistry(); this.eventRegistry = new EventRegistry();
this.setupEventHandlers(); this.setupEventHandlers();
// 创建基础执行上下文
const baseContext = { const baseContext = {
node: this.node, node: this.node,
component: this, component: this,
eventRegistry: this.eventRegistry eventRegistry: this.eventRegistry
}; };
// 使用@esengine/ai的BehaviorTreeBuilder构建行为树
const result = BehaviorTreeBuilder.fromBehaviorTreeConfig(treeData, baseContext); const result = BehaviorTreeBuilder.fromBehaviorTreeConfig(treeData, baseContext);
this.behaviorTree = result.tree; this.behaviorTree = result.tree;
this.blackboard = result.blackboard; this.blackboard = result.blackboard;
this.context = result.context; this.context = result.context;
// 初始化黑板变量
this.initializeBlackboard(); this.initializeBlackboard();
} }
/**
* 设置事件处理器 - 根据行为树文件中实际使用的事件名称注册
*/
private setupEventHandlers() { private setupEventHandlers() {
if (!this.eventRegistry) return; if (!this.eventRegistry) return;
// 根据miner-stamina-ai.bt.json中的实际事件名称注册处理器
this.eventRegistry.registerAction('go-home-rest', (context, params) => { this.eventRegistry.registerAction('go-home-rest', (context, params) => {
return this.handleGoHomeRest(context, params); return this.handleGoHomeRest(context, params);
}); });
@@ -148,13 +123,9 @@ export class BehaviorTreeComponent extends Component {
}); });
} }
/**
* 初始化黑板变量 - 简化版本
*/
private initializeBlackboard() { private initializeBlackboard() {
if (!this.blackboard) return; if (!this.blackboard) return;
// 简单初始化矿工状态
this.blackboard.setValue('stamina', 100); this.blackboard.setValue('stamina', 100);
this.blackboard.setValue('staminaPercentage', 1.0); this.blackboard.setValue('staminaPercentage', 1.0);
this.blackboard.setValue('isLowStamina', false); this.blackboard.setValue('isLowStamina', false);
@@ -164,10 +135,6 @@ export class BehaviorTreeComponent extends Component {
} }
/**
* 创建状态UI
*/
private createStatusUI() { private createStatusUI() {
if (!this.statusUIPrefab) { if (!this.statusUIPrefab) {
this.createSimpleStatusUI(); this.createSimpleStatusUI();
@@ -186,16 +153,9 @@ export class BehaviorTreeComponent extends Component {
} }
private createSimpleStatusUI() { private createSimpleStatusUI() {
this.statusUI = StatusUIManager.createStatusUIForMiner(this.node); this.statusUI = StatusUIManager.createStatusUIForMiner(this.node);
if (!this.statusUI) {
console.warn(`[${this.node.name}] 状态UI创建失败`);
}
} }
/**
* 更新状态UI显示
*/
private updateStatusUI() { private updateStatusUI() {
if (!this.statusUI || !this.blackboard) return; if (!this.statusUI || !this.blackboard) return;
@@ -229,9 +189,6 @@ export class BehaviorTreeComponent extends Component {
this.updateActionProgressUI(); this.updateActionProgressUI();
} }
/**
* 更新动作进度UI
*/
private updateActionProgressUI() { private updateActionProgressUI() {
if (!this.statusUI) return; if (!this.statusUI) return;
@@ -278,99 +235,83 @@ export class BehaviorTreeComponent extends Component {
} }
/** /**
* 回家休息 - 简化版本 * 回家休息 - 包含体力恢复逻辑
*/ */
private handleGoHomeRest(context: any, params: any): ActionResult { private handleGoHomeRest(context: any, params: any): ActionResult {
const blackboard = this.blackboard; const blackboard = this.blackboard;
if (!blackboard) return 'failure'; 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('mine-gold-ore');
this.clearActionState('store-ore'); this.clearActionState('store-ore');
// 回到出生点休息
const homePos = blackboard.getValue('homePosition') || this.node.worldPosition;
this.moveToPosition(homePos, 2.0);
blackboard.setValue('isResting', true); blackboard.setValue('isResting', true);
const actionKey = 'go-home-rest';
return 'success';
}
/**
* 恢复体力 - 优化版本,缓慢恢复
*/
private handleRecoverStamina(context: any, params: any): ActionResult {
const blackboard = this.blackboard;
if (!blackboard) return 'failure';
const actionKey = 'recover-stamina';
const currentTime = Date.now(); const currentTime = Date.now();
// 初始化动作状态 // 初始化休息状态
if (!this.actionStates.has(actionKey)) { if (!this.actionStates.has(actionKey)) {
this.actionStates.set(actionKey, { this.actionStates.set(actionKey, {
isExecuting: true, isExecuting: true,
startTime: currentTime, startTime: currentTime,
duration: 2000 // 2秒恢复一次 duration: 2000 // 2秒恢复一次
}); });
// 设置休息状态,确保不会被其他任务中断
blackboard.setValue('isResting', true);
return 'running'; return 'running';
} }
const actionState = this.actionStates.get(actionKey)!; const actionState = this.actionStates.get(actionKey)!;
const elapsed = currentTime - actionState.startTime; const elapsed = currentTime - actionState.startTime;
// 检查是否到了恢复时间
if (elapsed >= actionState.duration) { if (elapsed >= actionState.duration) {
// 恢复体力
const currentStamina = blackboard.getValue('stamina'); 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('stamina', newStamina);
blackboard.setValue('staminaPercentage', newStamina / 100); blackboard.setValue('staminaPercentage', newStamina / 100);
blackboard.setValue('isLowStamina', newStamina < 20);
if (newStamina >= 80) {
blackboard.setValue('isResting', false);
// 体力满了就完成休息 blackboard.setValue('isLowStamina', false);
if (newStamina >= 100) {
blackboard.setValue('isResting', false); // 只有完全恢复后才结束休息状态
this.actionStates.delete(actionKey); this.actionStates.delete(actionKey);
return 'success'; return 'success';
} }
// 重置计时器继续恢复,保持休息状态
actionState.startTime = currentTime; actionState.startTime = currentTime;
} }
return 'running'; return 'running';
} }
}
private handleRecoverStamina(context: any, params: any): ActionResult {
return 'success';
}
/**
* 挖掘金矿 - 优化版本,需要时间挖掘
*/
private handleMineGoldOre(context: any, params: any): ActionResult { private handleMineGoldOre(context: any, params: any): ActionResult {
const blackboard = this.blackboard; const blackboard = this.blackboard;
if (!blackboard) return 'failure'; if (!blackboard) return 'failure';
// 检查是否应该执行挖矿
const hasOre = blackboard.getValue('hasOre'); const hasOre = blackboard.getValue('hasOre');
const isLowStamina = blackboard.getValue('isLowStamina'); const isLowStamina = blackboard.getValue('isLowStamina');
const isResting = blackboard.getValue('isResting');
if (hasOre || isLowStamina) { if (hasOre || isLowStamina || isResting) {
return 'failure'; return 'failure';
} }
// 找到最近的金矿
const gameManager = this.node.parent?.getComponent('SimpleMinerDemo'); const gameManager = this.node.parent?.getComponent('SimpleMinerDemo');
const goldMines = (gameManager as any)?.getAllGoldMines(); const goldMines = (gameManager as any)?.getAllGoldMines();
if (!goldMines?.length) return 'failure'; if (!goldMines?.length) return 'failure';
// 简单找最近的矿
let nearestMine = goldMines[0]; let nearestMine = goldMines[0];
let minDistance = Vec3.distance(this.node.worldPosition, nearestMine.worldPosition); let minDistance = Vec3.distance(this.node.worldPosition, nearestMine.worldPosition);
@@ -383,29 +324,24 @@ export class BehaviorTreeComponent extends Component {
} }
if (minDistance > 2.0) { if (minDistance > 2.0) {
// 还没到金矿,继续移动
this.moveToPosition(nearestMine.worldPosition, 2.0); this.moveToPosition(nearestMine.worldPosition, 2.0);
return 'running'; return 'running';
} else { } else {
// 到了金矿,开始挖掘流程
const actionKey = 'mine-gold-ore'; const actionKey = 'mine-gold-ore';
const currentTime = Date.now(); const currentTime = Date.now();
// 初始化挖掘状态
if (!this.actionStates.has(actionKey)) { if (!this.actionStates.has(actionKey)) {
this.actionStates.set(actionKey, { this.actionStates.set(actionKey, {
isExecuting: true, isExecuting: true,
startTime: currentTime, startTime: currentTime,
duration: 3000 // 3秒挖掘时间 duration: 3000
}); });
return 'running'; return 'running';
} }
const actionState = this.actionStates.get(actionKey)!; const actionState = this.actionStates.get(actionKey)!;
const elapsed = currentTime - actionState.startTime; const elapsed = currentTime - actionState.startTime;
// 挖掘完成
if (elapsed >= actionState.duration) { if (elapsed >= actionState.duration) {
const currentStamina = blackboard.getValue('stamina'); const currentStamina = blackboard.getValue('stamina');
const newStamina = Math.max(0, currentStamina - 15); const newStamina = Math.max(0, currentStamina - 15);
@@ -415,19 +351,14 @@ export class BehaviorTreeComponent extends Component {
blackboard.setValue('hasOre', true); blackboard.setValue('hasOre', true);
blackboard.setValue('isLowStamina', newStamina < 20); blackboard.setValue('isLowStamina', newStamina < 20);
this.actionStates.delete(actionKey); this.actionStates.delete(actionKey);
return 'failure'; // 让选择器重新评估条件 return 'failure';
} }
return 'running'; return 'running';
} }
} }
/**
* 存储矿石 - 优化版本,需要时间存储
*/
private handleStoreOre(context: any, params: any): ActionResult { private handleStoreOre(context: any, params: any): ActionResult {
const blackboard = this.blackboard; const blackboard = this.blackboard;
if (!blackboard) return 'failure'; if (!blackboard) return 'failure';
@@ -437,11 +368,12 @@ export class BehaviorTreeComponent extends Component {
return 'failure'; return 'failure';
} }
// 清理其他动作状态 const isLowStamina = blackboard.getValue('isLowStamina');
this.clearActionState('mine-gold-ore'); if (isLowStamina) {
this.clearActionState('recover-stamina'); return 'failure';
}
// 找到仓库并移动过去 this.clearActionState('mine-gold-ore');
const gameManager = this.node.parent?.getComponent('SimpleMinerDemo'); const gameManager = this.node.parent?.getComponent('SimpleMinerDemo');
const warehouse = (gameManager as any)?.getWarehouse(); const warehouse = (gameManager as any)?.getWarehouse();
if (!warehouse) return 'failure'; if (!warehouse) return 'failure';
@@ -449,35 +381,27 @@ export class BehaviorTreeComponent extends Component {
const distance = Vec3.distance(this.node.worldPosition, warehouse.worldPosition); const distance = Vec3.distance(this.node.worldPosition, warehouse.worldPosition);
if (distance > 2.0) { if (distance > 2.0) {
// 还没到仓库,继续移动
this.moveToPosition(warehouse.worldPosition, 2.0); this.moveToPosition(warehouse.worldPosition, 2.0);
return 'running'; return 'running';
} else { } else {
// 到了仓库,开始存储流程
const actionKey = 'store-ore'; const actionKey = 'store-ore';
const currentTime = Date.now(); const currentTime = Date.now();
// 初始化存储状态
if (!this.actionStates.has(actionKey)) { if (!this.actionStates.has(actionKey)) {
this.actionStates.set(actionKey, { this.actionStates.set(actionKey, {
isExecuting: true, isExecuting: true,
startTime: currentTime, startTime: currentTime,
duration: 1500 // 1.5秒存储时间 duration: 1500
}); });
return 'running'; return 'running';
} }
const actionState = this.actionStates.get(actionKey)!; const actionState = this.actionStates.get(actionKey)!;
const elapsed = currentTime - actionState.startTime; const elapsed = currentTime - actionState.startTime;
// 存储完成
if (elapsed >= actionState.duration) { if (elapsed >= actionState.duration) {
blackboard.setValue('hasOre', false); blackboard.setValue('hasOre', false);
(gameManager as any).mineGoldOre(this.node); (gameManager as any).mineGoldOre(this.node);
this.actionStates.delete(actionKey); this.actionStates.delete(actionKey);
return 'success'; return 'success';
} }
@@ -486,44 +410,25 @@ export class BehaviorTreeComponent extends Component {
} }
} }
/**
* 默认待机行为
*/
private handleIdleBehavior(context: any, params: any): ActionResult { private handleIdleBehavior(context: any, params: any): ActionResult {
return 'success'; return 'success';
} }
// ==================== 辅助方法 ====================
private moveToPosition(targetPos: Vec3, duration: number) { private moveToPosition(targetPos: Vec3, duration: number) {
tween(this.node).stop(); // 停止之前的移动 tween(this.node).stop();
tween(this.node).to(duration, { worldPosition: targetPos }).start(); tween(this.node).to(duration, { worldPosition: targetPos }).start();
} }
/**
* 更新行为树 - 简化版本
*/
update(deltaTime: number) { update(deltaTime: number) {
// 简单执行行为树
if (this.behaviorTree && this.isRunning) { if (this.behaviorTree && this.isRunning) {
this.behaviorTree.tick(deltaTime); this.behaviorTree.tick(deltaTime);
} }
// 更新UI显示
if (this.showStatusUI) { if (this.showStatusUI) {
this.updateStatusUI(); this.updateStatusUI();
} }
} }
/**
* 设置更新频率 - 已废弃,现在每帧执行
*/
setTickInterval(interval: number) {
// 方法保留以保持兼容性,但不再有实际作用
console.warn(`[${this.node.name}] setTickInterval已废弃行为树现在每帧执行`);
}
/** /**
* 获取黑板 * 获取黑板
*/ */

View File

@@ -31,13 +31,7 @@ export class MinerStatusUI extends Component {
this.camera = find('Main Camera')?.getComponent(Camera) || director.getScene()?.getComponentInChildren(Camera); this.camera = find('Main Camera')?.getComponent(Camera) || director.getScene()?.getComponentInChildren(Camera);
this.canvas = find('Canvas')?.getComponent(Canvas) || director.getScene()?.getComponentInChildren(Canvas); 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) { if (this.nameLabel && this.followTarget) {
this.nameLabel.string = this.followTarget.name; this.nameLabel.string = this.followTarget.name;
@@ -58,20 +52,17 @@ export class MinerStatusUI extends Component {
if (!this.followTarget || !this.camera || !this.canvas) return; if (!this.followTarget || !this.camera || !this.canvas) return;
const targetWorldPos = this.followTarget.worldPosition.clone(); const targetWorldPos = this.followTarget.worldPosition.clone();
targetWorldPos.y += this.yOffset / 100; // 根据目标类型设置不同的Y偏移
if (this.followTarget.name.includes('Warehouse')) {
const screenPos = this.camera.worldToScreen(targetWorldPos); targetWorldPos.y += 3.0; // 仓库偏移更高
} else {
const canvasTransform = this.canvas.node.getComponent(UITransform); targetWorldPos.y += 2.0; // 矿工偏移
if (canvasTransform) {
const canvasPos = new Vec3(
screenPos.x - canvasTransform.width / 2,
screenPos.y - canvasTransform.height / 2,
0
);
this.node.setPosition(canvasPos);
} }
// 将世界坐标直接转换为UI坐标
const uiPos = new Vec3();
this.camera.convertToUINode(targetWorldPos, this.canvas.node, uiPos);
this.node.setPosition(uiPos);
} }
setFollowTarget(target: Node) { setFollowTarget(target: Node) {

View File

@@ -16,13 +16,9 @@ export class StatusUIManager extends Component {
static createStatusUIForMiner(miner: Node): MinerStatusUI | null { static createStatusUIForMiner(miner: Node): MinerStatusUI | null {
const canvas = find('Canvas') || director.getScene()?.getChildByName('Canvas'); const canvas = find('Canvas') || director.getScene()?.getChildByName('Canvas');
if (!canvas) { if (!canvas) {
console.error('[StatusUIManager] 未找到Canvas');
return null; return null;
} }
const minerIndex = this.extractMinerIndex(miner.name);
const yOffset = minerIndex * 20;
const uiRoot = new Node(`${miner.name}_StatusUI`); const uiRoot = new Node(`${miner.name}_StatusUI`);
canvas.addChild(uiRoot); canvas.addChild(uiRoot);
@@ -60,7 +56,6 @@ export class StatusUIManager extends Component {
const statusUI = uiRoot.addComponent(MinerStatusUI); const statusUI = uiRoot.addComponent(MinerStatusUI);
statusUI.setFollowTarget(miner); statusUI.setFollowTarget(miner);
statusUI.yOffset = 100 + yOffset;
const nameNode = new Node('NameLabel'); const nameNode = new Node('NameLabel');
uiRoot.addChild(nameNode); uiRoot.addChild(nameNode);
@@ -238,7 +233,6 @@ export class StatusUIManager extends Component {
static createWarehouseUI(warehouse: Node): MinerStatusUI | null { static createWarehouseUI(warehouse: Node): MinerStatusUI | null {
const canvas = find('Canvas') || director.getScene()?.getChildByName('Canvas'); const canvas = find('Canvas') || director.getScene()?.getChildByName('Canvas');
if (!canvas) { if (!canvas) {
console.error('[StatusUIManager] 未找到Canvas');
return null; return null;
} }
@@ -273,7 +267,6 @@ export class StatusUIManager extends Component {
const statusUI = uiRoot.addComponent(MinerStatusUI); const statusUI = uiRoot.addComponent(MinerStatusUI);
statusUI.setFollowTarget(warehouse); statusUI.setFollowTarget(warehouse);
statusUI.yOffset = 150;
statusUI.nameLabel = null; statusUI.nameLabel = null;
statusUI.statusLabel = null; statusUI.statusLabel = null;

View File

@@ -6,14 +6,15 @@
"": { "": {
"name": "cocos-ecs", "name": "cocos-ecs",
"dependencies": { "dependencies": {
"@esengine/ai": "^2.0.13", "@esengine/ai": "^2.0.14",
"@esengine/ecs-framework": "^2.1.22" "@esengine/ecs-framework": "^2.1.22"
} }
}, },
"node_modules/@esengine/ai": { "node_modules/@esengine/ai": {
"version": "2.0.13", "version": "2.0.14",
"resolved": "https://registry.npmjs.org/@esengine/ai/-/ai-2.0.13.tgz", "resolved": "https://registry.npmjs.org/@esengine/ai/-/ai-2.0.14.tgz",
"integrity": "sha512-Iwbdw7UPVEARph/zvq6XL5XIkku3TmdFk/XHxT5aU2Y3RvPNnpd4OwDaranIpjuBL4WkquZx4C/Mw7jh4FNwFg==", "integrity": "sha512-pRv2pAq79l+VcPPHNE7RaYJ9kYvYfZR2beuCyMH6ZgjgDolKYftCd/3KQAJ1LN9fOKvXAQSsa5PHi21ekXuEWg==",
"license": "MIT",
"dependencies": { "dependencies": {
"@esengine/ecs-framework": "^2.1.20" "@esengine/ecs-framework": "^2.1.20"
}, },

View File

@@ -6,6 +6,6 @@
}, },
"dependencies": { "dependencies": {
"@esengine/ecs-framework": "^2.1.22", "@esengine/ecs-framework": "^2.1.22",
"@esengine/ai": "^2.0.13" "@esengine/ai": "^2.0.14"
} }
} }