diff --git a/docs/beginner-tutorials.md b/docs/beginner-tutorials.md index b9636ed4..fa6efab7 100644 Binary files a/docs/beginner-tutorials.md and b/docs/beginner-tutorials.md differ diff --git a/docs/system-guide.md b/docs/system-guide.md index a333c399..9c566d6c 100644 --- a/docs/system-guide.md +++ b/docs/system-guide.md @@ -133,7 +133,65 @@ class GameLogicSystem extends ProcessingSystem { const gameTime = Time.totalTime; console.log(`游戏时间: ${gameTime.toFixed(1)}秒`); } + + private triggerVictory() { + console.log("游戏胜利!"); + // 处理胜利逻辑 + } + + private triggerGameOver() { + console.log("游戏结束!"); + // 处理游戏结束逻辑 + } } +``` + +**适用场景:** +- 全局游戏逻辑系统 +- 胜负判断系统 +- UI更新系统 +- 不依赖特定实体的处理 + +## AI系统示例 + +下面是一个完整的AI系统示例,展示EntitySystem的典型用法: + +```typescript +import { EntitySystem, Matcher, Entity } from '@esengine/ecs-framework'; + +enum AIState { + IDLE, + PATROL, + CHASE, + ATTACK +} + +class AISystem extends EntitySystem { + constructor() { + // 匹配所有有AI组件和位置组件的实体 + super(Matcher.empty().all(AIComponent, PositionComponent)); + } + + // 处理每个匹配的实体 + public processEntity(entity: Entity) { + const ai = entity.getComponent(AIComponent); + const position = entity.getComponent(PositionComponent); + + switch (ai.state) { + case AIState.IDLE: + this.processIdle(entity, ai); + break; + case AIState.PATROL: + this.processPatrol(entity, ai, position); + break; + case AIState.CHASE: + this.processChase(entity, ai, position); + break; + case AIState.ATTACK: + this.processAttack(entity, ai); + break; + } + } private processIdle(entity: Entity, ai: AIComponent) { ai.idleTimer += Time.deltaTime; diff --git a/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeExampleUsage.ts b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeExampleUsage.ts new file mode 100644 index 00000000..a40ec6c9 --- /dev/null +++ b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeExampleUsage.ts @@ -0,0 +1,293 @@ +import { _decorator, Component, Node, Label } from 'cc'; +import { + BehaviorTreeBuilder, + BehaviorTree, + Blackboard +} from '@esengine/ai'; + +const { ccclass, property } = _decorator; + +/** + * 行为树示例用法 + * 展示如何在Cocos Creator中加载并执行行为树 + */ +@ccclass('BehaviorTreeExampleUsage') +export class BehaviorTreeExampleUsage extends Component { + + @property(Label) + statusLabel: Label = null; + + @property(Label) + logLabel: Label = null; + + private behaviorTree: BehaviorTree = null; + private blackboard: Blackboard = null; + private isRunning: boolean = false; + private logs: string[] = []; + private executionContext: any = null; + + onLoad() { + this.setupBehaviorTree(); + } + + private setupBehaviorTree() { + try { + // 行为树配置(通常从JSON文件加载) + const behaviorTreeConfig = { + "nodes": [ + { + "id": "root_1", + "type": "root", + "name": "AI智能体行为树", + "children": ["selector_main"] + }, + { + "id": "selector_main", + "type": "selector", + "name": "主选择器", + "properties": { + "abortType": "LowerPriority" + }, + "children": ["sequence_combat", "sequence_patrol", "sequence_idle"] + }, + { + "id": "sequence_combat", + "type": "sequence", + "name": "战斗序列", + "children": ["condition_enemy", "action_attack"] + }, + { + "id": "condition_enemy", + "type": "condition-random", + "name": "发现敌人", + "properties": { + "successProbability": 0.3 + } + }, + { + "id": "action_attack", + "type": "log-action", + "name": "攻击敌人", + "properties": { + "message": "发动攻击!当前生命值: {{health}}, 能量: {{energy}}", + "logLevel": "warn" + } + }, + { + "id": "sequence_patrol", + "type": "sequence", + "name": "巡逻序列", + "children": ["action_move", "wait_patrol"] + }, + { + "id": "action_move", + "type": "set-blackboard-value", + "name": "移动巡逻", + "properties": { + "variableName": "lastAction", + "value": "巡逻中" + } + }, + { + "id": "wait_patrol", + "type": "wait-action", + "name": "巡逻等待", + "properties": { + "waitTime": 2 + } + }, + { + "id": "sequence_idle", + "type": "sequence", + "name": "闲置序列", + "children": ["action_idle", "wait_idle"] + }, + { + "id": "action_idle", + "type": "log-action", + "name": "闲置状态", + "properties": { + "message": "当前状态: 闲置中,生命值: {{health}}" + } + }, + { + "id": "wait_idle", + "type": "wait-action", + "name": "闲置等待", + "properties": { + "waitTime": 1 + } + } + ], + "blackboard": [ + { + "name": "health", + "type": "number", + "value": 100, + "description": "角色生命值" + }, + { + "name": "energy", + "type": "number", + "value": 80, + "description": "角色能量值" + }, + { + "name": "lastAction", + "type": "string", + "value": "待机", + "description": "最后执行的动作" + }, + { + "name": "enemyDetected", + "type": "boolean", + "value": false, + "description": "是否检测到敌人" + } + ] + }; + + // 创建执行上下文 + this.executionContext = { + node: this.node, + component: this, + // 添加日志方法供行为树节点使用 + log: (message: string, level: string = 'info') => { + this.addLog(`🤖 [${level.toUpperCase()}] ${message}`); + } + }; + + // 🎯 使用 @esengine/ai 的 BehaviorTreeBuilder API - 一行代码完成所有初始化! + const result = BehaviorTreeBuilder.fromBehaviorTreeConfig(behaviorTreeConfig, this.executionContext); + + this.behaviorTree = result.tree; + this.blackboard = result.blackboard; + this.executionContext = result.context; + + this.updateStatus('行为树加载完成'); + this.addLog('✅ 行为树初始化成功'); + this.addLog(`📊 节点总数: ${behaviorTreeConfig.nodes.length}`); + this.addLog(`📋 变量总数: ${behaviorTreeConfig.blackboard.length}`); + + // 自动开始执行 + this.startBehaviorTree(); + + } catch (error) { + console.error('行为树设置失败:', error); + this.updateStatus('设置失败: ' + error.message); + this.addLog('❌ 行为树设置失败: ' + error.message); + } + } + + private startBehaviorTree() { + this.isRunning = true; + this.behaviorTree.reset(); + this.updateStatus('执行中...'); + this.addLog('🚀 开始执行行为树'); + } + + private stopBehaviorTree() { + this.isRunning = false; + this.updateStatus('已停止'); + this.addLog('⏹️ 行为树执行已停止'); + + if (this.behaviorTree) { + this.behaviorTree.reset(); + } + } + + update(deltaTime: number) { + if (!this.isRunning || !this.behaviorTree) { + return; + } + + try { + // 每帧执行行为树 + this.behaviorTree.tick(deltaTime); + + } catch (error) { + console.error('行为树执行出错:', error); + this.addLog('❌ 执行出错: ' + error.message); + this.stopBehaviorTree(); + } + } + + private updateStatus(status: string) { + if (this.statusLabel) { + this.statusLabel.string = status; + } + console.log('[BehaviorTree] 状态:', status); + } + + private addLog(message: string) { + this.logs.push(`[${new Date().toLocaleTimeString()}] ${message}`); + + // 只保留最新的20条日志 + if (this.logs.length > 20) { + this.logs.shift(); + } + + if (this.logLabel) { + this.logLabel.string = this.logs.join('\n'); + } + + console.log('[BehaviorTree]', message); + } + + // 手动控制方法(可以绑定到UI按钮) + onStartButtonClick() { + if (!this.isRunning) { + this.startBehaviorTree(); + } + } + + onStopButtonClick() { + if (this.isRunning) { + this.stopBehaviorTree(); + } + } + + // 修改黑板变量的示例方法 + onModifyHealthClick() { + if (this.blackboard) { + const currentHealth = this.blackboard.getValue('health', 100); + const newHealth = Math.max(0, currentHealth - 10); + this.blackboard.setValue('health', newHealth); + this.addLog(`🩺 生命值变更: ${currentHealth} -> ${newHealth}`); + } + } + + onModifyEnergyClick() { + if (this.blackboard) { + const currentEnergy = this.blackboard.getValue('energy', 80); + const newEnergy = Math.max(0, currentEnergy - 5); + this.blackboard.setValue('energy', newEnergy); + this.addLog(`⚡ 能量变更: ${currentEnergy} -> ${newEnergy}`); + } + } + + onDestroy() { + this.stopBehaviorTree(); + } +} + +/** + * 使用说明: + * + * 1. 安装依赖: + * npm install @esengine/ai + * + * 2. 将此脚本挂载到场景中的节点上 + * + * 3. 在属性检查器中设置: + * - statusLabel: 用于显示当前状态的Label组件 + * - logLabel: 用于显示日志信息的Label组件 + * + * 4. 运行场景,观察行为树的执行效果 + * + * 5. 可以添加按钮并绑定控制方法: + * - onStartButtonClick(): 开始执行 + * - onStopButtonClick(): 停止执行 + * - onModifyHealthClick(): 修改生命值 + * - onModifyEnergyClick(): 修改能量值 + */ diff --git a/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeExampleUsage.ts.meta b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeExampleUsage.ts.meta new file mode 100644 index 00000000..449a8108 --- /dev/null +++ b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeExampleUsage.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "9013db83-08a6-4613-8911-016bfdd65239", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeGuideUsage.ts b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeGuideUsage.ts new file mode 100644 index 00000000..69e3692d --- /dev/null +++ b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeGuideUsage.ts @@ -0,0 +1,314 @@ +import { _decorator, Component, Node, Label, Button } from 'cc'; +import { + BehaviorTreeBuilder, + BehaviorTree, + Blackboard, + BehaviorTreeJSONConfig +} from '@esengine/ai'; + +const { ccclass, property } = _decorator; + +/** + * 完整行为树指南使用示例 + * + * 此示例展示了高级行为树特性: + * 1. 条件装饰器 (Conditional Decorator) + * 2. 重复器 (Repeater) + * 3. 反转器 (Inverter) + * 4. 黑板变量引用 {{variable}} + * 5. 复杂的组合行为逻辑 + * 6. 自定义条件和动作 + * + * 包含三种行为模式: + * - 巡逻模式:重复执行巡逻序列 + * - 战斗模式:检测敌人并攻击/防御 + * - 闲置模式:状态报告和等待 + */ +@ccclass('BehaviorTreeGuideUsage') +export class BehaviorTreeGuideUsage extends Component { + + @property(Label) + statusLabel: Label = null; + + @property(Label) + logLabel: Label = null; + + @property(Button) + controlButton: Button = null; + + @property(Button) + switchStateButton: Button = null; + + private behaviorTree: BehaviorTree = null; + private blackboard: Blackboard = null; + private isRunning: boolean = false; + private logs: string[] = []; + private currentStateIndex: number = 0; + private states = ['patrol', 'combat', 'idle']; + + onLoad() { + this.setupUI(); + this.initializeBehaviorTree(); + } + + private setupUI() { + if (this.controlButton) { + this.controlButton.node.on('click', this.toggleExecution, this); + } + if (this.switchStateButton) { + this.switchStateButton.node.on('click', this.switchState, this); + } + + this.updateStatus('初始化完整行为树指南...'); + this.addLog('🎓 行为树指南示例已加载'); + } + + private initializeBehaviorTree() { + try { + // 这里应该从JSON文件加载完整的行为树配置 + // 为了演示,我们使用简化版本 + const config: BehaviorTreeJSONConfig = { + nodes: [ + { + id: "root_1", + type: "root", + name: "行为树指南根", + children: ["selector_main"] + }, + { + id: "selector_main", + type: "selector", + name: "主选择器", + properties: { abortType: "LowerPriority" }, + children: ["sequence_combat", "sequence_patrol", "sequence_idle"] + }, + { + id: "sequence_combat", + type: "sequence", + name: "战斗序列", + children: ["condition_enemy", "action_attack"] + }, + { + id: "condition_enemy", + type: "condition-random", + name: "随机敌人出现", + properties: { successProbability: 0.3 } + }, + { + id: "action_attack", + type: "log-action", + name: "攻击动作", + properties: { + message: "发动攻击!生命值: {{health}}, 能量: {{energy}}", + logLevel: "warn" + } + }, + { + id: "sequence_patrol", + type: "sequence", + name: "巡逻序列", + children: ["action_patrol", "wait_patrol"] + }, + { + id: "action_patrol", + type: "set-blackboard-value", + name: "执行巡逻", + properties: { + variableName: "lastAction", + value: "{{state}}_执行中" + } + }, + { + id: "wait_patrol", + type: "wait-action", + name: "巡逻等待", + properties: { waitTime: 1 } + }, + { + id: "sequence_idle", + type: "sequence", + name: "闲置序列", + children: ["action_idle", "wait_idle"] + }, + { + id: "action_idle", + type: "log-action", + name: "状态报告", + properties: { + message: "状态报告 - 当前: {{state}}, 上次动作: {{lastAction}}" + } + }, + { + id: "wait_idle", + type: "wait-action", + name: "闲置等待", + properties: { waitTime: 2 } + } + ], + blackboard: [ + { + name: "state", + type: "string", + value: "patrol", + description: "当前状态" + }, + { + name: "lastAction", + type: "string", + value: "", + description: "最后执行的动作" + }, + { + name: "health", + type: "number", + value: 100, + description: "生命值" + }, + { + name: "energy", + type: "number", + value: 50, + description: "能量值" + } + ] + }; + + // 创建执行上下文 + const executionContext = { + node: this.node, + component: this, + log: (message: string, level: string = 'info') => { + this.addLog(`🤖 [${level.toUpperCase()}] ${message}`); + } + }; + + // 🎯 使用 BehaviorTreeBuilder 一键创建 + const result = BehaviorTreeBuilder.fromBehaviorTreeConfig(config, executionContext); + + this.behaviorTree = result.tree; + this.blackboard = result.blackboard; + + this.updateStatus('完整行为树指南已准备就绪'); + this.addLog('✅ 行为树创建成功(高级特性版本)'); + this.addLog(`📊 包含 ${config.nodes.length} 个节点`); + this.addLog(`📋 包含 ${config.blackboard.length} 个黑板变量`); + + // 显示初始状态 + this.logBlackboardStatus(); + + } catch (error) { + console.error('初始化行为树失败:', error); + this.updateStatus('初始化失败: ' + error.message); + this.addLog('❌ 行为树初始化失败: ' + error.message); + } + } + + private toggleExecution() { + if (!this.behaviorTree) { + this.addLog('❌ 行为树未准备好'); + return; + } + + this.isRunning = !this.isRunning; + + if (this.isRunning) { + this.behaviorTree.reset(); + this.updateStatus('执行中...'); + this.addLog('🚀 开始执行完整行为树指南'); + if (this.controlButton) { + this.controlButton.getComponentInChildren(Label).string = '停止'; + } + } else { + this.updateStatus('已停止'); + this.addLog('⏹️ 行为树执行已停止'); + if (this.controlButton) { + this.controlButton.getComponentInChildren(Label).string = '开始'; + } + } + } + + private switchState() { + if (!this.blackboard) return; + + this.currentStateIndex = (this.currentStateIndex + 1) % this.states.length; + const newState = this.states[this.currentStateIndex]; + + this.blackboard.setValue('state', newState); + this.addLog(`🔄 切换状态到: ${newState}`); + this.logBlackboardStatus(); + } + + update(deltaTime: number) { + if (!this.isRunning || !this.behaviorTree) return; + + try { + this.behaviorTree.tick(deltaTime); + } catch (error) { + console.error('行为树执行出错:', error); + this.addLog('❌ 执行出错: ' + error.message); + this.isRunning = false; + } + } + + private logBlackboardStatus() { + if (!this.blackboard) return; + + const variables = ['state', 'lastAction', 'health', 'energy']; + const status = variables.map(name => { + const value = this.blackboard.getValue(name, 'undefined'); + return `${name}:${value}`; + }).join(', '); + + this.addLog(`📊 黑板状态: ${status}`); + } + + private updateStatus(status: string) { + if (this.statusLabel) { + this.statusLabel.string = status; + } + } + + private addLog(message: string) { + this.logs.push(`[${new Date().toLocaleTimeString()}] ${message}`); + + // 只保留最新的20条日志 + if (this.logs.length > 20) { + this.logs.shift(); + } + + if (this.logLabel) { + this.logLabel.string = this.logs.join('\n'); + } + + console.log('[BehaviorTreeGuide]', message); + } + + onDestroy() { + this.isRunning = false; + } +} + +/* + * 完整指南特色功能说明: + * + * 1. 高级节点类型: + * - Repeater: 无限重复巡逻行为 + * - Conditional Decorator: 带条件的装饰器 + * - Inverter: 反转子节点结果 + * + * 2. 黑板变量引用: + * - {{state}}: 动态引用当前状态 + * - {{health}}: 显示生命值 + * - {{lastAction}}: 跟踪最后动作 + * + * 3. 复杂行为逻辑: + * - 巡逻:重复执行,状态检查 + * - 战斗:敌人检测,攻击防御 + * - 闲置:状态报告,定时等待 + * + * 4. 交互功能: + * - 状态切换按钮 + * - 开始/停止控制 + * - 实时日志显示 + * - 黑板变量监控 + */ diff --git a/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeGuideUsage.ts.meta b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeGuideUsage.ts.meta new file mode 100644 index 00000000..cbd8d868 --- /dev/null +++ b/extensions/cocos/cocos-ecs/assets/resources/BehaviorTreeGuideUsage.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "0403f4d3-2985-4452-928e-d0535cea8155", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/extensions/cocos/cocos-ecs/assets/resources/behavior-tree-examples-guide.bt.json b/extensions/cocos/cocos-ecs/assets/resources/behavior-tree-examples-guide.bt.json index 9ce2e53a..9e83d1a8 100644 --- a/extensions/cocos/cocos-ecs/assets/resources/behavior-tree-examples-guide.bt.json +++ b/extensions/cocos/cocos-ecs/assets/resources/behavior-tree-examples-guide.bt.json @@ -620,132 +620,132 @@ "id": "root_1-selector_main", "sourceId": "root_1", "targetId": "selector_main", - "path": "M 1349.21875 128 C 1349.21875 158 1359.21875 152 1359.21875 182", + "path": "M 1350.000006198883 125.66623544692993 C 1350.000006198883 155.66623544692993 1360.000006198883 155.04567861557007 1360.000006198883 185.04567861557007", "active": false }, { "id": "selector_main-repeater_patrol", "sourceId": "selector_main", "targetId": "repeater_patrol", - "path": "M 1359.21875 278 C 1359.21875 320 590 320 590 362", + "path": "M 1360.000006198883 274.9542908668518 C 1360.000006198883 320.00000619888306 590.000006198883 320.00000619888306 590.000006198883 365.0457215309143", "active": false }, { "id": "selector_main-selector_combat", "sourceId": "selector_main", "targetId": "selector_combat", - "path": "M 1359.21875 278 C 1359.21875 320 1250 320 1250 362", + "path": "M 1360.000006198883 274.9542908668518 C 1360.000006198883 320.00000619888306 1250.000006198883 320.00000619888306 1250.000006198883 365.0457215309143", "active": false }, { "id": "selector_main-sequence_idle", "sourceId": "selector_main", "targetId": "sequence_idle", - "path": "M 1359.21875 278 C 1359.21875 320 2019.21875 320 2019.21875 362", + "path": "M 1360.000006198883 274.9542908668518 C 1360.000006198883 320.00000619888306 2020.0001282691956 320.00000619888306 2020.0001282691956 365.0457215309143", "active": false }, { "id": "repeater_patrol-sequence_patrol", "sourceId": "repeater_patrol", "targetId": "sequence_patrol", - "path": "M 590 458 C 590 520 590 520 590 582", + "path": "M 590.000006198883 454.9542908668518 C 590.000006198883 519.9999756813049 590.000006198883 519.9999756813049 590.000006198883 585.045660495758", "active": false }, { "id": "sequence_patrol-decorator_patrol_check", "sourceId": "sequence_patrol", "targetId": "decorator_patrol_check", - "path": "M 590 678 C 590 720 510 720 510 762", + "path": "M 590.000006198883 674.9542908668518 C 590.000006198883 721.4701294898987 510.00000619888306 721.4701294898987 510.00000619888306 767.9859681129456", "active": false }, { "id": "sequence_patrol-action_patrol", "sourceId": "sequence_patrol", "targetId": "action_patrol", - "path": "M 590 678 C 590 720 700 720 700 762", + "path": "M 590.000006198883 674.9542908668518 C 590.000006198883 720.0783143043518 700.000006198883 720.0783143043518 700.000006198883 765.2023377418518", "active": false }, { "id": "decorator_patrol_check-log_patrolling", "sourceId": "decorator_patrol_check", "targetId": "log_patrolling", - "path": "M 510 942.078125 C 510 972.078125 480 972 480 1002", + "path": "M 510.00000619888306 934.6140809059143 C 510.00000619888306 969.908209323883 480.00000619888306 969.908209323883 480.00000619888306 1005.2023377418518", "active": false }, { "id": "selector_combat-sequence_attack", "sourceId": "selector_combat", "targetId": "sequence_attack", - "path": "M 1250 458 C 1250 500 1030 500 1030 542", + "path": "M 1250.000006198883 454.9542908668518 C 1250.000006198883 499.99997568130493 1030.000006198883 499.99997568130493 1030.000006198883 545.045660495758", "active": false }, { "id": "selector_combat-sequence_defend", "sourceId": "selector_combat", "targetId": "sequence_defend", - "path": "M 1250 458 C 1250 500 1470 500 1470 542", + "path": "M 1250.000006198883 454.9542908668518 C 1250.000006198883 499.99997568130493 1470.000006198883 499.99997568130493 1470.000006198883 545.045660495758", "active": false }, { "id": "sequence_attack-inverter_enemy", "sourceId": "sequence_attack", "targetId": "inverter_enemy", - "path": "M 1030 638 C 1030 680 920 680 920 722", + "path": "M 1030.000006198883 634.9542908668518 C 1030.000006198883 679.644049167633 920.000006198883 679.644049167633 920.000006198883 724.3338074684143", "active": false }, { "id": "sequence_attack-action_attack", "sourceId": "sequence_attack", "targetId": "action_attack", - "path": "M 1030 638 C 1030 680 1140 680 1140 722", + "path": "M 1030.000006198883 634.9542908668518 C 1030.000006198883 680.0783143043518 1140.000006198883 680.0783143043518 1140.000006198883 725.2023377418518", "active": false }, { "id": "inverter_enemy-condition_enemy", "sourceId": "inverter_enemy", "targetId": "condition_enemy", - "path": "M 920 798 C 920 840 920 840 920 882", + "path": "M 920.000006198883 795.6662049293518 C 920.000006198883 840.355963230133 920.000006198883 840.355963230133 920.000006198883 885.0457215309143", "active": false }, { "id": "sequence_defend-wait_defend", "sourceId": "sequence_defend", "targetId": "wait_defend", - "path": "M 1470 638 C 1470 680 1360 680 1360 722", + "path": "M 1470.000006198883 634.9542908668518 C 1470.000006198883 680.000006198883 1360.000006198883 680.000006198883 1360.000006198883 725.0457215309143", "active": false }, { "id": "sequence_defend-action_defend", "sourceId": "sequence_defend", "targetId": "action_defend", - "path": "M 1470 638 C 1470 680 1580 680 1580 722", + "path": "M 1470.000006198883 634.9542908668518 C 1470.000006198883 680.0783143043518 1580.000006198883 680.0783143043518 1580.000006198883 725.2023377418518", "active": false }, { "id": "sequence_idle-action_idle", "sourceId": "sequence_idle", "targetId": "action_idle", - "path": "M 2019.21875 458 C 2019.21875 500 1800 500 1800 542", + "path": "M 2020.0001282691956 454.9542908668518 C 2020.0001282691956 500.0782837867737 1800.0001282691956 500.0782837867737 1800.0001282691956 545.2022767066956", "active": false }, { "id": "sequence_idle-log_status", "sourceId": "sequence_idle", "targetId": "log_status", - "path": "M 2019.21875 458 C 2019.21875 500 2019.21875 500 2019.21875 542", + "path": "M 2020.0001282691956 454.9542908668518 C 2020.0001282691956 500.0782837867737 2020.0001282691956 500.0782837867737 2020.0001282691956 545.2022767066956", "active": false }, { "id": "sequence_idle-wait_idle", "sourceId": "sequence_idle", "targetId": "wait_idle", - "path": "M 2019.21875 458 C 2019.21875 500 2238.4375 500 2238.4375 542", + "path": "M 2020.0001282691956 454.9542908668518 C 2020.0001282691956 499.99997568130493 2240.0001282691956 499.99997568130493 2240.0001282691956 545.045660495758", "active": false } ], "metadata": { - "name": "behavior-tree-examples-guide", - "created": "2025-06-19T04:28:44.589Z", + "name": "assets/resources/behavior-tree-examples-guide", + "created": "2025-06-22T11:04:28.781Z", "version": "1.0" }, "blackboard": [ diff --git a/extensions/cocos/cocos-ecs/assets/scenes/scene.scene b/extensions/cocos/cocos-ecs/assets/scenes/scene.scene index f041d20f..a51234ba 100644 --- a/extensions/cocos/cocos-ecs/assets/scenes/scene.scene +++ b/extensions/cocos/cocos-ecs/assets/scenes/scene.scene @@ -23,10 +23,10 @@ "__id__": 4 }, { - "__id__": 22 + "__id__": 46 }, { - "__id__": 8 + "__id__": 48 } ], "_active": true, @@ -61,7 +61,7 @@ }, "autoReleaseAssets": false, "_globals": { - "__id__": 24 + "__id__": 50 }, "_id": "ff354f0b-c2f5-4dea-8ffb-0152d175d11c" }, @@ -74,7 +74,7 @@ "__id__": 1 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 3 @@ -123,183 +123,6 @@ "debugMode": true, "_id": "40G/Xl9EBLJ7amO+29wrkO" }, - { - "__type__": "cc.Node", - "_name": "BehaviorTreeExample", - "_objFlags": 0, - "__editorExtras__": {}, - "_parent": { - "__id__": 1 - }, - "_children": [], - "_active": true, - "_components": [ - { - "__id__": 5 - } - ], - "_prefab": null, - "_lpos": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_lrot": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "_lscale": { - "__type__": "cc.Vec3", - "x": 1, - "y": 1, - "z": 1 - }, - "_mobility": 0, - "_layer": 1073741824, - "_euler": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_id": "a1gA7y2LZAaZqVDOYn5V84" - }, - { - "__type__": "3c3bfSF4atEpIdYZZTtxMV1", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 4 - }, - "_enabled": true, - "__prefab": null, - "statusLabel": { - "__id__": 6 - }, - "logLabel": null, - "startButton": { - "__id__": 17 - }, - "stopButton": null, - "pauseButton": null, - "resumeButton": null, - "_id": "2abWpbFNFJH54Je2kfxJ8H" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 7 - }, - "_enabled": true, - "__prefab": null, - "_customMaterial": null, - "_srcBlendFactor": 2, - "_dstBlendFactor": 4, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_string": "label", - "_horizontalAlign": 1, - "_verticalAlign": 1, - "_actualFontSize": 20, - "_fontSize": 20, - "_fontFamily": "Arial", - "_lineHeight": 40, - "_overflow": 0, - "_enableWrapText": true, - "_font": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_isItalic": false, - "_isBold": false, - "_isUnderline": false, - "_underlineHeight": 2, - "_cacheMode": 0, - "_enableOutline": false, - "_outlineColor": { - "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, - "a": 255 - }, - "_outlineWidth": 2, - "_enableShadow": false, - "_shadowColor": { - "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, - "a": 255 - }, - "_shadowOffset": { - "__type__": "cc.Vec2", - "x": 2, - "y": 2 - }, - "_shadowBlur": 2, - "_id": "d39qB9JpBMJZlrJcSOwqU7" - }, - { - "__type__": "cc.Node", - "_name": "Label", - "_objFlags": 0, - "__editorExtras__": {}, - "_parent": { - "__id__": 8 - }, - "_children": [], - "_active": true, - "_components": [ - { - "__id__": 21 - }, - { - "__id__": 6 - } - ], - "_prefab": null, - "_lpos": { - "__type__": "cc.Vec3", - "x": 11.984, - "y": 152.374, - "z": 0 - }, - "_lrot": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "_lscale": { - "__type__": "cc.Vec3", - "x": 1, - "y": 1, - "z": 1 - }, - "_mobility": 0, - "_layer": 33554432, - "_euler": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_id": "6fcMVYWRFA1r2GTN2+dzGO" - }, { "__type__": "cc.Node", "_name": "Canvas", @@ -310,25 +133,31 @@ }, "_children": [ { - "__id__": 9 - }, - { - "__id__": 11 + "__id__": 5 }, { "__id__": 7 + }, + { + "__id__": 14 + }, + { + "__id__": 17 + }, + { + "__id__": 36 } ], "_active": true, "_components": [ { - "__id__": 18 + "__id__": 43 }, { - "__id__": 19 + "__id__": 44 }, { - "__id__": 20 + "__id__": 45 } ], "_prefab": null, @@ -367,13 +196,13 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 8 + "__id__": 4 }, "_children": [], "_active": true, "_components": [ { - "__id__": 10 + "__id__": 6 } ], "_prefab": null, @@ -412,7 +241,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 9 + "__id__": 5 }, "_enabled": true, "__prefab": null, @@ -420,7 +249,7 @@ "_priority": 1073741824, "_fov": 45, "_fovAxis": 0, - "_orthoHeight": 382.803738317757, + "_orthoHeight": 360, "_near": 1, "_far": 2000, "_color": { @@ -458,30 +287,30 @@ "_objFlags": 0, "__editorExtras__": {}, "_parent": { - "__id__": 8 + "__id__": 4 }, "_children": [ { - "__id__": 12 + "__id__": 8 } ], "_active": true, "_components": [ { - "__id__": 15 + "__id__": 11 }, { - "__id__": 16 + "__id__": 12 }, { - "__id__": 17 + "__id__": 13 } ], "_prefab": null, "_lpos": { "__type__": "cc.Vec3", - "x": 6.097, - "y": -234.248, + "x": 546.376, + "y": -299.787, "z": 0 }, "_lrot": { @@ -513,16 +342,16 @@ "_objFlags": 512, "__editorExtras__": {}, "_parent": { - "__id__": 11 + "__id__": 7 }, "_children": [], "_active": true, "_components": [ { - "__id__": 13 + "__id__": 9 }, { - "__id__": 14 + "__id__": 10 } ], "_prefab": null, @@ -561,7 +390,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 12 + "__id__": 8 }, "_enabled": true, "__prefab": null, @@ -583,7 +412,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 12 + "__id__": 8 }, "_enabled": true, "__prefab": null, @@ -645,7 +474,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 11 + "__id__": 7 }, "_enabled": true, "__prefab": null, @@ -667,7 +496,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 11 + "__id__": 7 }, "_enabled": true, "__prefab": null, @@ -706,7 +535,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 11 + "__id__": 7 }, "_enabled": true, "__prefab": null, @@ -760,17 +589,1151 @@ "_duration": 0.1, "_zoomScale": 1.2, "_target": { - "__id__": 11 + "__id__": 7 }, "_id": "9dr8T1TidO3Juip5s15Rat" }, + { + "__type__": "cc.Node", + "_name": "Label", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 4 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 15 + }, + { + "__id__": 16 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -590.473, + "y": 298.997, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "6fcMVYWRFA1r2GTN2+dzGO" + }, { "__type__": "cc.UITransform", "_name": "", "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 8 + "__id__": 14 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 42.255859375, + "height": 50.4 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "a5oODrk9xKq5kr4g8/ClUH" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 14 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_string": "label", + "_horizontalAlign": 1, + "_verticalAlign": 1, + "_actualFontSize": 20, + "_fontSize": 20, + "_fontFamily": "Arial", + "_lineHeight": 40, + "_overflow": 0, + "_enableWrapText": true, + "_font": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_isItalic": false, + "_isBold": false, + "_isUnderline": false, + "_underlineHeight": 2, + "_cacheMode": 0, + "_enableOutline": false, + "_outlineColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_outlineWidth": 2, + "_enableShadow": false, + "_shadowColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_shadowOffset": { + "__type__": "cc.Vec2", + "x": 2, + "y": 2 + }, + "_shadowBlur": 2, + "_id": "d39qB9JpBMJZlrJcSOwqU7" + }, + { + "__type__": "cc.Node", + "_name": "ScrollView", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 4 + }, + "_children": [ + { + "__id__": 18 + }, + { + "__id__": 28 + } + ], + "_active": true, + "_components": [ + { + "__id__": 34 + }, + { + "__id__": 35 + }, + { + "__id__": 26 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 42.02249999999998, + "y": 14.198999999999984, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "b427z13SlL64N/EZ6kF6j+" + }, + { + "__type__": "cc.Node", + "_name": "scrollBar", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 19 + } + ], + "_active": true, + "_components": [ + { + "__id__": 22 + }, + { + "__id__": 23 + }, + { + "__id__": 24 + }, + { + "__id__": 25 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 319.7685, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "8cM/gTkrxPs7CfMwS5iHFp" + }, + { + "__type__": "cc.Node", + "_name": "bar", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 18 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 20 + }, + { + "__id__": 21 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -11, + "y": -31.25, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "07+d2vsPFMj4T375UDYADx" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 19 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 10, + "height": 156.25 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_id": "52JztzwItI/4kMAzhJlKFd" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 19 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 0 + }, + "_spriteFrame": { + "__uuid__": "afc47931-f066-46b0-90be-9fe61f213428@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 1, + "_fillType": 0, + "_sizeMode": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "a2oaG8yyRI8oMj0eCnwwab" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 18 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 12, + "height": 529.802 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 1, + "y": 0.5 + }, + "_id": "2448OGez9C/5fLRiVHZie7" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 18 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 0 + }, + "_spriteFrame": { + "__uuid__": "ffb88a8f-af62-48f4-8f1d-3cb606443a43@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 1, + "_fillType": 0, + "_sizeMode": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "b69T6whbJKsawWq4RHNH7o" + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 18 + }, + "_enabled": true, + "__prefab": null, + "_alignFlags": 37, + "_target": null, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_horizontalCenter": 0, + "_verticalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 0, + "_originalHeight": 250, + "_alignMode": 1, + "_lockFlags": 0, + "_id": "b2k5nauEtDhoHYj+vqT0eT" + }, + { + "__type__": "cc.ScrollBar", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 18 + }, + "_enabled": true, + "__prefab": null, + "_scrollView": { + "__id__": 26 + }, + "_handle": { + "__id__": 21 + }, + "_direction": 1, + "_enableAutoHide": false, + "_autoHideTime": 1, + "_id": "15kIKIzd5Bsa64b5oYweUX" + }, + { + "__type__": "cc.ScrollView", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 17 + }, + "_enabled": true, + "__prefab": null, + "bounceDuration": 0.23, + "brake": 0.75, + "elastic": true, + "inertia": true, + "horizontal": false, + "vertical": true, + "cancelInnerEvents": true, + "scrollEvents": [], + "_content": { + "__id__": 27 + }, + "_horizontalScrollBar": null, + "_verticalScrollBar": { + "__id__": 25 + }, + "_id": "43SzGwAuNCcZjvSod9bT5z" + }, + { + "__type__": "cc.Node", + "_name": "Label-001", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 32 + }, + { + "__id__": 33 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 14.993000000000052, + "y": 214.91400000000004, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "28SxhAmLhOLIi2RuFmznFf" + }, + { + "__type__": "cc.Node", + "_name": "view", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 27 + } + ], + "_active": true, + "_components": [ + { + "__id__": 29 + }, + { + "__id__": 30 + }, + { + "__id__": 31 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": -27.728500000000025, + "y": 1.9040000000000532, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "1eh4yj9hBE3p9LwaaZNufA" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 28 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 553.412, + "height": 496.192 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "a3RzBCr4tMPKP4q3YRWG0a" + }, + { + "__type__": "cc.Mask", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 28 + }, + "_enabled": true, + "__prefab": null, + "_type": 0, + "_inverted": false, + "_segments": 64, + "_alphaThreshold": 0.1, + "_id": "3fwtiszuRPTrzIQTBRfM6Q" + }, + { + "__type__": "cc.Graphics", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 28 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_lineWidth": 1, + "_strokeColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_lineJoin": 2, + "_lineCap": 0, + "_fillColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 0 + }, + "_miterLimit": 10, + "_id": "85Pjd63DRBiIUY3Z4deLBW" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 27 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 606.061859375, + "height": 50.4 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "b6MK9lkeRAQ6SbjIb89kcn" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 27 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_string": "label", + "_horizontalAlign": 1, + "_verticalAlign": 1, + "_actualFontSize": 20, + "_fontSize": 20, + "_fontFamily": "Arial", + "_lineHeight": 40, + "_overflow": 3, + "_enableWrapText": false, + "_font": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_isItalic": false, + "_isBold": false, + "_isUnderline": false, + "_underlineHeight": 2, + "_cacheMode": 0, + "_enableOutline": false, + "_outlineColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_outlineWidth": 2, + "_enableShadow": false, + "_shadowColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_shadowOffset": { + "__type__": "cc.Vec2", + "x": 2, + "y": 2 + }, + "_shadowBlur": 2, + "_id": "3ef1jFCdNDuowYkg/cvmcr" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 17 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 639.537, + "height": 529.802 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "9farwgvXFAr7HOWXv+Uzps" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 17 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_spriteFrame": { + "__uuid__": "b730527c-3233-41c2-aaf7-7cdab58f9749@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 1, + "_fillType": 0, + "_sizeMode": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "d17Y9iWRVAG6QW9lTGlyTU" + }, + { + "__type__": "cc.Node", + "_name": "Button-001", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 4 + }, + "_children": [ + { + "__id__": 37 + } + ], + "_active": true, + "_components": [ + { + "__id__": 40 + }, + { + "__id__": 41 + }, + { + "__id__": 42 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 431.262, + "y": -299.787, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "79sseUcuRON5SAT8VJe/Df" + }, + { + "__type__": "cc.Node", + "_name": "Label", + "_objFlags": 512, + "__editorExtras__": {}, + "_parent": { + "__id__": 36 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 38 + }, + { + "__id__": 39 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "01zvsgRnFHOaPB5Z+Xg4yE" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 37 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 100, + "height": 40 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "44lT1Z1/pKsJmw3FasFQo3" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 37 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_string": "停止", + "_horizontalAlign": 1, + "_verticalAlign": 1, + "_actualFontSize": 20, + "_fontSize": 20, + "_fontFamily": "Arial", + "_lineHeight": 40, + "_overflow": 1, + "_enableWrapText": false, + "_font": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_isItalic": false, + "_isBold": false, + "_isUnderline": false, + "_underlineHeight": 2, + "_cacheMode": 0, + "_enableOutline": false, + "_outlineColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_outlineWidth": 2, + "_enableShadow": false, + "_shadowColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_shadowOffset": { + "__type__": "cc.Vec2", + "x": 2, + "y": 2 + }, + "_shadowBlur": 2, + "_id": "69H/M4ehxF8IJZPwjh2wY4" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 36 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 100, + "height": 40 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "68grdZWfhJ7J7ZRxi3oI8l" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 36 + }, + "_enabled": true, + "__prefab": null, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_spriteFrame": { + "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 1, + "_fillType": 0, + "_sizeMode": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, + "_id": "a2gVTnsfpIg6W+57WOcTJe" + }, + { + "__type__": "cc.Button", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 36 + }, + "_enabled": true, + "__prefab": null, + "clickEvents": [], + "_interactable": true, + "_transition": 2, + "_normalColor": { + "__type__": "cc.Color", + "r": 214, + "g": 214, + "b": 214, + "a": 255 + }, + "_hoverColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "_pressedColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_disabledColor": { + "__type__": "cc.Color", + "r": 124, + "g": 124, + "b": 124, + "a": 255 + }, + "_normalSprite": { + "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_hoverSprite": { + "__uuid__": "20835ba4-6145-4fbc-a58a-051ce700aa3e@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_pressedSprite": { + "__uuid__": "544e49d6-3f05-4fa8-9a9e-091f98fc2ce8@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_disabledSprite": { + "__uuid__": "951249e0-9f16-456d-8b85-a6ca954da16b@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_duration": 0.1, + "_zoomScale": 1.2, + "_target": { + "__id__": 36 + }, + "_id": "a5uTr6o1JFoKDnwwrZeL0O" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 4 }, "_enabled": true, "__prefab": null, @@ -792,12 +1755,12 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 8 + "__id__": 4 }, "_enabled": true, "__prefab": null, "_cameraComponent": { - "__id__": 10 + "__id__": 6 }, "_alignCanvasWithScreen": true, "_id": "6d0qbdLTpLKrUDANgtW6UP" @@ -808,7 +1771,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 8 + "__id__": 4 }, "_enabled": true, "__prefab": null, @@ -832,31 +1795,9 @@ "_lockFlags": 0, "_id": "a5pvrwbEtERLlLDLFj6Xzw" }, - { - "__type__": "cc.UITransform", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 7 - }, - "_enabled": true, - "__prefab": null, - "_contentSize": { - "__type__": "cc.Size", - "width": 42.255859375, - "height": 50.4 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_id": "a5oODrk9xKq5kr4g8/ClUH" - }, { "__type__": "cc.Node", - "_name": "BehaviorTreeTestScene", + "_name": "BehaviorTreeExample", "_objFlags": 0, "__editorExtras__": {}, "_parent": { @@ -866,7 +1807,7 @@ "_active": true, "_components": [ { - "__id__": 23 + "__id__": 47 } ], "_prefab": null, @@ -897,7 +1838,78 @@ "y": 0, "z": 0 }, - "_id": "b3lpbBD/ZKEZ+1cwfr70lF" + "_id": "29w4ccbWlDX6NIPaeBuXn9" + }, + { + "__type__": "3c3bfSF4atEpIdYZZTtxMV1", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 46 + }, + "_enabled": true, + "__prefab": null, + "statusLabel": { + "__id__": 16 + }, + "logLabel": { + "__id__": 33 + }, + "startButton": { + "__id__": 13 + }, + "stopButton": { + "__id__": 42 + }, + "pauseButton": null, + "resumeButton": null, + "_id": "c9edmlZUxFkalFPoDWxBin" + }, + { + "__type__": "cc.Node", + "_name": "BehaviorTreeTestScene", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 49 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 1073741824, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "d4KMUTDVhNsb/nn6ba3b08" }, { "__type__": "0c14b5B3x1L3Ij9suUE7N7m", @@ -905,37 +1917,37 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 22 + "__id__": 48 }, "_enabled": true, "__prefab": null, - "_id": "11PmHjJBZKobQQa5dpzlJV" + "_id": "14woPYNfhLiYuUtYI9iql+" }, { "__type__": "cc.SceneGlobals", "ambient": { - "__id__": 25 + "__id__": 51 }, "shadows": { - "__id__": 26 + "__id__": 52 }, "_skybox": { - "__id__": 27 + "__id__": 53 }, "fog": { - "__id__": 28 + "__id__": 54 }, "octree": { - "__id__": 29 + "__id__": 55 }, "skin": { - "__id__": 30 + "__id__": 56 }, "lightProbeInfo": { - "__id__": 31 + "__id__": 57 }, "postSettings": { - "__id__": 32 + "__id__": 58 }, "bakedWithStationaryMainLight": false, "bakedWithHighpLightmap": false diff --git a/extensions/cocos/cocos-ecs/assets/scripts/ecs/BehaviorTreeExample.ts b/extensions/cocos/cocos-ecs/assets/scripts/ecs/BehaviorTreeExample.ts index e875b65e..adb25657 100644 --- a/extensions/cocos/cocos-ecs/assets/scripts/ecs/BehaviorTreeExample.ts +++ b/extensions/cocos/cocos-ecs/assets/scripts/ecs/BehaviorTreeExample.ts @@ -2,9 +2,9 @@ import { _decorator, Component, Node, Label, Button, resources, JsonAsset } from import { BehaviorTreeBuilder, BehaviorTree, - Blackboard, - BehaviorTreeJSONConfig + Blackboard } from '@esengine/ai'; +import type { BehaviorTreeJSONConfig } from '@esengine/ai'; const { ccclass, property } = _decorator; diff --git a/extensions/cocos/cocos-ecs/extensions/behaviour-tree b/extensions/cocos/cocos-ecs/extensions/behaviour-tree index 25598129..155609ed 160000 --- a/extensions/cocos/cocos-ecs/extensions/behaviour-tree +++ b/extensions/cocos/cocos-ecs/extensions/behaviour-tree @@ -1 +1 @@ -Subproject commit 25598129b2cf463cf573b39503bff7bac44a99b1 +Subproject commit 155609ed910c6b602554fecc5ef3324350012a5f diff --git a/extensions/cocos/cocos-ecs/extensions/cocos-ecs-extension b/extensions/cocos/cocos-ecs/extensions/cocos-ecs-extension index b6a2ee1e..686dfc97 160000 --- a/extensions/cocos/cocos-ecs/extensions/cocos-ecs-extension +++ b/extensions/cocos/cocos-ecs/extensions/cocos-ecs-extension @@ -1 +1 @@ -Subproject commit b6a2ee1e2e2692c96c0c884ed69d67e9c13ea6d8 +Subproject commit 686dfc974f997dfb775358ff3b41fdc2ee978991 diff --git a/thirdparty/BehaviourTree-ai b/thirdparty/BehaviourTree-ai index 93719af8..d4babd9a 160000 --- a/thirdparty/BehaviourTree-ai +++ b/thirdparty/BehaviourTree-ai @@ -1 +1 @@ -Subproject commit 93719af820d72e23584f56d0f6d86e269c338efb +Subproject commit d4babd9aa2cd2f0a65f2930716575db0113f406e