Files
behavior3editor/baby/node-config.b3-setting
T

1066 lines
28 KiB
Plaintext
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.
[
{
"name": "AlwaysFailure",
"type": "Decorator",
"children": 1,
"status": [
"failure",
"|running"
],
"desc": "始终返回失败",
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `running` 时,返回 `running`\n+ 其它情况,不管子节点是否成功都返回 `failure`\n"
},
{
"name": "AlwaysRunning",
"type": "Decorator",
"children": 1,
"status": [
"running"
],
"desc": "始终返回运行中状态",
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 始终返回 `running`\n"
},
{
"name": "AlwaysSuccess",
"type": "Decorator",
"children": 1,
"status": [
"success",
"|running"
],
"desc": "始终返回成功",
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `running` 时,返回 `running`\n+ 其它情况,不管子节点是否成功都返回 `success`\n"
},
{
"name": "Assert",
"type": "Decorator",
"children": 1,
"status": [
"success"
],
"desc": "断言",
"args": [
{
"name": "message",
"type": "string",
"desc": "消息"
}
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `failure` 时,抛出异常\n+ 其余情况返回子节点的执行状态\n"
},
{
"name": "Calculate",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "简单的数值公式计算",
"args": [
{
"name": "value",
"type": "expr",
"desc": "计算公式"
}
],
"output": [
"计算结果"
],
"doc": "+ 做简单的数值公式计算,返回结果到输出\n"
},
{
"name": "Case",
"type": "Composite",
"children": 2,
"status": [
"&success",
"|failure",
"|running"
],
"desc": "分支选择",
"doc": "+ 必须有两个子节点\n+ 第一个子节点为判断条件\n+ 第二个子节点为判断为 `success` 时执行的节点\n+ 此节点不会真正意义的执行,而是交由 `Switch` 节点来执行\n"
},
{
"name": "Check",
"type": "Condition",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "检查True或False",
"args": [
{
"name": "value",
"type": "expr",
"desc": "值"
}
],
"doc": "+ 做简单数值公式判定,返回 `success` 或 `failure`\n"
},
{
"name": "Concat",
"type": "Action",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "将两个输入合并为一个数组,并返回新数组",
"input": [
"数组1",
"数组2"
],
"output": [
"新数组"
],
"doc": "+ 如果输入不是数组,则返回 `failure`\n"
},
{
"name": "Delay",
"type": "Decorator",
"children": 1,
"status": [
"success"
],
"desc": "延时执行子节点",
"input": [
"延时时间?"
],
"args": [
{
"name": "delay",
"type": "float?",
"desc": "延时时间",
"oneof": "延时时间"
},
{
"name": "cacheVars",
"type": "string[]?",
"desc": "暂存环境变量"
}
],
"doc": "+ 当延时触发时,执行第一个子节点,多个仅执行第一个\n+ 如果子节点返回 `running`,会中断执行并清理执行栈"
},
{
"name": "Filter",
"type": "Decorator",
"children": 1,
"status": [
"success",
"failure",
"|running"
],
"desc": "返回满足条件的元素",
"input": [
"输入数组"
],
"output": [
"变量",
"新数组"
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 遍历输入数组,将当前元素写入`变量`,满足条件的元素放入新数组\n+ 只有当新数组不为空时,才返回 `success`\n"
},
{
"name": "ForEach",
"type": "Decorator",
"children": 1,
"status": [
"success",
"|running",
"|failure"
],
"desc": "遍历数组",
"input": [
"数组"
],
"output": [
"变量",
"索引?"
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 遍历输入数组,将当前元素写入`变量`\n+ 当子节点返回 `failure` 时,退出遍历并返回 `failure` 状态\n+ 执行完所有子节点后,返回 `success`"
},
{
"name": "GetField",
"type": "Action",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "获取对象的字段值",
"args": [
{
"name": "field",
"type": "string?",
"desc": "字段(field)",
"oneof": "字段(field)"
}
],
"input": [
"对象",
"字段(field)?"
],
"output": [
"字段值(value)"
],
"doc": "+ 合法元素不包括 `undefined` 和 `null`\n+ 只有获取到合法元素时候才会返回 `success`,否则返回 `failure`\n"
},
{
"name": "IfElse",
"type": "Composite",
"children": 3,
"status": [
"|success",
"|failure",
"|running"
],
"desc": "条件执行",
"doc": "+ 必须有三个子节点\n+ 第一个子节点为条件节点\n+ 第二个子节点为条件为 `success` 时执行的节点\n+ 第三个子节点为条件为 `failure` 时执行的节点,\n"
},
{
"name": "Includes",
"type": "Condition",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "判断元素是否在数组中",
"input": [
"数组",
"元素"
],
"doc": "+ 若输入的元素不合法,返回 `failure`\n+ 只有数组包含元素时返回 `success`,否则返回 `failure`\n"
},
{
"name": "Index",
"type": "Action",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "索引输入的数组",
"args": [
{
"name": "index",
"type": "int?",
"desc": "索引",
"oneof": "索引"
}
],
"input": [
"数组",
"索引?"
],
"output": [
"值"
],
"doc": "+ 合法元素不包括 `undefined` 和 `null`\n+ 索引数组的时候,第一个元素的索引为 0\n+ 只有索引到有合法元素时候才会返回 `success`,否则返回 `failure`\n"
},
{
"name": "Invert",
"type": "Decorator",
"children": 1,
"status": [
"!success",
"!failure",
"|running"
],
"desc": "反转子节点运行结果",
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `success` 时返回 `failure`\n+ 当子节点返回 `failure` 时返回 `success`\n+ 当子节点返回 `error` 时返回 `error`\n"
},
{
"name": "IsNull",
"type": "Condition",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "判断变量是否不存在",
"input": [
"判断的变量"
]
},
{
"name": "JustFailure",
"type": "Action",
"children": 0,
"status": [
"failure"
],
"desc": "什么都不干,只返回失败"
},
{
"name": "JustSuccess",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "什么都不干,只返回成功"
},
{
"name": "Let",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "定义新的变量名",
"input": [
"已存在变量名?"
],
"args": [
{
"name": "value",
"type": "json?",
"desc": "值(value)",
"oneof": "已存在变量名"
}
],
"output": [
"新变量名"
],
"doc": "+ 如果有输入变量,则给已有变量重新定义一个名字\n+ 如果`值(value)`为 `null`,则清除变量\n"
},
{
"name": "Listen",
"type": "Decorator",
"children": 1,
"status": [
"success"
],
"desc": "侦听事件",
"input": [
"目标对象?"
],
"output": [
"事件目标?",
"事件参数..."
],
"args": [
{
"name": "event",
"type": "string",
"desc": "事件",
"options": [
{
"source": [
{ "name": "左键单击", "value": "EVT_KEY_LEFT_CLICK" },
{ "name": "左键双击", "value": "EVT_KEY_LEFT_DOUBLE_CLICK" },
{ "name": "左键长按", "value": "EVT_KEY_LEFT_LONG_PRESS" },
{ "name": "右键单击", "value": "EVT_KEY_RIGHT_CLICK" },
{ "name": "右键双击", "value": "EVT_KEY_RIGHT_DOUBLE_CLICK" },
{ "name": "右键长按", "value": "EVT_KEY_RIGHT_LONG_PRESS" },
{ "name": "右键三击", "value": "EVT_KEY_RIGHT_TRIPLE_CLICK" },
{ "name": "左右键同时长按", "value": "EVT_KEY_BOTH_LONG_PRESS" },
{ "name": "触摸单击", "value": "EVT_TOUCH_TAP" },
{ "name": "触摸三击", "value": "EVT_TOUCH_TRIPLE_TAP" },
{ "name": "摇晃", "value": "EVT_GYRO_SHAKE" },
{ "name": "人靠近", "value": "EVT_RADAR_PERSON_APPROACH" },
{ "name": "人离开", "value": "EVT_RADAR_PERSON_LEAVE" },
{ "name": "电量危险", "value": "EVT_BATTERY_CRITICAL" },
{ "name": "Wi-Fi 已连接", "value": "EVT_WIFI_CONNECTED" },
{ "name": "Wi-Fi 已断开", "value": "EVT_WIFI_DISCONNECTED" },
{ "name": "剧本播放完成", "value": "EVT_SCRIPT_DONE" },
{ "name": "饱食度变化", "value": "EVT_PHYSIOLOGY_FULLNESS_CHANGED" },
{ "name": "清洁度变化", "value": "EVT_PHYSIOLOGY_CLEANLINESS_CHANGED" },
{ "name": "精力值变化", "value": "EVT_PHYSIOLOGY_ENERGY_CHANGED" },
{ "name": "开心值变化", "value": "EVT_PHYSIOLOGY_HAPPINESS_CHANGED" }
]
}
]
}
],
"doc": "+ 当事件触发时,执行第一个子节点,多个仅执行第一个\n+ 如果子节点返回 `running`,会中断执行并清理执行栈"
},
{
"name": "Log",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "打印日志",
"input": [
"日志?"
],
"args": [
{
"name": "message",
"type": "string",
"desc": "日志"
},
{
"name": "level",
"type": "string",
"desc": "日志级别",
"default": "log",
"options": [
{
"source": [
{
"name": "LOG",
"value": "log"
},
{
"name": "INFO",
"value": "info"
},
{
"name": "DEBUG",
"value": "debug"
},
{
"name": "WARN",
"value": "warn"
},
{
"name": "ERROR",
"value": "error"
}
]
}
]
}
]
},
{
"name": "Math",
"type": "Action",
"desc": "执行数学运算",
"input": [
"参数..."
],
"output": [
"结果"
],
"status": [
"success",
"failure"
],
"args": [
{
"name": "op",
"type": "string",
"desc": "数学运算类型",
"options": [
{
"source": [
{
"name": "绝对值",
"value": "abs"
},
{
"name": "向上取整",
"value": "ceil"
},
{
"name": "向下取整",
"value": "floor"
},
{
"name": "四舍五入",
"value": "round"
},
{
"name": "符号",
"value": "sign"
},
{
"name": "正弦",
"value": "sin"
},
{
"name": "余弦",
"value": "cos"
},
{
"name": "正切",
"value": "tan"
},
{
"name": "反正切2",
"value": "atan2"
},
{
"name": "幂运算",
"value": "pow"
},
{
"name": "平方根",
"value": "sqrt"
},
{
"name": "自然对数",
"value": "log"
},
{
"name": "最小值",
"value": "min"
},
{
"name": "最大值",
"value": "max"
},
{
"name": "随机数",
"value": "random"
},
{
"name": "随机整数",
"value": "randInt"
},
{
"name": "随机浮点数",
"value": "randFloat"
},
{
"name": "求和",
"value": "sum"
},
{
"name": "平均值",
"value": "average"
},
{
"name": "乘积",
"value": "product"
}
]
}
]
},
{
"name": "value1",
"type": "float?",
"desc": "参数1(优先使用)"
},
{
"name": "value2",
"type": "float?",
"desc": "参数2(优先使用)"
}
]
},
{
"name": "NotNull",
"type": "Condition",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "判断变量是否存在",
"input": [
"判断的变量"
]
},
{
"name": "Now",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "获取当前时间",
"output": [
"当前时间"
]
},
{
"name": "Once",
"type": "Decorator",
"children": 1,
"status": [
"success",
"failure",
"|running"
],
"desc": "只执行一次",
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 第一次执行完全部子节点时返回 `success`,之后永远返回 `failure`"
},
{
"name": "Parallel",
"type": "Composite",
"status": [
"success",
"|running"
],
"children": -1,
"desc": "并行执行",
"doc": "+ 并行执行所有子节点\n+ 当有子节点返回 `running` 时,返回 `running` 状态\n+ 执行完所有子节点后,返回 `success`"
},
{
"name": "Push",
"type": "Action",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "向数组中添加元素",
"input": [
"数组",
"元素"
],
"doc": "+ 当变量`数组`不是数组类型时返回 `failure`\n+ 其余返回 `success`\n"
},
{
"name": "Race",
"type": "Composite",
"status": [
"|success",
"&failure",
"|running"
],
"children": -1,
"desc": "竞争执行",
"doc": "+ 并行执行所有子节点\n+ 当有子节点返回 `success` 时,立即返回 `success` 状态,并中断其他子节点\n+ 如果所有子节点返回 `failure`或 `error` 则返回 `failure`"
},
{
"name": "RandomIndex",
"type": "Action",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "随机返回输入的其中一个!",
"input": [
"输入目标"
],
"output": [
"随机目标",
"索引?"
],
"doc": "+ 合法元素不包括 `undefined` 和 `null`\n+ 在输入数组中,随机返回其中一个\n+ 当输入数组为空时,或者没有合法元素,返回 `failure`\n"
},
{
"name": "Repeat",
"type": "Decorator",
"children": 1,
"status": [
"success",
"|running",
"|failure"
],
"desc": "循环执行",
"input": [
"循环次数?"
],
"args": [
{
"name": "count",
"type": "int?",
"desc": "循环次数",
"oneof": "循环次数"
}
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `failure` 时,退出遍历并返回 `failure` 状态\n+ 执行完所有子节点后,返回 `success`\n"
},
{
"name": "RetryUntilFailure",
"type": "Decorator",
"children": 1,
"status": [
"!success",
"failure",
"running"
],
"desc": "一直尝试直到子节点返回失败",
"input": [
"最大尝试次数?"
],
"args": [
{
"name": "count",
"type": "int?",
"desc": "最大尝试次数"
}
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 只有当子节点返回 `failure` 时,才返回 `success`,其它情况返回 `running` 状态\n+ 如果设定了尝试次数,超过指定次数则返回 `failure`"
},
{
"name": "RetryUntilSuccess",
"type": "Decorator",
"children": 1,
"status": [
"|success",
"failure",
"running"
],
"desc": "一直尝试直到子节点返回成功",
"input": [
"最大尝试次数?"
],
"args": [
{
"name": "count",
"type": "int?",
"desc": "最大尝试次数"
}
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 只有当子节点返回 `success` 时,才返回 `success`,其它情况返回 `running` 状态\n+ 如果设定了尝试次数,超过指定次数则返回 `failure`"
},
{
"name": "Selector",
"type": "Composite",
"children": -1,
"desc": "选择执行",
"status": [
"|success",
"&failure",
"|running"
],
"doc": "+ 一直往下执行,直到有子节点返回 `success` 则返回 `success`\n+ 若全部节点返回 `failure`或 `error` 则返回 `failure`"
},
{
"name": "Sequence",
"type": "Composite",
"children": -1,
"status": [
"&success",
"|failure",
"|running"
],
"desc": "顺序执行",
"doc": "+ 一直往下执行,只有当所有子节点都返回 `success`, 才返回 `success`\n+ 若子节点返回 `failure`,则直接返回 `failure` 状态\n+ 其余情况返回 `running` 状态\n"
},
{
"name": "SetField",
"type": "Action",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "设置对象字段值",
"input": [
"输入对象",
"字段(field)?",
"值(value)?"
],
"args": [
{
"name": "field",
"type": "string?",
"desc": "字段(field)",
"oneof": "字段(field)"
},
{
"name": "value",
"type": "json?",
"desc": "值(value)",
"oneof": "值(value)"
}
],
"doc": "+ 对输入对象设置 `field` 和 `value`\n+ 输入参数1必须为对象,否则返回 `failure`\n+ 如果 `field` 不为 `string`, 也返回 `failure`\n+ 如果 `value` 为 `undefined` 或 `null`, 则删除 `field` 的值\n"
},
{
"name": "Switch",
"type": "Composite",
"children": -1,
"status": [
"|success",
"|failure",
"|running"
],
"desc": "分支执行",
"doc": "+ 按顺序测试 `Case` 节点的判断条件(第一个子节点)\n+ 若测试返回 `success` 则执行 `Case` 第二个子节点,并返回子节点的执行状态\n+ 若没有判断为 `success` 的 `Case` 节点,则返回 `failure`\n"
},
{
"name": "Timeout",
"type": "Decorator",
"children": 1,
"status": [
"|success",
"|running",
"failure"
],
"desc": "超时",
"input": [
"超时时间?"
],
"args": [
{
"name": "time",
"type": "float?",
"desc": "超时时间",
"oneof": "超时时间"
}
],
"doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点执行超时或返回 `failure` 时,返回 `failure`\n+ 其余情况返回子节点的执行状态\n"
},
{
"name": "PlayScript",
"type": "Action",
"children": 0,
"status": [
"success",
"running",
"failure"
],
"desc": "播放脚本(GIF/音频/LED)",
"args": [
{
"name": "script",
"type": "string",
"desc": "脚本路径,如 baby/interaction/curious"
}
],
"doc": "+ 根据脚本路径驱动 display / audio / led 执行\n+ 运行期间返回 `running`,完成后返回 `success`"
},
{
"name": "Wait",
"type": "Action",
"children": 0,
"status": [
"success",
"running"
],
"desc": "等待",
"input": [
"等待时间?"
],
"args": [
{
"name": "time",
"type": "float?",
"desc": "等待时间",
"oneof": "等待时间"
},
{
"name": "random",
"type": "float?",
"desc": "随机范围"
}
]
},
{
"name": "WaitForEvent",
"type": "Action",
"children": 0,
"status": [
"success",
"running"
],
"desc": "等待事件触发",
"args": [
{
"name": "event",
"type": "string",
"desc": "事件名称"
}
]
},
{
"name": "CheckPhysio",
"type": "Condition",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "检查宠物生理数值",
"args": [
{
"name": "attr",
"type": "string",
"desc": "数值类型",
"options": [
{
"source": [
{ "name": "饱食度(fullness)", "value": "fullness" },
{ "name": "清洁度(cleanliness)", "value": "cleanliness" },
{ "name": "精力值(energy)", "value": "energy" },
{ "name": "开心值(happiness)", "value": "happiness" }
]
}
]
},
{
"name": "op",
"type": "string",
"desc": "比较操作",
"default": "<=",
"options": [
{
"source": [
{ "name": "<=", "value": "<=" },
{ "name": "<", "value": "<" },
{ "name": ">=", "value": ">=" },
{ "name": ">", "value": ">" },
{ "name": "==", "value": "==" },
{ "name": "!=", "value": "!=" }
]
}
]
},
{
"name": "value",
"type": "int",
"desc": "比较阈值(0-100)"
}
],
"doc": "+ 从 demo7 DataCenter 读取指定数值并比较\n+ 例如 fullness <= 30 表示饱食度过低,需要播放饿了的剧本\n"
},
{
"name": "AddPhysio",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "增加或减少宠物生理数值",
"args": [
{
"name": "attr",
"type": "string",
"desc": "数值类型",
"options": [
{
"source": [
{ "name": "饱食度(fullness)", "value": "fullness" },
{ "name": "清洁度(cleanliness)", "value": "cleanliness" },
{ "name": "精力值(energy)", "value": "energy" },
{ "name": "开心值(happiness)", "value": "happiness" }
]
}
]
},
{
"name": "amount",
"type": "int",
"desc": "变化量,可为负数"
}
],
"doc": "+ 调用 demo7 IPetContext 修改 DataCenter 中的数值\n+ 例如 happiness = -3 表示心情下降 3 点\n"
},
{
"name": "SetPhysio",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "直接设定宠物生理数值为指定绝对值",
"args": [
{
"name": "attr",
"type": "string",
"desc": "数值类型",
"options": [
{
"source": [
{ "name": "饱食度(fullness)", "value": "fullness" },
{ "name": "清洁度(cleanliness)", "value": "cleanliness" },
{ "name": "精力值(energy)", "value": "energy" },
{ "name": "开心值(happiness)", "value": "happiness" }
]
}
]
},
{
"name": "value",
"type": "int",
"desc": "目标数值(0-100)"
}
],
"doc": "+ 直接将 DataCenter 中的指定数值设置为 value(绝对值,非增量)\n+ 例如喂食后 SetPhysio { fullness: 80 } 将饱食度重置为 80\n"
},
{
"name": "CheckUtility",
"type": "Condition",
"children": 0,
"status": [
"success",
"failure"
],
"desc": "检查宠物行为效用值(由 PetBrain 计算的 0.0–1.0 驱动强度)",
"args": [
{
"name": "attr",
"type": "string",
"desc": "效用属性",
"options": [
{
"source": [
{ "name": "饥饿(hungry)", "value": "hungry" },
{ "name": "困倦(sleepy)", "value": "sleepy" },
{ "name": "脏了(dirty)", "value": "dirty" },
{ "name": "开心(laugh)", "value": "laugh" },
{ "name": "好奇(curious)", "value": "curious" },
{ "name": "悲伤(sad)", "value": "sad" }
]
}
]
},
{
"name": "op",
"type": "string",
"desc": "比较操作",
"default": ">=",
"options": [
{
"source": [
{ "name": ">=", "value": ">=" },
{ "name": ">", "value": ">" },
{ "name": "<=", "value": "<=" },
{ "name": "<", "value": "<" },
{ "name": "==", "value": "==" },
{ "name": "!=", "value": "!=" }
]
}
]
},
{
"name": "value",
"type": "float",
"desc": "比较阈值(0.0 – 1.0)"
}
],
"doc": "+ 从 PetBrain::GetBehaviorUtilities() 读取效用分数,与阈值比较\n+ attr 可选值:hungry / sleepy / dirty / laugh / curious / sad\n+ 例如:{ attr: \"hungry\", op: \">=\", value: 0.6 } 表示饥饿驱动力 ≥ 60%,应播放饿了剧本\n+ 与 CheckPhysio 的区别:CheckPhysio 读取的是原始整数值(0-100),CheckUtility 读取的是经过曲线映射后的标准化驱动强度\n"
},
{
"name": "RequestModeSwitch",
"type": "Action",
"children": 0,
"status": [
"success"
],
"desc": "请求切换宠物模式",
"args": [
{
"name": "mode",
"type": "string",
"desc": "目标模式",
"options": [
{
"source": [
{ "name": "待机模式", "value": "MODE_IDLE" },
{ "name": "菜单模式", "value": "MODE_MENU" },
{ "name": "睡眠模式", "value": "MODE_SLEEPING" }
]
}
]
}
],
"doc": "+ 请求切换到指定的宠物模式\n+ MODE_MENU: 打开菜单(等同于 Log 中的 OPEN_MENU)\n+ MODE_IDLE: 返回待机\n+ MODE_SLEEPING: 进入睡眠\n"
},
{
"name": "Watchdog",
"type": "Composite",
"children": 3,
"status": [
"|success",
"|failure",
"|running"
],
"desc": "测试执行",
"doc": "+ 必须有3个子节点\n+ 第一个子节点为条件节点,返回 `success` 或 `failure` 状态\n+ 第二个子节点为条件为 `success` 时执行的节点\n+ 第三个子节点为条件为 `failure` 时执行的节点,不管子节点返回什么状态,都直接返回 `failure`\n+ 当第二个子节点返回 `running` 时,由本节点维护其运行状态\n+ 每一次 tick 都会先执行测试节点,只有当测试节点返回 `success`,才执行第二个子节点\n"
}
]