Files
esengine/extensions/cocos/cocos-ecs/assets/resources/behavior-tree-examples-guide.bt.json
2025-06-22 21:21:46 +08:00

818 lines
23 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"nodes": [
{
"id": "root_1",
"type": "root",
"name": "行为树指南根",
"icon": "🌳",
"x": 1270,
"y": 50,
"children": [
"selector_main"
],
"properties": {},
"canHaveChildren": true,
"canHaveParent": false,
"hasError": false
},
{
"id": "selector_main",
"type": "selector",
"name": "主选择器",
"icon": "?",
"x": 1280,
"y": 180,
"children": [
"repeater_patrol",
"selector_combat",
"sequence_idle"
],
"properties": {
"abortType": {
"name": "中止类型",
"type": "select",
"value": "LowerPriority",
"description": "决定节点在何种情况下会被中止",
"options": [
"None",
"LowerPriority",
"Self",
"Both"
],
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "repeater_patrol",
"type": "repeater",
"name": "巡逻重复器",
"icon": "🔄",
"x": 510,
"y": 360,
"children": [
"sequence_patrol"
],
"properties": {
"count": {
"name": "重复次数",
"type": "number",
"value": -1,
"description": "重复执行次数,-1表示无限重复必须是正整数",
"required": true
},
"continueOnFailure": {
"name": "失败时继续",
"type": "boolean",
"value": true,
"description": "子节点失败时是否继续重复",
"required": false
},
"delayBetween": {
"name": "重复间隔",
"type": "boolean",
"value": false,
"description": "重复之间是否有延迟",
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "sequence_patrol",
"type": "sequence",
"name": "巡逻序列",
"icon": "→",
"x": 510,
"y": 580,
"children": [
"decorator_patrol_check",
"action_patrol"
],
"properties": {
"abortType": {
"name": "中止类型",
"type": "select",
"value": "None",
"description": "决定节点在何种情况下会被中止",
"options": [
"None",
"LowerPriority",
"Self",
"Both"
],
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "decorator_patrol_check",
"type": "conditional-decorator",
"name": "巡逻条件检查",
"icon": "🔀",
"x": 400,
"y": 760,
"children": [
"log_patrolling"
],
"properties": {
"conditionType": {
"name": "条件类型",
"type": "select",
"value": "custom",
"description": "装饰器使用的条件类型",
"options": [
"custom",
"random",
"hasComponent",
"hasTag",
"isActive",
"numericCompare",
"propertyExists"
],
"required": false
},
"executeWhenTrue": {
"name": "条件为真时执行",
"type": "boolean",
"value": true,
"description": "条件为真时是否执行子节点",
"required": false
},
"executeWhenFalse": {
"name": "条件为假时执行",
"type": "boolean",
"value": false,
"description": "条件为假时是否执行子节点",
"required": false
},
"checkInterval": {
"name": "检查间隔",
"type": "number",
"value": 1,
"description": "条件检查间隔时间0表示每帧检查",
"required": false
}
},
"attachedCondition": {
"type": "condition-custom",
"name": "巡逻状态检查",
"icon": "⚙️",
"properties": {
"conditionCode": {
"name": "条件代码",
"type": "code",
"value": "(context) => {\n // 检查是否处于巡逻状态\n return context.blackboard && context.blackboard.getValue('state') === 'patrol';\n}",
"description": "条件判断函数代码",
"required": true
},
"conditionName": {
"name": "条件名称",
"type": "string",
"value": "巡逻状态检查",
"description": "用于调试的条件名称",
"required": false
}
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "log_patrolling",
"type": "log-action",
"name": "记录巡逻",
"icon": "📝",
"x": 400,
"y": 1000,
"children": [],
"properties": {
"message": {
"name": "日志消息",
"type": "string",
"value": "正在执行巡逻任务,当前状态: {{state}}",
"description": "使用{{}}引用黑板变量显示当前状态",
"required": true
},
"logLevel": {
"name": "日志级别",
"type": "select",
"value": "info",
"description": "日志输出级别",
"options": [
"debug",
"info",
"warn",
"error"
],
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "action_patrol",
"type": "set-blackboard-value",
"name": "执行巡逻",
"icon": "📝",
"x": 620,
"y": 760,
"children": [],
"properties": {
"variableName": {
"name": "变量名",
"type": "string",
"value": "lastAction",
"description": "黑板变量名",
"required": true
},
"value": {
"name": "设置值",
"type": "string",
"value": "{{state}}_执行中",
"description": "使用{{}}引用当前状态并添加后缀",
"required": false
},
"sourceVariable": {
"name": "源变量名",
"type": "string",
"value": "",
"description": "从另一个黑板变量复制值",
"required": false
},
"force": {
"name": "强制设置",
"type": "boolean",
"value": false,
"description": "是否忽略只读限制",
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "selector_combat",
"type": "selector",
"name": "战斗选择器",
"icon": "?",
"x": 1170,
"y": 360,
"children": [
"sequence_attack",
"sequence_defend"
],
"properties": {
"abortType": {
"name": "中止类型",
"type": "select",
"value": "None",
"description": "决定节点在何种情况下会被中止",
"options": [
"None",
"LowerPriority",
"Self",
"Both"
],
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "sequence_attack",
"type": "sequence",
"name": "攻击序列",
"icon": "→",
"x": 950,
"y": 540,
"children": [
"inverter_enemy",
"action_attack"
],
"properties": {
"abortType": {
"name": "中止类型",
"type": "select",
"value": "Self",
"description": "决定节点在何种情况下会被中止",
"options": [
"None",
"LowerPriority",
"Self",
"Both"
],
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "inverter_enemy",
"type": "inverter",
"name": "敌人检查反转",
"icon": "!",
"x": 840,
"y": 720,
"children": [
"condition_enemy"
],
"properties": {},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "condition_enemy",
"type": "condition-random",
"name": "随机敌人出现",
"icon": "🎲",
"x": 840,
"y": 880,
"children": [],
"properties": {
"successProbability": {
"name": "成功概率",
"type": "number",
"value": 0.3,
"description": "条件成功的概率 (0.0 - 1.0)",
"required": true
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "action_attack",
"type": "log-action",
"name": "攻击动作",
"icon": "📝",
"x": 1060,
"y": 720,
"children": [],
"properties": {
"message": {
"name": "日志消息",
"type": "string",
"value": "发动攻击!生命值: {{health}}, 能量: {{energy}}",
"description": "使用{{}}引用显示战斗时的状态信息",
"required": true
},
"logLevel": {
"name": "日志级别",
"type": "select",
"value": "warn",
"description": "日志输出级别",
"options": [
"debug",
"info",
"warn",
"error"
],
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "sequence_defend",
"type": "sequence",
"name": "防御序列",
"icon": "→",
"x": 1390,
"y": 540,
"children": [
"wait_defend",
"action_defend"
],
"properties": {
"abortType": {
"name": "中止类型",
"type": "select",
"value": "None",
"description": "决定节点在何种情况下会被中止",
"options": [
"None",
"LowerPriority",
"Self",
"Both"
],
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "wait_defend",
"type": "wait-action",
"name": "防御准备",
"icon": "⏰",
"x": 1280,
"y": 720,
"children": [],
"properties": {
"waitTime": {
"name": "等待时间",
"type": "number",
"value": 0.5,
"description": "等待时间必须大于0",
"required": true
},
"useExternalTime": {
"name": "使用外部时间",
"type": "boolean",
"value": false,
"description": "是否使用上下文提供的deltaTime否则使用内部时间计算",
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "action_defend",
"type": "execute-action",
"name": "执行防御",
"icon": "⚙️",
"x": 1500,
"y": 720,
"children": [],
"properties": {
"actionCode": {
"name": "动作代码",
"type": "code",
"value": "(context) => {\n // 防御逻辑\n console.log('开始防御姿态');\n if(context.blackboard) {\n context.blackboard.setValue('defendActive', true);\n context.blackboard.setValue('lastAction', '防御中');\n }\n return 'success';\n}",
"description": "要执行的动作函数代码",
"required": true
},
"actionName": {
"name": "动作名称",
"type": "string",
"value": "防御动作_生命值{{health}}",
"description": "使用{{}}引用在动作名称中显示生命值",
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "sequence_idle",
"type": "sequence",
"name": "闲置序列",
"icon": "→",
"x": 1940,
"y": 360,
"children": [
"action_idle",
"log_status",
"wait_idle"
],
"properties": {
"abortType": {
"name": "中止类型",
"type": "select",
"value": "None",
"description": "决定节点在何种情况下会被中止",
"options": [
"None",
"LowerPriority",
"Self",
"Both"
],
"required": false
}
},
"canHaveChildren": true,
"canHaveParent": true,
"hasError": false
},
{
"id": "action_idle",
"type": "set-blackboard-value",
"name": "设置闲置",
"icon": "📝",
"x": 1720,
"y": 540,
"children": [],
"properties": {
"variableName": {
"name": "变量名",
"type": "string",
"value": "state",
"description": "黑板变量名",
"required": true
},
"value": {
"name": "设置值",
"type": "string",
"value": "idle",
"description": "要设置的值(留空则使用源变量)",
"required": false
},
"sourceVariable": {
"name": "源变量名",
"type": "string",
"value": "",
"description": "从另一个黑板变量复制值",
"required": false
},
"force": {
"name": "强制设置",
"type": "boolean",
"value": false,
"description": "是否忽略只读限制",
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "log_status",
"type": "log-action",
"name": "状态报告",
"icon": "📝",
"x": 1940,
"y": 540,
"children": [],
"properties": {
"message": {
"name": "日志消息",
"type": "string",
"value": "状态报告 - 当前: {{state}}, 上次动作: {{lastAction}}, 防御中: {{defendActive}}",
"description": "完整的黑板变量引用示例,显示多个变量值",
"required": true
},
"logLevel": {
"name": "日志级别",
"type": "select",
"value": "debug",
"description": "日志输出级别",
"options": [
"debug",
"info",
"warn",
"error"
],
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
},
{
"id": "wait_idle",
"type": "wait-action",
"name": "闲置等待",
"icon": "⏰",
"x": 2160,
"y": 540,
"children": [],
"properties": {
"waitTime": {
"name": "等待时间",
"type": "number",
"value": 3,
"description": "等待时间必须大于0",
"required": true
},
"useExternalTime": {
"name": "使用外部时间",
"type": "boolean",
"value": false,
"description": "是否使用上下文提供的deltaTime否则使用内部时间计算",
"required": false
}
},
"canHaveChildren": false,
"canHaveParent": true,
"hasError": false
}
],
"connections": [
{
"id": "root_1-selector_main",
"sourceId": "root_1",
"targetId": "selector_main",
"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 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 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 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.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.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.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.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.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.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.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.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.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.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.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 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 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 2020.0001282691956 454.9542908668518 C 2020.0001282691956 499.99997568130493 2240.0001282691956 499.99997568130493 2240.0001282691956 545.045660495758",
"active": false
}
],
"metadata": {
"name": "assets/resources/behavior-tree-examples-guide",
"created": "2025-06-22T11:04:28.781Z",
"version": "1.0"
},
"blackboard": [
{
"name": "state",
"type": "string",
"value": "patrol",
"defaultValue": "idle",
"description": "当前状态",
"group": "核心状态",
"readOnly": false,
"constraints": {
"allowedValues": [
"idle",
"patrol",
"combat",
"defend"
]
}
},
{
"name": "lastAction",
"type": "string",
"value": "",
"defaultValue": "",
"description": "最后执行的动作",
"group": "核心状态",
"readOnly": false,
"constraints": {}
},
{
"name": "defendActive",
"type": "boolean",
"value": false,
"defaultValue": false,
"description": "是否正在防御",
"group": "战斗状态",
"readOnly": false,
"constraints": {}
},
{
"name": "health",
"type": "number",
"value": 100,
"defaultValue": 100,
"description": "生命值",
"group": "属性",
"readOnly": false,
"constraints": {
"min": 0,
"max": 100,
"step": 1
}
},
{
"name": "energy",
"type": "number",
"value": 50,
"defaultValue": 100,
"description": "能量值",
"group": "属性",
"readOnly": false,
"constraints": {
"min": 0,
"max": 100,
"step": 1
}
}
]
}