145 lines
11 KiB
JSON
145 lines
11 KiB
JSON
{
|
||
"180": "事件与转换",
|
||
"181": "<l1>LimboHSM</l> 自带一套<b>事件系统</b>,有助于把<b>状态转换与状态实现解耦</b>。一个转换与特定的事件、起始状态和目标状态相关联,当该事件被派发时,转换会自动执行。",
|
||
"182": "要注册一个转换并把它与特定事件关联,可以使用 <l1>LimboHSM.add_transition</l> 方法:",
|
||
"183": "在这个示例中,我们注册了一个从 <1/> 到 <2/> 的转换,它在 <3/> 事件被派发时发生。",
|
||
"184": "转换也可以不与任何特定的起始状态关联:",
|
||
"185": "<b>事件通过</b> <l1>LimboState.dispatch</l> 方法<b>派发</b>。需要注意的是,该方法可以从状态机层级中的任何位置调用,也可以在状态机之外调用。事件会<b>从叶状态向根状态传播</b>。这意味着,如果某个事件被某个状态消费掉,它就不会再传播到其父状态。",
|
||
"186": "状态还可以定义<b>事件处理器</b>,即对特定事件做出反应的方法。这些事件处理器通常不会导致状态转换;它们只是状态对特定事件做出反应的一种机制。你可以用 <l1>LimboState.add_event_handler</l> 方法在状态中注册事件处理器:",
|
||
"187": "如果事件处理器返回 <1/>,该事件将被视为已被消费,不会再继续传播,也不会导致状态转换。",
|
||
"188": "状态的结构",
|
||
"189": "把行为树与状态机结合使用",
|
||
"190": "<l1>BTState</l> 是 <l2>LimboHSM</l> 中一种特殊的状态节点,它可以承载一个行为树。当 <l3>BTState</l> 处于活动状态时,它每帧都会执行所承载的行为树,实际上就是把该行为树当作它的实现。",
|
||
"191": "这样你就可以把行为树的强大能力与状态机的结构与控制结合起来。行为树非常适合定义复杂的层次化行为,而状态机则擅长管理不同行为之间的流转与转换。",
|
||
"192": "创建好 <l1>LimboHSM</l> 之后,就可以为给定的 <l3>LimboHSM</l> 创建一个 <l2>BTState</l>:",
|
||
"193": "单文件状态机配置",
|
||
"194": "在某些情况下,例如做原型或参加 Game Jam 时,把状态机代码放在单个文件里更实用。针对这类情况,<l1>LimboHSM</l> <b>支持委托(delegation)</b>,并提供<b>链式方法</b>以便更轻松地完成配置。下面用一个实际的代码示例来说明:",
|
||
"195": "重要类",
|
||
"196": "LimboAI 中引入了很多类。下面列出你应该了解的最重要的那些:",
|
||
"197": "BTTask",
|
||
"198": "<b>继承:</b><l1>BT</l>",
|
||
"199": "<b>被继承:</b><l1>BTAction</l>、<l2>BTComment</l>、<l3>BTComposite</l>、<l4>BTCondition</l>、<l5>BTDecorator</l>",
|
||
"200": "所有 <l1>BehaviorTree</l> 任务的基类。",
|
||
"201": "说明",
|
||
"202": "所有 <l1>BehaviorTree</l> 任务的基类。任务是 <l2>BehaviorTree</l> 中的基本积木块,代表某个具体行为或控制流。通过按层次组合和嵌套任务,可以构建出复杂的行为。",
|
||
"203": "任务可以是以下类型之一:动作、条件、组合或装饰器。每种任务类型都有对应的子类:<l1>BTAction</l>、<l2>BTCondition</l>、<l3>BTDecorator</l>、<l4>BTComposite</l>。",
|
||
"204": "任务通过 <l1>_tick</l> 方法执行工作并返回状态。状态值定义在 <l2>Status</l> 中。任务可以用 <l3>_setup</l> 方法初始化。另见 <l4>_enter</l> 与 <l5>_exit</l>。",
|
||
"205": "<b>注意:</b>不要直接继承 <b>BTTask</b> 来实现你自己的任务,而应继承上面提到的某个子类型。",
|
||
"206": "属性",
|
||
"207": "<l1>agent</l>",
|
||
"208": "<l1>Blackboard</l>",
|
||
"209": "<l1>blackboard</l>",
|
||
"210": "<l1>custom_name</l>",
|
||
"211": "<l1>elapsed_time</l>",
|
||
"212": "<l1>scene_root</l>",
|
||
"213": "<l1>Status</l>",
|
||
"214": "<l1>status</l>",
|
||
"215": "方法",
|
||
"216": "<l1>_enter</l>() <2/>",
|
||
"217": "<l1>_exit</l>() <2/>",
|
||
"218": "<l1>_generate_name</l>() <2/> <3/>",
|
||
"219": "<l1>_get_configuration_warnings</l>() <2/> <3/>",
|
||
"220": "<l1>_setup</l>() <2/>",
|
||
"221": "<l1>_tick</l>(delta: <2/>) <3/>",
|
||
"222": "<l1>abort</l>()",
|
||
"223": "<l1>add_child</l>(task: <l2>BTTask</l>)",
|
||
"224": "<l1>add_child_at_index</l>(task: <l2>BTTask</l>, idx: <3/>)",
|
||
"225": "<l1>BTTask</l>",
|
||
"226": "<l1>clone</l>() <2/>",
|
||
"227": "<l1>BehaviorTree</l>",
|
||
"228": "<l1>editor_get_behavior_tree</l>()",
|
||
"229": "<l1>execute</l>(delta: <2/>)",
|
||
"230": "<l1>get_child</l>(idx: <2/>) <3/>",
|
||
"231": "<l1>get_child_count</l>() <2/>",
|
||
"232": "<l1>get_child_count_excluding_comments</l>() <2/>",
|
||
"233": "<l1>get_index</l>() <2/>",
|
||
"234": "<l1>get_parent</l>() <2/>",
|
||
"235": "<l1>get_root</l>() <2/>",
|
||
"236": "<l1>get_task_name</l>()",
|
||
"237": "<l1>has_child</l>(task: <l2>BTTask</l>) <3/>",
|
||
"238": "<l1>initialize</l>(agent: <2/>, blackboard: <l3>Blackboard</l>, scene_root: <4/>)",
|
||
"239": "<l1>is_descendant_of</l>(task: <l2>BTTask</l>) <3/>",
|
||
"240": "<l1>is_root</l>() <2/>",
|
||
"241": "<l1>next_sibling</l>() <2/>",
|
||
"242": "<l1>print_tree</l>(initial_tabs: <2/> = 0)",
|
||
"243": "<l1>remove_child</l>(task: <l2>BTTask</l>)",
|
||
"244": "<l1>remove_child_at_index</l>(idx: <2/>)",
|
||
"245": "属性说明",
|
||
"246": "<1/> <b>agent</b> <l2>🔗</l>",
|
||
"247": "<1/> <b>set_agent</b>(value: <2/>)",
|
||
"248": "<1/> <b>get_agent</b>()",
|
||
"249": "agent 是 <l1>BehaviorTree</l> 实例的上下文对象。通常它是使用 <l3>BehaviorTree</l> 资源的 <l2>BTPlayer</l> 节点的父节点。",
|
||
"250": "<l1>Blackboard</l> <b>blackboard</b> <l2>🔗</l>",
|
||
"251": "<l1>Blackboard</l> <b>get_blackboard</b>()",
|
||
"252": "提供对 <l1>Blackboard</l> 的访问。黑板用于在同一 <l2>BehaviorTree</l> 的各任务之间共享数据。",
|
||
"253": "更多信息见 <l1>Blackboard</l>。",
|
||
"254": "<1/> <b>custom_name</b> = <2/> <l3>🔗</l>",
|
||
"255": "<1/> <b>set_custom_name</b>(value: <2/>)",
|
||
"256": "<1/> <b>get_custom_name</b>()",
|
||
"257": "用户为任务提供的名称。如果不为空,编辑器会用它来表示该任务。见 <l1>get_task_name</l>。",
|
||
"258": "<1/> <b>elapsed_time</b> <l2>🔗</l>",
|
||
"259": "<1/> <b>get_elapsed_time</b>()",
|
||
"260": "自任务被“进入”以来所经过的时间。见 <l1>_enter</l>。",
|
||
"261": "当任务不处于 <2/> 状态时返回 <1/>。",
|
||
"262": "<1/> <b>scene_root</b> <l2>🔗</l>",
|
||
"263": "<1/> <b>get_scene_root</b>()",
|
||
"264": "行为树所在场景的根节点(例如 <l1>BTPlayer</l> 节点的拥有者)。可用于获取 <2/> 引用。",
|
||
"265": "<b>示例:</b>",
|
||
"266": "<l1>Status</l> <b>status</b> <l2>🔗</l>",
|
||
"267": "<l1>Status</l> <b>get_status</b>()",
|
||
"268": "<l2>_tick</l> 返回的最后一次执行 <l1>Status</l>。",
|
||
"269": "方法说明",
|
||
"270": "<1/> <b>_enter</b>() <2/> <l3>🔗</l>",
|
||
"271": "当任务被“进入”时调用,即任务在不具有 <1/> <l2>status</l> 的情况下被执行时。",
|
||
"272": "在执行顺序上,它先于 <l1>_tick</l> 被调用。当主要工作开始前需要做准备时使用此方法,通常是在任务需要不止一个 tick 才能完成时。另见 <l2>execute</l>。",
|
||
"273": "<1/> <b>_exit</b>() <2/> <l3>🔗</l>",
|
||
"274": "当任务被“退出”时调用,即在 <l1>_tick</l> 返回 <2/> 或 <3/> 状态之后。另见 <l4>execute</l>。",
|
||
"275": "<1/> <b>_generate_name</b>() <2/> <3/> <l4>🔗</l>",
|
||
"276": "在未设置 <l1>custom_name</l> 时,调用它来为任务生成显示名称。见 <l2>get_task_name</l>。",
|
||
"277": "<1/> <b>_get_configuration_warnings</b>() <2/> <3/> <l4>🔗</l>",
|
||
"278": "此方法返回的字符串会作为警告消息显示在行为树编辑器中。任何重写了此方法的任务脚本都必须在文件顶部包含 <1/> 注解。",
|
||
"279": "<1/> <b>_setup</b>() <2/> <l3>🔗</l>",
|
||
"280": "在初始化阶段调用,用于初始化任务。它只会在任务第一次执行 tick 之前被调用一次。借助这个方法,你可以在任务开始执行之前为它设置所需的状态或配置。",
|
||
"281": "<l1>Status</l> <b>_tick</b>(delta: <2/>) <3/> <l4>🔗</l>",
|
||
"282": "当任务被“tick”时调用,也就是在更新过程中由 <l1>BTPlayer</l> 或 <l2>BTState</l> 执行它时。",
|
||
"283": "返回定义在 <l1>Status</l> 中的执行状态。",
|
||
"284": "<b>注意:</b>任务通过实现这个方法来执行其主要功能。",
|
||
"285": "<1/> <b>abort</b>() <l2>🔗</l>",
|
||
"286": "递归地重置该任务及其子任务。如果任务处于 <1/> 状态,它会被退出,并且其状态被重置为 <2/>。",
|
||
"287": "<1/> <b>add_child</b>(task: <l2>BTTask</l>) <l3>🔗</l>",
|
||
"288": "添加一个子任务。<1/> 会被放到子任务列表的末尾。",
|
||
"289": "<1/> <b>add_child_at_index</b>(task: <l2>BTTask</l>, idx: <3/>) <l4>🔗</l>",
|
||
"290": "添加一个子任务。<1/> 会被放到子任务列表中的 <2/> 位置。",
|
||
"291": "<l1>BTTask</l> <b>clone</b>() <2/> <l3>🔗</l>",
|
||
"292": "复制该任务及其子任务,并复制导出的成员。出于效率考虑,子资源是共享的,但 <l1>BBParam</l> 的子类型例外,它们总是会被复制。编辑器用它来实例化 <l2>BehaviorTree</l>,以及复制粘贴任务。",
|
||
"293": "<l1>BehaviorTree</l> <b>editor_get_behavior_tree</b>() <l2>🔗</l>",
|
||
"294": "返回拥有此任务的行为树。仅在编辑器中可用。",
|
||
"295": "<l1>Status</l> <b>execute</b>(delta: <2/>) <l3>🔗</l>",
|
||
"296": "执行该任务。执行遵循特定的顺序:",
|
||
"297": "如果任务当前的 <l1>status</l> 不是 <2/>,会先调用 <l3>_enter</l> 方法。",
|
||
"298": "接着调用 <l1>_tick</l> 方法来执行任务的工作。",
|
||
"299": "如果 <l1>_tick</l> 方法返回 <2/> 或 <3/> 状态,接下来会调用 <l4>_exit</l> 方法,作为执行清理的一部分。",
|
||
"300": "<l1>BTTask</l> <b>get_child</b>(idx: <2/>) <3/> <l4>🔗</l>",
|
||
"301": "通过指定索引返回一个子任务。",
|
||
"302": "<1/> <b>get_child_count</b>() <2/> <l3>🔗</l>",
|
||
"303": "返回子任务的数量。",
|
||
"304": "<1/> <b>get_child_count_excluding_comments</b>() <2/> <l3>🔗</l>",
|
||
"305": "返回子任务的数量,不把 <l1>BTComment</l> 任务计算在内。",
|
||
"306": "<1/> <b>get_index</b>() <2/> <l3>🔗</l>",
|
||
"307": "返回该任务在行为树分支中的位置。如果该任务不属于任务树(也就是没有父任务),则返回 <1/>。",
|
||
"308": "<l1>BTTask</l> <b>get_parent</b>() <2/> <l3>🔗</l>",
|
||
"309": "返回该任务的父任务。",
|
||
"310": "<l1>BTTask</l> <b>get_root</b>() <2/> <l3>🔗</l>",
|
||
"311": "返回行为树的根任务。",
|
||
"312": "<1/> <b>get_task_name</b>() <l2>🔗</l>",
|
||
"313": "此方法返回的字符串用于在编辑器中表示该任务。",
|
||
"314": "除非设置了 <l2>custom_name</l>,否则会调用 <l1>_generate_name</l> 方法为任务生成显示名称。",
|
||
"315": "<1/> <b>has_child</b>(task: <l2>BTTask</l>) <3/> <l4>🔗</l>",
|
||
"316": "如果 <2/> 是此任务的子任务,则返回 <1/>。",
|
||
"317": "<1/> <b>initialize</b>(agent: <2/>, blackboard: <l3>Blackboard</l>, scene_root: <4/>) <l5>🔗</l>",
|
||
"318": "初始化该任务。为它赋值 <l1>agent</l> 和 <l2>blackboard</l>,并对该任务及其子任务调用 <l3>_setup</l>。",
|
||
"319": "该方法会对每个子任务递归调用。<1/> 应当是行为树所在场景的根节点(例如包含该行为树的节点的拥有者)。",
|
||
"320": "<1/> <b>is_descendant_of</b>(task: <l2>BTTask</l>) <3/> <l4>🔗</l>",
|
||
"321": "如果此任务是 <2/> 的后代,则返回 <1/>。换句话说,此任务必须是 <3/> 的子任务,或者是它的子任务、孙任务之一。"
|
||
}
|