Files
esengine/extensions/cocos/cocos-ecs/assets/resources/behavior-tree-examples-guide.bt.json

818 lines
23 KiB
JSON
Raw Normal View History

{
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"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",
2025-06-22 21:21:46 +08:00
"path": "M 2020.0001282691956 454.9542908668518 C 2020.0001282691956 499.99997568130493 2240.0001282691956 499.99997568130493 2240.0001282691956 545.045660495758",
"active": false
}
],
"metadata": {
2025-06-22 21:21:46 +08:00
"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
}
}
]
}