Files
agame/docs/limboai-stable/index.zh.html
T
2026-10-15 16:30:44 +08:00

4190 lines
563 KiB
HTML
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.
<!DOCTYPE html>
<html class="writer-html5" data-content_root="./" lang="en">
<head>
<meta charset="utf-8"/>
<meta content="1" name="readthedocs-addons-api-version"/><meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>LimboAI 1.0 文档</title>
<link href="_static/pygments.css?v=b86133f3" rel="stylesheet" type="text/css"/>
<link href="_static/css/theme.css?v=9edc463e" rel="stylesheet" type="text/css"/>
<link href="_static/copybutton.css?v=76b2166b" rel="stylesheet" type="text/css"/>
<link href="_static/dark_mode_css/general.css?v=c0a7eb24" rel="stylesheet" type="text/css"/>
<link href="_static/dark_mode_css/dark.css?v=70edf1c7" rel="stylesheet" type="text/css"/>
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=e731e1b3"></script>
<script src="_static/doctools.js?v=fd6eb6e6"></script>
<script src="_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
<script src="_static/copybutton.js?v=f281be69"></script>
<script src="_static/dark_mode_js/default_light.js?v=c2e647ce"></script>
<script src="_static/dark_mode_js/theme_switcher.js?v=358d3910"></script>
<script src="_static/js/theme.js"></script>
<script src="_static/js/versions.js"></script>
<link href="genindex.html" rel="index" title="Index"/>
<link href="search.html" rel="search" title="Search"/>
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav class="wy-nav-side" data-toggle="wy-nav-shift">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="#">
<img alt="Logo" class="logo" src="_static/logo.png"/>
</a><p style="font-size:0.78em;opacity:0.8;margin:0.35em 0 0.2em;">中文汉化版 · 基于官方英文文档翻译,欢迎对照原文阅读</p>
<div class="switch-menus">
<div class="version-switch"></div>
<div class="language-switch"></div>
</div>
</div><div aria-label="Navigation menu" class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation">
<p class="caption" role="heading"><span class="caption-text">开始使用</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="#document-getting-started/getting-limboai">获取 LimboAI</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-getting-started/c-sharp">在 C# 中使用 LimboAI</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-getting-started/contributing">参与贡献</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">行为树</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="#document-behavior-trees/introduction">行为树简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-behavior-trees/create-tree">创建行为树</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-behavior-trees/custom-tasks">创建自定义任务</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-behavior-trees/using-blackboard">使用 Blackboard 共享数据</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-behavior-trees/accessing-nodes">访问场景树中的节点</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">分层状态机</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="#document-hierarchical-state-machines/create-hsm">创建状态机</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">类参考</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/featured-classes">重要类</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbaabb">BBAabb</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbarray">BBArray</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbbasis">BBBasis</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbbool">BBBool</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbbytearray">BBByteArray</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbcolor">BBColor</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbcolorarray">BBColorArray</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbdictionary">BBDictionary</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbfloat">BBFloat</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbfloat32array">BBFloat32Array</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbfloat64array">BBFloat64Array</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbint">BBInt</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbint32array">BBInt32Array</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbint64array">BBInt64Array</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbnode">BBNode</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbparam">BBParam</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbplane">BBPlane</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbprojection">BBProjection</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbquaternion">BBQuaternion</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbrect2">BBRect2</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbrect2i">BBRect2i</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbstring">BBString</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbstringarray">BBStringArray</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbstringname">BBStringName</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbtransform2d">BBTransform2D</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbtransform3d">BBTransform3D</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvariant">BBVariant</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector2">BBVector2</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector2array">BBVector2Array</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector2i">BBVector2i</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector3">BBVector3</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector3array">BBVector3Array</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector3i">BBVector3i</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector4">BBVector4</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bbvector4i">BBVector4i</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_behaviortree">BehaviorTree</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_behaviortreedata">BehaviorTreeData</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_behaviortreeview">BehaviorTreeView</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_blackboard">Blackboard</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_blackboardplan">BlackboardPlan</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bt">BT</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btaction">BTAction</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btalwaysfail">BTAlwaysFail</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btalwayssucceed">BTAlwaysSucceed</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btawaitanimation">BTAwaitAnimation</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcallmethod">BTCallMethod</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcheckagentproperty">BTCheckAgentProperty</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btchecktrigger">BTCheckTrigger</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcheckvar">BTCheckVar</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcomment">BTComment</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcomposite">BTComposite</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcondition">BTCondition</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btconsoleprint">BTConsolePrint</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btcooldown">BTCooldown</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btdecorator">BTDecorator</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btdelay">BTDelay</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btdynamicselector">BTDynamicSelector</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btdynamicsequence">BTDynamicSequence</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btevaluateexpression">BTEvaluateExpression</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btfail">BTFail</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btforeach">BTForEach</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btinstance">BTInstance</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btinvert">BTInvert</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btnewscope">BTNewScope</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btparallel">BTParallel</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btpauseanimation">BTPauseAnimation</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btplayanimation">BTPlayAnimation</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btplayer">BTPlayer</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btprobability">BTProbability</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btprobabilityselector">BTProbabilitySelector</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrandomselector">BTRandomSelector</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrandomsequence">BTRandomSequence</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrandomwait">BTRandomWait</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrepeat">BTRepeat</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrepeatuntilfailure">BTRepeatUntilFailure</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrepeatuntilsuccess">BTRepeatUntilSuccess</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btrunlimit">BTRunLimit</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btselector">BTSelector</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btsequence">BTSequence</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btsetagentproperty">BTSetAgentProperty</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btsetvar">BTSetVar</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btstate">BTState</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btstopanimation">BTStopAnimation</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btsubtree">BTSubtree</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bttask">BTTask</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_bttimelimit">BTTimeLimit</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btwait">BTWait</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_btwaitticks">BTWaitTicks</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_limbohsm">LimboHSM</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_limbostate">LimboState</a></li>
<li class="toctree-l1"><a class="reference internal" href="#document-classes/class_limboutility">LimboUtility</a></li>
</ul>
</div>
</div>
</nav>
<section class="wy-nav-content-wrap" data-toggle="wy-nav-shift"><nav aria-label="Mobile navigation menu" class="wy-nav-top">
<i class="fa fa-bars" data-toggle="wy-nav-top"></i>
<a href="#">LimboAI</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div aria-label="Page navigation" role="navigation">
<ul class="wy-breadcrumbs">
<li><a aria-label="Home" class="icon icon-home" href="#"></a></li>
<li class="breadcrumb-item active">LimboAI 1.0 文档</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div class="document" itemscope="itemscope" itemtype="http://schema.org/Article" role="main">
<div itemprop="articleBody">
<section id="limboai-documentation">
<h1>LimboAI 文档<a class="headerlink" href="#limboai-documentation" title="Link to this heading"></a></h1>
<p><strong>LimboAI</strong> 是一个面向 <strong>Godot Engine 4</strong> 的开源 C++ 模块,将<strong>行为树</strong>与<strong>状态机</strong>结合在一起,用于打造你游戏的 AI。它自带行为树编辑器、内置文档、可视化调试器等!虽然它是用 C++ 实现的,但完全支持用 GDScript 来<a class="reference internal" href="#document-behavior-trees/custom-tasks#custom-tasks"><span class="std std-ref">创建你自己的任务</span></a>和状态。完整功能列表见 <a class="reference external" href="https://github.com/limbonaut/limboai#features">LimboAI GitHub</a> 页面。</p>
<p><strong>行为树</strong>是一种强大的层次结构,用于建模和控制游戏中智能体(例如角色、敌人、实体)的行为。它旨在让你更轻松地为游戏创建复杂且高度模块化的行为。想进一步了解行为树,请参阅<a class="reference internal" href="#document-behavior-trees/introduction#introduction"><span class="std std-ref">行为树简介</span></a>。</p>
<p><strong>分层状态机</strong>是一种有限状态机,允许任意状态拥有自己的子状态机。这样你就可以把一个庞大的状态机拆解为多个较小的状态机,从而应对 AI 在状态与状态转换上的复杂度。</p>
<div class="toctree-wrapper compound">
<span id="document-getting-started/getting-limboai"></span><section id="getting-limboai">
<h2>获取 LimboAI<a class="headerlink" href="#getting-limboai" title="Link to this heading"></a></h2>
<p>LimboAI 既可以作为 C++ 模块使用,也可以作为 GDExtension 共享库使用。两者之间存在一些差异。简而言之,GDExtension 版本使用起来更方便,但功能上略有受限。模块版本提供更好的编辑器体验,性能也稍好一些,但需要使用包含导出模板的自定义引擎构建。无论你选择哪种方式,你的项目都能同时兼容两者,随时可以互相切换。</p>
<p>选择你想使用的版本。如果拿不定主意,就从 GDExtension 版本开始。你随时可以改变决定 —— 两个版本完全兼容。</p>
<section id="get-gdextension-version">
<h3>获取 GDExtension 版本<a class="headerlink" href="#get-gdextension-version" title="Link to this heading"></a></h3>
<p>官方 <a class="reference external" href="https://github.com/limbonaut/limboai#getting-limboai">LimboAI GitHub</a> 页面以及资源库(Asset Library)中都提供了预编译版本。</p>
<p>GDExtension 是使用 LimboAI 插件最便捷的方式,但它有一些限制:</p>
<ul>
<li><p>不提供文档提示(tooltip)。</p></li>
<li><p>由于依赖 Godot API 中不存在的引擎类,扩展版本中无法使用便捷的 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a> 属性编辑器。</p>
<blockquote>
<div><p><strong>🛈 另见:</strong><a class="reference external" href="https://docs.godotengine.org/en/stable/tutorials/scripting/gdextension/what_is_gdextension.html#what-is-gdextension">什么是 GDExtension?</a></p>
</div></blockquote>
</li>
</ul>
<p>安装步骤:</p>
<ol class="arabic simple">
<li><p>确认你正在使用最新稳定版的 Godot 编辑器。</p></li>
<li><p>为你的 LimboAI 实验创建一个新项目。</p></li>
<li><p>在 Godot 中点击屏幕顶部的 AssetLib 标签,搜索 LimboAI 并下载。LimboAI 插件会连同示例项目文件一起下载。此时打印出的错误可以忽略,那是因为扩展库尚未加载。</p></li>
<li><p>用 Project -&gt; Reload project 重新加载项目。现在应该不会再打印任何错误了。</p></li>
<li><p>在项目文件中找到名为 showcase.tscn 的场景文件并运行它。它是示例的入口点。</p></li>
</ol>
</section>
<section id="get-module-version">
<h3>获取模块版本<a class="headerlink" href="#get-module-version" title="Link to this heading"></a></h3>
<p>官方 <a class="reference external" href="https://github.com/limbonaut/limboai#getting-limboai">LimboAI GitHub</a> 页面提供预编译版本。</p>
<p>安装步骤:</p>
<ol class="arabic simple">
<li><p>在 <a class="reference external" href="https://github.com/limbonaut/limboai/releases/">GitHub releases</a> 中,下载适用于你平台的最新预编译发行版。</p></li>
<li><p>从同一个发行版中下载示例项目压缩包。</p></li>
<li><p>解压预编译编辑器与示例项目文件。</p></li>
<li><p>启动预编译的编辑器可执行文件,导入并打开示例项目。</p></li>
<li><p>运行项目。</p></li>
</ol>
<p><strong>重要</strong>:使用模块版 LimboAI 导出游戏时,请务必使用同一个 GitHub 发行版构建中附带的预编译导出模板。</p>
</section>
</section>
<span id="document-getting-started/c-sharp"></span><section id="using-limboai-with-c">
<span id="csharp"></span><h2>在 C# 中使用 LimboAI<a class="headerlink" href="#using-limboai-with-c" title="Link to this heading"></a></h2>
<p>下面介绍如何使用模块版本配合 C# 编写你的任务和状态。</p>
<ol class="arabic simple">
<li><p>找到 LimboAI 的 NuGet 包文件。</p></li>
</ol>
<p>每个提供的构建都带有 GodotSharp 文件夹,其中的包位于 “GodotSharp/Tools/nupkgs/” 下。记下该目录路径,下一步会用到。</p>
<ol class="arabic simple" start="2">
<li><p>使用以下命令添加一个本地 NuGet 包源:</p></li>
</ol>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>dotnet<span class="w"> </span>nuget<span class="w"> </span>add<span class="w"> </span><span class="nb">source</span><span class="w"> </span>path/to/limboai/nupkgs<span class="w"> </span>--name<span class="w"> </span>LimboNugetSource
</pre></div>
</div>
<ol class="arabic simple" start="3">
<li><p>你的 C# 项目应该就能看到 LimboAI 的类并成功编译。</p></li>
</ol>
<p>关于 GDExtension,目前我只能确认模块版本与 C# 可以正常工作。遗憾的是,我在 GDExtension 版本上还没有成功过。如果你用 GDExtension 成功了,请通过 Discord 或邮件告诉我。</p>
</section>
<span id="document-getting-started/contributing"></span><section id="contributing">
<span id="id1"></span><h2>参与贡献<a class="headerlink" href="#contributing" title="Link to this heading"></a></h2>
<p>在 Godot 发布第三个 beta 或候选版本之前,我们以 Godot 引擎的最新稳定版作为开发目标。如果你想为本项目做贡献,请确保使用对应的 Godot 版本。</p>
<p>我们遵循 <a class="reference external" href="https://docs.godotengine.org/en/stable/contributing/development/code_style_guidelines.html#doc-code-style-guidelines">Godot 代码风格指南</a>。请使用 <code class="docutils literal notranslate"><span class="pre">clang-format</span></code> 来保持风格一致。你可以用 <code class="docutils literal notranslate"><span class="pre">pre-commit</span> <span class="pre">install</span></code> 为 Git 安装 <code class="docutils literal notranslate"><span class="pre">pre-commit</span></code> 钩子,把这一过程自动化。</p>
<p>提交拉取请求(Pull Request)时,请保持次版本向后兼容。</p>
<p>我们支持把 LimboAI 构建为 Godot 引擎的模块,也支持构建为 GDExtension 库。请确保你的贡献在两种方式下都兼容。我们的 CI 工作流会验证你的改动能否在两种配置下都编译通过。</p>
<section id="compiling-as-module-of-the-godot-engine">
<h3>作为 Godot 引擎模块编译<a class="headerlink" href="#compiling-as-module-of-the-godot-engine" title="Link to this heading"></a></h3>
<ol class="arabic simple">
<li><p>克隆 Godot 引擎仓库。</p></li>
<li><p>切换到最新的稳定版 tag。</p></li>
<li><p>把 LimboAI 仓库克隆到 <code class="docutils literal notranslate"><span class="pre">modules/limboai</span></code> 目录中。</p></li>
</ol>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/godotengine/godot.git
git<span class="w"> </span>checkout<span class="w"> </span><span class="m">4</span>.3-stable<span class="w"> </span><span class="c1"># Replace "4.3-stable" with the latest stable tag</span>
git<span class="w"> </span>clone<span class="w"> </span>https://github.com/limbonaut/limboai<span class="w"> </span>modules/limboai
</pre></div>
</div>
<p>详细的引擎构建说明请参考 <a class="reference external" href="https://docs.godotengine.org/en/stable/engine_details/development/compiling/index.html">Godot 引擎文档</a>。</p>
<p>使用 <code class="docutils literal notranslate"><span class="pre">tests=yes</span></code> 构建选项可以编译<strong>单元测试</strong>。要运行它们,请带上 <code class="docutils literal notranslate"><span class="pre">--test</span> <span class="pre">--tc="*[LimboAI]*"</span></code> 命令行选项运行编译好的 Godot 可执行文件。</p>
<section id="building-c-packages">
<h4>构建 C# 包<a class="headerlink" href="#building-c-packages" title="Link to this heading"></a></h4>
<p>如果你希望从源码构建时启用 LimboAI 的 C# 支持,请按照 Godot 关于带 C# 支持从源码构建的说明操作:<a class="reference external" href="https://docs.godotengine.org/en/stable/engine_details/development/compiling/compiling_with_dotnet.html">使用 .NET 编译</a>。LimboAI 的类会包含在该构建流程的输出中。</p>
</section>
</section>
<section id="compiling-as-gdextension-library">
<h3>作为 GDExtension 库编译<a class="headerlink" href="#compiling-as-gdextension-library" title="Link to this heading"></a></h3>
<p>你需要 SCons 构建工具和一个 C++ 编译器。另见<a class="reference external" href="https://docs.godotengine.org/en/stable/engine_details/development/compiling/index.html">编译</a>。运行 <code class="docutils literal notranslate"><span class="pre">scons</span> <span class="pre">target=editor</span></code> 即可为你当前的平台构建插件库。</p>
<ul class="simple">
<li><p>如果 <code class="docutils literal notranslate"><span class="pre">limboai/godot-cpp</span></code> 目录中还没有 <code class="docutils literal notranslate"><span class="pre">godot-cpp</span></code> 仓库,SCons 会自动克隆它。</p></li>
<li><p>默认情况下,构建产物会被放到示例项目中:<code class="docutils literal notranslate"><span class="pre">demo/addons/limboai/bin/</span></code>。</p></li>
</ul>
<p>其他选项与目标请查看 <code class="docutils literal notranslate"><span class="pre">scons</span> <span class="pre">-h</span></code>。</p>
</section>
<section id="contributing-to-the-documentation">
<h3>为文档做贡献<a class="headerlink" href="#contributing-to-the-documentation" title="Link to this heading"></a></h3>
<p>在线文档使用 <a class="reference external" href="https://www.sphinx-doc.org/en/master/">Sphinx</a> 生成。源文件以 RST 格式放在 <code class="docutils literal notranslate"><span class="pre">doc/source</span></code> 目录中,可以在本地用 <code class="docutils literal notranslate"><span class="pre">sphinx-build</span></code> 构建。更多细节请参阅 <a class="reference external" href="https://www.sphinx-doc.org/en/master/tutorial/getting-started.html">Sphinx 文档</a>。</p>
<p>类文档存放在 <code class="docutils literal notranslate"><span class="pre">doc_classes/</span></code> 目录下的 XML 文件中。如果你新建了类或修改了已有类,可以在 Godot 源码根目录下用 <code class="docutils literal notranslate"><span class="pre">--doctool</span></code> 选项运行编译好的 Godot 可执行文件,用来生成缺失的 XML 文件或类文档中对应文件的缺失片段。编辑完 XML 文件后,请再次用 <code class="docutils literal notranslate"><span class="pre">--doctool</span></code> 选项运行编译好的编辑器可执行文件,以更新并整理这些 XML 文件。</p>
<p>类文档的 Sphinx RST 文件由 XML 文件经 Godot 脚本 <code class="docutils literal notranslate"><span class="pre">make_rst.py</span></code> 生成,并保存在 <code class="docutils literal notranslate"><span class="pre">doc/source/classes</span></code> 目录中。该过程由我们自己的脚本 <code class="docutils literal notranslate"><span class="pre">scripts/update_rst.sh</span></code> 完成。<code class="docutils literal notranslate"><span class="pre">doc/source/classes</span></code> 中的 RST 文件不应手动编辑。</p>
</section>
</section>
</div>
<div class="toctree-wrapper compound">
<span id="document-behavior-trees/introduction"></span><section id="introduction-to-behavior-trees">
<span id="introduction"></span><h2>行为树简介<a class="headerlink" href="#introduction-to-behavior-trees" title="Link to this heading"></a></h2>
<blockquote>
<div><p><strong>🛈 注意:</strong>示例项目中包含一个教程,通过直观的示例带你入门行为树。</p>
</div></blockquote>
<p><strong>行为树(BT)</strong>是一种层次结构,用于建模和控制游戏中智能体(例如角色、敌人、实体)的行为。它旨在让你更轻松地为游戏创建复杂且高度模块化的行为。</p>
<p>行为树由若干任务组成,这些任务代表具体的动作或决策规则。任务大致可分为两大类:控制任务和叶任务。<strong>控制任务</strong>决定树内的执行流程,包括 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">Sequence</span></a>、<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">Selector</span></a> 和 <a class="reference internal" href="#document-classes/class_btinvert#class-btinvert"><span class="std std-ref">Invert</span></a>。<strong>叶任务</strong>代表要执行的具体动作(例如移动或攻击),或是需要检查的条件。<a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 类为行为树的各种积木块提供了基础。这类任务可以<a class="reference internal" href="#document-behavior-trees/using-blackboard#blackboard"><span class="std std-ref">通过 Blackboard 共享数据</span></a>。</p>
<blockquote>
<div><p><strong>🛈 注意:</strong>要<a class="reference internal" href="#document-behavior-trees/custom-tasks#custom-tasks"><span class="std std-ref">创建你自己的动作</span></a>,请继承 <a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> 类。</p>
</div></blockquote>
<p>行为树通常每一帧都会处理一次。它自上而下遍历,由控制任务决定控制流。每个任务都有一个 <a class="reference internal" href="#document-classes/class_bttask#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 方法,负责执行任务的工作并返回表示进度的状态:<code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>、<code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 或 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。<code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 和 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 表示已完成工作的结果,而当一个任务需要不止一个 tick 才能完成时,就会返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 状态。这些状态决定树的推进方式,其中 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 状态通常意味着树会在下一帧继续执行。</p>
<p>任务共有<em>四种类型</em>:</p>
<ul class="simple">
<li><p><strong>动作(Actions)</strong>是执行实际工作的叶任务。</p>
<ul>
<li><p>例如:<a class="reference internal" href="#document-classes/class_btplayanimation#class-btplayanimation"><span class="std std-ref">PlayAnimation</span></a>、<a class="reference internal" href="#document-classes/class_btwait#class-btwait"><span class="std std-ref">Wait</span></a>。</p></li>
</ul>
</li>
<li><p><strong>条件(Conditions)</strong>是执行各种检查的叶任务。</p>
<ul>
<li><p>例如:<a class="reference internal" href="#document-classes/class_btcheckvar#class-btcheckvar"><span class="std std-ref">CheckVar</span></a>、<a class="reference internal" href="#document-behavior-trees/custom-tasks#example-in-range"><span class="std std-ref">InRange</span></a>。</p></li>
</ul>
</li>
<li><p><strong>组合任务(Composites)</strong>可以拥有一个或多个子任务,并决定子任务的执行流程。</p>
<ul>
<li><p>例如:<a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">Sequence</span></a>、<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">Selector</span></a>、<a class="reference internal" href="#document-classes/class_btparallel#class-btparallel"><span class="std std-ref">Parallel</span></a>。</p></li>
</ul>
</li>
<li><p><strong>装饰器(Decorators)</strong>只能拥有一个子任务,用于改变其子任务的运行方式。</p>
<ul>
<li><p>例如:<a class="reference internal" href="#document-classes/class_btalwayssucceed#class-btalwayssucceed"><span class="std std-ref">AlwaysSucceed</span></a>、<a class="reference internal" href="#document-classes/class_btinvert#class-btinvert"><span class="std std-ref">Invert</span></a>、<a class="reference internal" href="#document-classes/class_bttimelimit#class-bttimelimit"><span class="std std-ref">TimeLimit</span></a>。</p></li>
</ul>
</li>
</ul>
<p><a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">Sequence</span></a> 是核心组合任务之一。它按顺序从第一个到最后一个执行子任务,直到其中一个返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,或者全部返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。换句话说,只要有任一子任务返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,<a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">Sequence</span></a> 的执行就会被中止,并且 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">Sequence</span></a> 自身会返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p><a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">Selector</span></a> 是另一个必不可少的组合任务。它按顺序从第一个到最后一个执行子任务,直到其中一个返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或全部返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。换句话说,当某个子任务返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时,它就继续尝试下一个,直到找到那个返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的子任务。一旦某个子任务返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">Selector</span></a> 就会停止,并同样返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">Selector</span></a> 的目的就是找出一个能够成功的子任务。</p>
<p>行为树通过<strong>条件任务</strong>来处理条件逻辑。这些任务检查特定条件,并根据智能体或其环境的状态返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>(例如 “IsLowOnHealth”、“IsTargetInSight”)。条件可以与 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">Sequence</span></a> 和 <a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">Selector</span></a> 搭配使用,构建你的决策逻辑。</p>
<blockquote>
<div><p><strong>🛈 注意:</strong>要<a class="reference internal" href="#document-behavior-trees/custom-tasks#custom-tasks"><span class="std std-ref">创建你自己的条件</span></a>,请继承 <a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a> 类。</p>
</div></blockquote>
<p>请查阅 <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 类的文档,它为行为树的各种积木块提供了基础。</p>
</section>
<span id="document-behavior-trees/create-tree"></span><section id="creating-behavior-trees">
<h2>创建行为树<a class="headerlink" href="#creating-behavior-trees" title="Link to this heading"></a></h2>
<p>本章介绍如何创建和调试行为树。</p>
<section id="add-a-behavior-tree-to-an-agent">
<h3>为智能体添加行为树<a class="headerlink" href="#add-a-behavior-tree-to-an-agent" title="Link to this heading"></a></h3>
<p>按照以下步骤,为新建或已有的智能体添加行为树:</p>
<ol class="arabic simple">
<li><p>为你的智能体创建一个场景文件,或者打开一个已有的场景。</p></li>
<li><p>在场景中添加一个 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a> 节点。</p></li>
<li><p>选中 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a>,在检视面板(Inspector)中新建一个行为树。</p></li>
<li><p>你也可以通过该属性的上下文菜单,把行为树保存到文件中。</p></li>
<li><p>点击行为树属性,在 LimboAI 编辑器中打开它。</p></li>
</ol>
</section>
<section id="debugging-behavior-trees">
<h3>调试行为树<a class="headerlink" href="#debugging-behavior-trees" title="Link to this heading"></a></h3>
<p>在 Godot 引擎中,依次打开 “Bottom Panel &gt; Debugger &gt; LimboAI” 标签页。借助 LimboAI 调试器,你可以查看运行中的项目里任何当前处于活动状态的行为树。调试器可以从主编辑器窗口中分离出来,如果你使用 HiDPI 显示器或第二块屏幕,这会特别有用。</p>
<section id="inspecting-task-properties-and-blackboard">
<h4>查看任务属性与黑板<a class="headerlink" href="#inspecting-task-properties-and-blackboard" title="Link to this heading"></a></h4>
<p>当你在 LimboAI 调试器中点击某个任务时,它的属性会显示在远程检视面板(Remote Inspector)中,其中包含 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 引用。点击 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 可以打开它,查看整条作用域链上的所有变量,并按作用域分组。你还可以实时修改变量值,这对测试和调试游戏 AI 很有帮助。</p>
</section>
</section>
</section>
<span id="document-behavior-trees/custom-tasks"></span><section id="creating-custom-tasks">
<span id="custom-tasks"></span><h2>创建自定义任务<a class="headerlink" href="#creating-custom-tasks" title="Link to this heading"></a></h2>
<p>默认情况下,用户任务应放在 <code class="docutils literal notranslate"><span class="pre">res://ai/tasks</span></code> 目录中。你可以在 <code class="docutils literal notranslate"><span class="pre">Project</span> <span class="pre">Settings</span> <span class="pre">→</span> <span class="pre">Limbo</span> <span class="pre">AI</span></code> 中为用户任务设置其他位置(要看到这些选项,需要在项目设置中启用 <code class="docutils literal notranslate"><span class="pre">Advanced</span> <span class="pre">Settings</span></code>)。</p>
<p>用户任务目录下的每个子目录都会被当作一个分类。因此,如果你创建了一个名为 “motion_and_physics” 的子目录,其中的自定义任务会自动归类到 “Motion And Physics” 下。</p>
<p>创建自定义任务时,请<strong>继承以下基类之一</strong>:<a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a>、<a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a>、<a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a>、<a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a>。关于任务类型的更多内容,可阅读<a class="reference internal" href="#document-behavior-trees/introduction#introduction"><span class="std std-ref">行为树简介</span></a>。</p>
<blockquote>
<div><p><strong>🛈 注意:</strong>为了帮助你编写新任务,你可以通过 “Misc → Create script template” 菜单项向项目中添加脚本模板。</p>
</div></blockquote>
<p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 的使用方法见<a class="reference internal" href="#document-behavior-trees/using-blackboard#accessing-blackboard"><span class="std std-ref">在任务中访问黑板</span></a>。</p>
<section id="task-anatomy">
<h3>任务的结构<a class="headerlink" href="#task-anatomy" title="Link to this heading"></a></h3>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">tool</span>
<span class="k">extends</span><span class="w"> </span><span class="n">BTAction</span>
<span class="c1"># 任务参数。</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">parameter1</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">parameter2</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">Vector2</span>
<span class="c1">## 注意:每个方法声明都是可选的。</span>
<span class="c1">## 至少只需要定义 "_tick" 方法。</span>
<span class="c1"># 调用它来为任务生成显示名称(需要 @tool)。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_generate_name</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s2">"MyTask"</span>
<span class="c1"># 调用它来初始化任务。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_setup</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
<span class="c1"># 当任务被进入时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_enter</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
<span class="c1"># 当任务被退出时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_exit</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
<span class="c1"># 每次该任务被 tick(即被执行)时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">SUCCESS</span>
<span class="c1"># 此方法返回的字符串会作为警告显示在编辑器中。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_get_configuration_warnings</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">PackedStringArray</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">warnings</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="nb nb-Type">PackedStringArray</span><span class="p">()</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">warnings</span>
</pre></div>
</div>
</section>
<section id="example-1-a-simple-action">
<h3>示例 1:一个简单的动作<a class="headerlink" href="#example-1-a-simple-action" title="Link to this heading"></a></h3>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">tool</span>
<span class="k">extends</span><span class="w"> </span><span class="n">BTAction</span>
<span class="c1">## 显示或隐藏一个节点并返回 SUCCESS。</span>
<span class="c1">## 如果找不到该节点,返回 FAILURE。</span>
<span class="c1"># 任务参数。</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">node_path</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">NodePath</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">visible</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="bp">true</span>
<span class="c1"># 调用它来为任务生成显示名称(需要 @tool)。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_generate_name</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s2">"SetVisible </span><span class="si">%s</span><span class="s2"> node_path: </span><span class="se">\"</span><span class="si">%s</span><span class="se">\"</span><span class="s2">"</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="p">[</span><span class="n">visible</span><span class="p">,</span><span class="w"> </span><span class="n">node_path</span><span class="p">]</span>
<span class="c1"># 每次该任务被 tick(即被执行)时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">p_delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">n</span><span class="p">:</span><span class="w"> </span><span class="n">CanvasItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scene_root</span><span class="o">.</span><span class="n">get_node_or_null</span><span class="p">(</span><span class="n">node_path</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_instance_valid</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="w"> </span><span class="n">n</span><span class="o">.</span><span class="n">visible</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">visible</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">SUCCESS</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">FAILURE</span>
</pre></div>
</div>
</section>
<section id="example-2-inrange-condition">
<span id="example-in-range"></span><h3>示例 2:InRange 条件<a class="headerlink" href="#example-2-inrange-condition" title="Link to this heading"></a></h3>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">tool</span>
<span class="k">extends</span><span class="w"> </span><span class="n">BTCondition</span>
<span class="c1">## InRange 条件检查智能体是否处于目标的某个范围内,</span>
<span class="c1">## 该范围由 distance_min 和 distance_max 定义。</span>
<span class="c1">## 如果智能体处于定义的范围内,返回 SUCCESS;</span>
<span class="c1">## 否则返回 FAILURE。</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">distance_min</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">distance_max</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">target_var</span><span class="p">:</span><span class="w"> </span><span class="n">StringName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"target"</span>
<span class="k">var</span><span class="w"> </span><span class="n">_min_distance_squared</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span>
<span class="k">var</span><span class="w"> </span><span class="n">_max_distance_squared</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span>
<span class="c1"># 调用它来为任务生成显示名称。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_generate_name</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s2">"InRange (</span><span class="si">%d</span><span class="s2">, </span><span class="si">%d</span><span class="s2">) of </span><span class="si">%s</span><span class="s2">"</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="p">[</span><span class="n">distance_min</span><span class="p">,</span><span class="w"> </span><span class="n">distance_max</span><span class="p">,</span>
<span class="w"> </span><span class="n">LimboUtility</span><span class="o">.</span><span class="n">decorate_var</span><span class="p">(</span><span class="n">target_var</span><span class="p">)]</span>
<span class="c1"># 调用它来初始化任务。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_setup</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">_min_distance_squared</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">distance_min</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">distance_min</span>
<span class="w"> </span><span class="n">_max_distance_squared</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">distance_max</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">distance_max</span>
<span class="c1"># 当任务被执行时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">_delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">target</span><span class="p">:</span><span class="w"> </span><span class="n">Node2D</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">get_var</span><span class="p">(</span><span class="n">target_var</span><span class="p">,</span><span class="w"> </span><span class="nb nb-Type">null</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">is_instance_valid</span><span class="p">(</span><span class="n">target</span><span class="p">):</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">FAILURE</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">dist_sq</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">agent</span><span class="o">.</span><span class="n">global_position</span><span class="o">.</span><span class="n">distance_squared_to</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">global_position</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">dist_sq</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">_min_distance_squared</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">dist_sq</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="n">_max_distance_squared</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">SUCCESS</span>
<span class="w"> </span><span class="k">else</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">FAILURE</span>
</pre></div>
</div>
</section>
<section id="creating-tasks-in-c">
<h3>用 C# 创建任务<a class="headerlink" href="#creating-tasks-in-c" title="Link to this heading"></a></h3>
<p>自定义任务可以使用以下脚本模板:</p>
<div class="highlight-csharp notranslate"><div class="highlight"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="nn">Godot</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<span class="na">[Tool]</span>
<span class="k">public</span><span class="w"> </span><span class="k">partial</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">_CLASS_</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">_BASE_</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="nf">_GenerateName</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">"_CLASS_"</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">_Setup</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">_Enter</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">_Exit</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">Status</span><span class="w"> </span><span class="nf">_Tick</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">delta</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Status</span><span class="p">.</span><span class="n">Success</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="kt">string</span><span class="p">[]</span><span class="w"> </span><span class="nf">_GetConfigurationWarnings</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">Empty</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">&gt;</span><span class="p">();</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
</section>
<span id="document-behavior-trees/using-blackboard"></span><section id="sharing-data-using-blackboard">
<span id="blackboard"></span><h2>使用 Blackboard 共享数据<a class="headerlink" href="#sharing-data-using-blackboard" title="Link to this heading"></a></h2>
<p>为了在不同任务与状态之间共享数据,我们用到了一个称为 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 的特性。<a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 充当中央仓库,任务和状态可以在其中存取具名变量,从而实现无缝的数据交换。每个行为树或状态机实例都拥有自己专属的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。它可以存储多种数据类型,包括对象和资源。</p>
<p>借助 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>,你可以轻松地在行为树中共享数据,让行为树里的任务更加灵活。</p>
<section id="accessing-the-blackboard-in-a-task">
<span id="accessing-blackboard"></span><h3>在任务中访问黑板<a class="headerlink" href="#accessing-the-blackboard-in-a-task" title="Link to this heading"></a></h3>
<p>每个 <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 都能访问 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>,这为数据交换提供了直截了当的机制。下面是一个在 GDScript 中与 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 交互的示例:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">speed_var</span><span class="p">:</span><span class="w"> </span><span class="n">StringName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"speed"</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># 设置 "speed" 变量的值:</span>
<span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">set_var</span><span class="p">(</span><span class="n">speed_var</span><span class="p">,</span><span class="w"> </span><span class="mf">200.0</span><span class="p">)</span>
<span class="w"> </span><span class="c1"># 获取 "speed" 变量的值,如果不存在则默认为 100.0:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">speed</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">get_var</span><span class="p">(</span><span class="n">speed_var</span><span class="p">,</span><span class="w"> </span><span class="mf">100.0</span><span class="p">)</span>
<span class="w"> </span><span class="c1"># 检查 "speed" 变量是否存在:</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">has_var</span><span class="p">(</span><span class="n">speed_var</span><span class="p">):</span>
<span class="w"> </span><span class="c1"># ...</span>
</pre></div>
</div>
<p>如果你访问的变量持有对象实例,并且该实例可能为 null 或已被释放,可以这样写:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">object_var</span><span class="p">:</span><span class="w"> </span><span class="n">StringName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"object"</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># 获取存储在 "object" 变量中的对象实例。</span>
<span class="w"> </span><span class="c1"># - 重要:在 GDScript 中不要为 "obj" 指定类型</span>
<span class="w"> </span><span class="c1"># 以避免实例被释放时出错。</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">get_var</span><span class="p">(</span><span class="n">object_var</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_instance_valid</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="w"> </span><span class="c1"># ...</span>
</pre></div>
</div>
<p>建议给变量名属性加上 <code class="docutils literal notranslate"><span class="pre">_var</span></code> 后缀,如上例所示。这样检视面板就能为该变量提供更便捷的属性编辑器。这个编辑器允许你选择变量,或把它加入黑板计划(blackboard plan),并在黑板计划中不存在该变量时显示警告图标。</p>
<blockquote>
<div><p><strong>🛈 注意:</strong>在代码中设置变量时,该变量不需要事先存在。</p>
</div></blockquote>
</section>
<section id="editing-the-blackboard-plan">
<span id="editing-plan"></span><h3>编辑黑板计划(Blackboard Plan)<a class="headerlink" href="#editing-the-blackboard-plan" title="Link to this heading"></a></h3>
<p>黑板计划与每个 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源相关联,它决定 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 在每个新的 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例中如何初始化。BlackboardPlan 资源存储 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 初始化所需的默认值、类型信息和数据绑定。</p>
<p>要从黑板计划中添加、修改或删除变量,请按以下步骤操作:</p>
<ol class="arabic simple">
<li><p>打开 LimboAI 编辑器,加载你想编辑的行为树。</p></li>
<li><p>在编辑器中,点击标签页内的小按钮。这会在检视面板中打开 <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>。</p></li>
<li><p>在检视面板中点击 “Manage…” 按钮,显示黑板计划编辑器。</p></li>
<li><p>在黑板计划编辑器中,你可以添加、删除或重新排列变量,并修改它们的数据类型与提示(hint)。</p></li>
<li><p>提示会向检视面板提供关于该变量的附加信息,例如整数变量的最小值和最大值。更多内容请参阅 <a class="reference external" href="https://docs.godotengine.org/en/stable/classes/class_%40globalscope.html#enum-globalscope-propertyhint">Godot 官方文档中的属性提示</a>。</p></li>
<li><p>你可以直接在检视面板中指定变量的默认值。</p></li>
</ol>
</section>
<section id="overriding-variables-in-btplayer">
<h3>在 BTPlayer 中覆盖变量<a class="headerlink" href="#overriding-variables-in-btplayer" title="Link to this heading"></a></h3>
<p>每个 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a> 节点也有一个 “Blackboard Plan” 属性,可以覆盖 BehaviorTree 中黑板变量的值。这些覆盖只对 BTPlayer 所在的场景生效,不会影响使用同一个 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 的其他场景。要修改这些值:</p>
<ol class="arabic simple">
<li><p>在场景树中选中 BTPlayer 节点。</p></li>
<li><p>在检视面板中找到 “Blackboard Plan” 属性。</p></li>
<li><p>覆盖你想要的值,为特定场景定制黑板变量。</p></li>
</ol>
</section>
<section id="task-parameters">
<h3>任务参数<a class="headerlink" href="#task-parameters" title="Link to this heading"></a></h3>
<p>在某些情况下,让行为树任务导出参数会很有帮助,这些参数既可以<strong>绑定到黑板变量,也可以由用户直接指定</strong>。为此,LimboAI 提供了一些以 “BB” 开头的特殊参数类型,例如 <a class="reference internal" href="#document-classes/class_bbint#class-bbint"><span class="std std-ref">BBInt</span></a>、<a class="reference internal" href="#document-classes/class_bbbool#class-bbbool"><span class="std std-ref">BBBool</span></a>、<a class="reference internal" href="#document-classes/class_bbstring#class-bbstring"><span class="std std-ref">BBString</span></a>、<a class="reference internal" href="#document-classes/class_bbfloat#class-bbfloat"><span class="std std-ref">BBFloat</span></a>、<a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> 等等。完整列表请查阅 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a> 类文档。</p>
<p>用法示例:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">BTAction</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">speed</span><span class="p">:</span><span class="w"> </span><span class="n">BBFloat</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">current_speed</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">speed</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="n">scene_root</span><span class="p">,</span><span class="w"> </span><span class="n">blackboard</span><span class="p">,</span><span class="w"> </span><span class="mf">0.0</span><span class="p">)</span>
<span class="w"> </span><span class="o">...</span>
</pre></div>
</div>
</section>
<section id="connecting-variables-in-bts-to-hsms-variable-mapping">
<h3>把 BT 中的变量连接到 HSM:变量映射<a class="headerlink" href="#connecting-variables-in-bts-to-hsms-variable-mapping" title="Link to this heading"></a></h3>
<p>每个 <a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a> 都会为其 BehaviorTree 实例创建一个新的黑板作用域。由于 BehaviorTree 是可复用的资源,可以在不同上下文或不同智能体上运行,它们不会自动看到 HSM 中定义的变量。在运行时,HSM 变量通常可以通过父作用域黑板在 BT 中访问,但推荐的访问方式是通过<strong>映射(Mapping)</strong>。</p>
<div class="admonition note">
<p class="admonition-title">注意</p>
<p>要了解更多关于作用域的内容,请参阅 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
</div>
<p>当 BehaviorTree 和 HSM 各自在它们的 <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> 资源中声明变量后,编辑器会在 BlackboardPlan 检视面板中提供<strong>映射(Mapping)</strong>区域。映射是连接相关计划之间变量的既定且推荐的方式。</p>
<section id="key-points-about-mapping">
<h4>关于映射的要点<a class="headerlink" href="#key-points-about-mapping" title="Link to this heading"></a></h4>
<ul class="simple">
<li><p>映射会把两个变量连接起来,使它们在运行时表现为同一个逻辑变量。</p></li>
<li><p>被链接的变量会在两个作用域中立即同步更新 —— 它们在内存中共享同一份状态(没有轮询,也没有复制)。</p></li>
<li><p>映射是显式的:由你决定 BT 将哪些变量作为输入和输出暴露出来。</p></li>
<li><p>链接是双向的 —— 输入与输出之间没有区别。</p></li>
<li><p>映射不会自动创建新变量 —— 变量必须已经存在于两个黑板计划中,才能被链接。</p></li>
</ul>
</section>
<section id="inspector-workflow">
<h4>检视面板操作流程<a class="headerlink" href="#inspector-workflow" title="Link to this heading"></a></h4>
<ol class="arabic simple">
<li><p>分别在各 BlackboardPlan(例如 HSM 计划和 BT 计划)中定义所需的变量。</p></li>
<li><p>在场景中选中 <a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a> 节点,或选中行为树内的 <a class="reference internal" href="#document-classes/class_btsubtree#class-btsubtree"><span class="std std-ref">BTSubtree</span></a>。</p></li>
<li><p>在检视面板中选择 Blackboard Plan 属性。</p></li>
<li><p>在 BlackboardPlan 资源检视面板中,找到<strong>映射(Mapping)</strong>区域。</p></li>
<li><p>通过配对变量(<code class="docutils literal notranslate"><span class="pre">BT</span> <span class="pre">variable</span> <span class="pre">↔</span> <span class="pre">parent</span> <span class="pre">variable</span></code>)来创建映射。</p></li>
<li><p>启动时映射会被应用,变量会为运行中的实例自动建立链接。</p></li>
</ol>
</section>
<section id="programmatic-alternative-linking-variables-in-code">
<h4>编程替代方案:在代码中链接变量<a class="headerlink" href="#programmatic-alternative-linking-variables-in-code" title="Link to this heading"></a></h4>
<p>你也可以直接用 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard-method-link-var"><span class="std std-ref">Blackboard.link_var</span></a> 在代码中链接变量:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="c1"># 示例:用代码把 BT 黑板变量链接到 HSM 黑板变量</span>
<span class="c1"># 假设 `hsm` 是一个 LimboHSM 实例,`bt_state` 是一个 BTState 实例</span>
<span class="k">var</span><span class="w"> </span><span class="n">hsm_bb</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">get_blackboard</span><span class="p">()</span>
<span class="k">var</span><span class="w"> </span><span class="n">bt_bb</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="n">bt_state</span><span class="o">.</span><span class="n">get_blackboard</span><span class="p">()</span>
<span class="c1"># 注意:变量名不必相同</span>
<span class="n">bt_bb</span><span class="o">.</span><span class="n">link_var</span><span class="p">(</span><span class="s2">"target_pos"</span><span class="p">,</span><span class="w"> </span><span class="n">hsm_bb</span><span class="p">,</span><span class="w"> </span><span class="s2">"target_pos"</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="best-practices">
<h4>最佳实践<a class="headerlink" href="#best-practices" title="Link to this heading"></a></h4>
<ul class="simple">
<li><p>在 BT 自己的 BlackboardPlan 中声明所有 BT 依赖,而不要依赖父作用域。</p></li>
<li><p>使用<strong>映射(Mapping)</strong>明确声明哪些变量应与 HSM 共享。</p></li>
<li><p>优先使用基于检视面板的映射流程,以获得更好的清晰度和编辑器支持;仅在需要运行时或编程式设置时才使用 <code class="docutils literal notranslate"><span class="pre">link_var</span></code>。</p></li>
<li><p>避免在 BT 任务内部写入 <code class="docutils literal notranslate"><span class="pre">blackboard.get_parent()</span></code>,除非你有非常明确的理由,并且接受由此带来的耦合。</p></li>
</ul>
</section>
</section>
<section id="advanced-topic-blackboard-scopes">
<h3>进阶话题:黑板作用域<a class="headerlink" href="#advanced-topic-blackboard-scopes" title="Link to this heading"></a></h3>
<p>LimboAI 中的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 可以作为另一个 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 的父作用域。这意味着,如果某个变量在当前作用域中找不到,系统就会到父级 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 中查找。这样就形成了“黑板作用域链”,链中每个 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 都可以拥有自己的父作用域,而且链中黑板的数量没有上限。需要注意的是,<a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 不会修改父作用域中的值。</p>
<p>系统会自动创建作用域,以避免上下文相互独立的环境之间发生命名冲突:</p>
<ul class="simple">
<li><p>在 <a class="reference internal" href="#document-classes/class_btnewscope#class-btnewscope"><span class="std std-ref">BTNewScope</span></a> 内部。</p></li>
<li><p>在 <a class="reference internal" href="#document-classes/class_btsubtree#class-btsubtree"><span class="std std-ref">BTSubtree</span></a> 装饰器之下。</p></li>
<li><p>对于定义了非空黑板计划的 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>。</p></li>
<li><p>在 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 节点之下:会在根层级创建一个新作用域,每个 <a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a> 子节点也会获得自己独立的作用域。</p></li>
</ul>
<section id="sharing-data-between-several-agents">
<h4>在多个智能体之间共享数据<a class="headerlink" href="#sharing-data-between-several-agents" title="Link to this heading"></a></h4>
<p>黑板作用域机制也可以用来在多个智能体之间共享数据。在下面的示例中,我们有一组智能体,希望让它们共享一个共同的目标:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">BTAction</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">group_target_var</span><span class="p">:</span><span class="w"> </span><span class="n">StringName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"group_target"</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">has_var</span><span class="p">(</span><span class="n">group_target_var</span><span class="p">):</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">new_target</span><span class="p">:</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">acquire_target</span><span class="p">()</span>
<span class="w"> </span><span class="c1"># 设置组内各智能体共享的公共目标:</span>
<span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">top</span><span class="p">()</span><span class="o">.</span><span class="n">set_var</span><span class="p">(</span><span class="n">group_target_var</span><span class="p">,</span><span class="w"> </span><span class="n">new_target</span><span class="p">)</span>
<span class="w"> </span><span class="c1"># 访问组内各智能体共享的公共目标:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">target</span><span class="p">:</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">get_var</span><span class="p">(</span><span class="n">group_target_var</span><span class="p">)</span>
</pre></div>
</div>
<p>在这个示例中,<a class="reference internal" href="#document-classes/class_blackboard#class-blackboard-method-top"><span class="std std-ref">blackboard.top()</span></a> 访问 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 链的根作用域。我们通过代码把该作用域赋给组内的每个智能体:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">class_name</span><span class="w"> </span><span class="n">AgentGroup</span>
<span class="k">extends</span><span class="w"> </span><span class="n">Node2D</span>
<span class="c1">## AgentGroup 节点:管理组内各智能体共享的 Blackboard。</span>
<span class="c1">## 该节点的子节点被假定为属于同一组的智能体。</span>
<span class="c1">## 该实现假定每个智能体都有一个用于 AI 的 "BTPlayer" 节点。</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">blackboard_plan</span><span class="p">:</span><span class="w"> </span><span class="n">BlackboardPlan</span>
<span class="k">var</span><span class="w"> </span><span class="n">shared_scope</span><span class="p">:</span><span class="w"> </span><span class="n">Blackboard</span>
<span class="k">func</span><span class="w"> </span><span class="n">_ready</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">blackboard_plan</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb nb-Type">null</span><span class="p">:</span>
<span class="w"> </span><span class="n">shared_scope</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Blackboard</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>
<span class="w"> </span><span class="k">else</span><span class="p">:</span>
<span class="w"> </span><span class="n">shared_scope</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackboard_plan</span><span class="o">.</span><span class="n">create_blackboard</span><span class="p">()</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">child</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">get_children</span><span class="p">():</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">bt_player</span><span class="p">:</span><span class="w"> </span><span class="n">BTPlayer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">child</span><span class="o">.</span><span class="n">find_child</span><span class="p">(</span><span class="s2">"BTPlayer"</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_instance_valid</span><span class="p">(</span><span class="n">bt_player</span><span class="p">):</span>
<span class="w"> </span><span class="n">bt_player</span><span class="o">.</span><span class="n">blackboard</span><span class="o">.</span><span class="n">set_parent</span><span class="p">(</span><span class="n">shared_scope</span><span class="p">)</span>
</pre></div>
</div>
<p>总而言之,<a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 作用域链不仅能避免状态机、行为树与子树之间可能出现的命名冲突,还可以用来在多个智能体之间共享数据。</p>
</section>
</section>
<section id="debugging-blackboard-variables">
<h3>调试黑板变量<a class="headerlink" href="#debugging-blackboard-variables" title="Link to this heading"></a></h3>
<p>调试运行中的项目时,你可以在远程检视面板中查看 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量。在 LimboAI 调试器中点击某个任务以查看其属性,然后点击 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 引用,即可看到整条作用域链上的所有变量,并按作用域分组。变量可以实时编辑,以辅助调试。对于状态机,在远程场景树(Remote Scene Tree)中选中 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> 节点,就能以同样的方式访问它的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
</section>
</section>
<span id="document-behavior-trees/accessing-nodes"></span><section id="accessing-nodes-in-the-scene-tree">
<span id="accessing-nodes"></span><h2>访问场景树中的节点<a class="headerlink" href="#accessing-nodes-in-the-scene-tree" title="Link to this heading"></a></h2>
<p>有几种方式可以从 <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 中访问智能体场景树里的节点。</p>
<blockquote>
<div><p><strong>🛈 注意:</strong>智能体场景树的根节点可以通过 <a class="reference internal" href="#document-classes/class_bttask#class-bttask-property-scene-root"><span class="std std-ref">scene_root</span></a> 属性访问。</p>
</div></blockquote>
<section id="with-bbnode-property">
<h3>使用 <code class="docutils literal notranslate"><span class="pre">BBNode</span></code> 属性<a class="headerlink" href="#with-bbnode-property" title="Link to this heading"></a></h3>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">cast_param</span><span class="p">:</span><span class="w"> </span><span class="n">BBNode</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">node</span><span class="p">:</span><span class="w"> </span><span class="n">ShapeCast3D</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cast_param</span><span class="o">.</span><span class="n">get_value</span><span class="p">(</span><span class="n">scene_root</span><span class="p">,</span><span class="w"> </span><span class="n">blackboard</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="with-nodepath-property">
<h3>使用 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 属性<a class="headerlink" href="#with-nodepath-property" title="Link to this heading"></a></h3>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">cast_path</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">NodePath</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">node</span><span class="p">:</span><span class="w"> </span><span class="n">ShapeCast3D</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scene_root</span><span class="o">.</span><span class="n">get_node</span><span class="p">(</span><span class="n">cast_path</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="using-blackboard-plan">
<h3>使用黑板计划<a class="headerlink" href="#using-blackboard-plan" title="Link to this heading"></a></h3>
<p>你可以在编辑器中<a class="reference internal" href="#document-behavior-trees/using-blackboard#editing-plan"><span class="std std-ref">创建一个黑板变量</span></a>,类型为 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code>,并让它在 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a> 的黑板计划中指向合适的节点。默认情况下,当运行时实例化黑板时,任何 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 变量都会被替换为对应的节点实例(见 <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan-property-prefetch-nodepath-vars"><span class="std std-ref">BlackboardPlan.prefetch_nodepath_vars</span></a>)。</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">BTCondition</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">shape_var</span><span class="p">:</span><span class="w"> </span><span class="n">StringName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"shape_cast"</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">shape_cast</span><span class="p">:</span><span class="w"> </span><span class="n">ShapeCast3D</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">blackboard</span><span class="o">.</span><span class="n">get_var</span><span class="p">(</span><span class="n">shape_var</span><span class="p">)</span>
</pre></div>
</div>
<p>BTPlayer.prefetch_nodepath_vars 属性应设置为 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
</section>
</section>
</div>
<div class="toctree-wrapper compound">
<span id="document-hierarchical-state-machines/create-hsm"></span><section id="create-state-machines">
<span id="hsm"></span><h2>创建状态机<a class="headerlink" href="#create-state-machines" title="Link to this heading"></a></h2>
<p>本指南将展示如何使用 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 搭建并使用状态机。</p>
<section id="initialization">
<h3>初始化<a class="headerlink" href="#initialization" title="Link to this heading"></a></h3>
<p>要使用 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 状态机,你首先需要在代码中初始化它。这通常是在脚本的 <code class="docutils literal notranslate"><span class="pre">_ready</span></code> 函数中完成。下面是一个示例:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="err">@</span><span class="k">onready</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">hsm</span><span class="p">:</span><span class="w"> </span><span class="n">LimboHSM</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">$</span><span class="n">LimboHSM</span>
<span class="err">@</span><span class="k">onready</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">idle_state</span><span class="p">:</span><span class="w"> </span><span class="n">LimboState</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">$</span><span class="n">LimboHSM</span><span class="o">/</span><span class="n">IdleState</span>
<span class="err">@</span><span class="k">onready</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">move_state</span><span class="p">:</span><span class="w"> </span><span class="n">LimboState</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">$</span><span class="n">LimboHSM</span><span class="o">/</span><span class="n">MoveState</span>
<span class="k">func</span><span class="w"> </span><span class="n">_ready</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">_init_state_machine</span><span class="p">()</span>
<span class="k">func</span><span class="w"> </span><span class="n">_init_state_machine</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_transition</span><span class="p">(</span><span class="n">idle_state</span><span class="p">,</span><span class="w"> </span><span class="n">move_state</span><span class="p">,</span><span class="w"> </span><span class="n">idle_state</span><span class="o">.</span><span class="n">EVENT_FINISHED</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_transition</span><span class="p">(</span><span class="n">move_state</span><span class="p">,</span><span class="w"> </span><span class="n">idle_state</span><span class="p">,</span><span class="w"> </span><span class="n">move_state</span><span class="o">.</span><span class="n">EVENT_FINISHED</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">set_active</span><span class="p">(</span><span class="bp">true</span><span class="p">)</span>
</pre></div>
</div>
<p>在这个示例中,我们首先声明状态机以及要使用的各个状态。然后在 <code class="docutils literal notranslate"><span class="pre">_init_state_machine</span></code> 函数中为各状态添加转换。最后初始化状态机,并将其设为活动状态。</p>
</section>
<section id="state-example">
<h3>状态示例<a class="headerlink" href="#state-example" title="Link to this heading"></a></h3>
<p>你可以在脚本中定义状态的行为,并把该脚本挂到状态节点上。下面是一个状态示例,它会在 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 上播放动画并等待动画播放完毕:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">LimboState</span>
<span class="c1">## PlayAnimation:在 AnimationPlayer 上播放动画,并等待其播放完毕。</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">animation_player</span><span class="p">:</span><span class="w"> </span><span class="n">AnimationPlayer</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">animation_name</span><span class="p">:</span><span class="w"> </span><span class="n">StringName</span>
<span class="k">func</span><span class="w"> </span><span class="n">_enter</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">animation_player</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">animation_name</span><span class="p">)</span>
<span class="k">func</span><span class="w"> </span><span class="n">_update</span><span class="p">(</span><span class="n">_delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">animation_player</span><span class="o">.</span><span class="n">is_playing</span><span class="p">()</span><span class="w"> </span>\
<span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">animation_player</span><span class="o">.</span><span class="n">assigned_animation</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">animation_name</span><span class="p">:</span>
<span class="w"> </span><span class="n">dispatch</span><span class="p">(</span><span class="n">EVENT_FINISHED</span><span class="p">)</span>
</pre></div>
</div>
<p>在这个示例中,<code class="docutils literal notranslate"><span class="pre">_enter</span></code> 方法会在进入该状态时被调用,并播放指定的动画。<code class="docutils literal notranslate"><span class="pre">_update</span></code> 方法每帧都会被调用,用来检查动画是否播放完毕。如果已播放完毕,它就派发 <code class="docutils literal notranslate"><span class="pre">EVENT_FINISHED</span></code> 事件,从而可能转换到下一个状态。</p>
</section>
<section id="events-and-transitions">
<h3>事件与转换<a class="headerlink" href="#events-and-transitions" title="Link to this heading"></a></h3>
<p><a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 自带一套<strong>事件系统</strong>,有助于把<strong>状态转换与状态实现解耦</strong>。一个转换与特定的事件、起始状态和目标状态相关联,当该事件被派发时,转换会自动执行。</p>
<p>要注册一个转换并把它与特定事件关联,可以使用 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm-method-add-transition"><span class="std std-ref">LimboHSM.add_transition</span></a> 方法:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="n">hsm</span><span class="o">.</span><span class="n">add_transition</span><span class="p">(</span><span class="n">idle_state</span><span class="p">,</span><span class="w"> </span><span class="n">move_state</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"movement_started"</span><span class="p">)</span>
</pre></div>
</div>
<p>在这个示例中,我们注册了一个从 <code class="docutils literal notranslate"><span class="pre">idle_state</span></code> 到 <code class="docutils literal notranslate"><span class="pre">move_state</span></code> 的转换,它在 <code class="docutils literal notranslate"><span class="pre">movement_started</span></code> 事件被派发时发生。</p>
<p>转换也可以不与任何特定的起始状态关联:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="n">hsm</span><span class="o">.</span><span class="n">add_transition</span><span class="p">(</span><span class="n">hsm</span><span class="o">.</span><span class="n">ANYSTATE</span><span class="p">,</span><span class="w"> </span><span class="n">move_state</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"movement_started"</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>事件通过</strong> <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-method-dispatch"><span class="std std-ref">LimboState.dispatch</span></a> 方法<strong>派发</strong>。需要注意的是,该方法可以从状态机层级中的任何位置调用,也可以在状态机之外调用。事件会<strong>从叶状态向根状态传播</strong>。这意味着,如果某个事件被某个状态消费掉,它就不会再传播到其父状态。</p>
<p>状态还可以定义<strong>事件处理器</strong>,即对特定事件做出反应的方法。这些事件处理器通常不会导致状态转换;它们只是状态对特定事件做出反应的一种机制。你可以用 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-method-add-event-handler"><span class="std std-ref">LimboState.add_event_handler</span></a> 方法在状态中注册事件处理器:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">LimboState</span>
<span class="k">func</span><span class="w"> </span><span class="n">_setup</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">add_event_handler</span><span class="p">(</span><span class="s2">"movement_started"</span><span class="p">,</span><span class="w"> </span><span class="n">_on_movement_started</span><span class="p">)</span>
<span class="k">func</span><span class="w"> </span><span class="n">_on_movement_started</span><span class="p">(</span><span class="n">cargo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb nb-Type">null</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">bool</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># 在这里处理 "movement_started" 事件。</span>
<span class="w"> </span><span class="c1"># 调用 `dispatch()` 时可以随事件一起传入 `cargo`。</span>
<span class="w"> </span><span class="c1"># 当你需要向事件处理器传递一些数据时,这非常方便。</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="bp">true</span>
</pre></div>
</div>
<p>如果事件处理器返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>,该事件将被视为已被消费,不会再继续传播,也不会导致状态转换。</p>
</section>
<section id="state-anatomy">
<h3>状态的结构<a class="headerlink" href="#state-anatomy" title="Link to this heading"></a></h3>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">LimboState</span>
<span class="c1">## 状态初始化时调用一次。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_setup</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
<span class="c1">## 当状态被进入时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_enter</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
<span class="c1">## 当状态被退出时调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_exit</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
<span class="c1">## 当该状态处于活动状态时每帧调用。</span>
<span class="k">func</span><span class="w"> </span><span class="n">_update</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">pass</span>
</pre></div>
</div>
</section>
<section id="using-behavior-trees-with-state-machines">
<h3>把行为树与状态机结合使用<a class="headerlink" href="#using-behavior-trees-with-state-machines" title="Link to this heading"></a></h3>
<p><a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a> 是 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 中一种特殊的状态节点,它可以承载一个行为树。当 <a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a> 处于活动状态时,它每帧都会执行所承载的行为树,实际上就是把该行为树当作它的实现。</p>
<p>这样你就可以把行为树的强大能力与状态机的结构与控制结合起来。行为树非常适合定义复杂的层次化行为,而状态机则擅长管理不同行为之间的流转与转换。</p>
<p>创建好 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 之后,就可以为给定的 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">LimboHSM</span></a> 创建一个 <a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a>:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">CharacterBody2D</span>
<span class="k">var</span><span class="w"> </span><span class="n">hsm</span><span class="p">:</span><span class="w"> </span><span class="n">LimboHSM</span>
<span class="err">@</span><span class="k">export</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">behavior_tree</span><span class="p">:</span><span class="w"> </span><span class="n">BehaviorTree</span>
<span class="k">func</span><span class="w"> </span><span class="n">_ready</span><span class="p">():</span>
<span class="w"> </span><span class="n">hsm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LimboHSM</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>
<span class="w"> </span><span class="n">add_child</span><span class="p">(</span><span class="n">hsm</span><span class="p">)</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">bt_state</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="n">BTState</span><span class="p">()</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>
<span class="w"> </span><span class="n">bt_state</span><span class="o">.</span><span class="n">named</span><span class="p">(</span><span class="s2">"Supplied BT"</span><span class="p">)</span>
<span class="w"> </span><span class="c1"># 设置行为树,或使用 load("res://ai/trees/...") 调用</span>
<span class="w"> </span><span class="n">bt_state</span><span class="o">.</span><span class="n">behavior_tree</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">behavior_tree</span>
<span class="w"> </span><span class="n">bt_state</span><span class="o">.</span><span class="n">set_scene_root_hint</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_child</span><span class="p">(</span><span class="n">bt_state</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">initial_state</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bt_state</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">set_active</span><span class="p">(</span><span class="bp">true</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="single-file-state-machine-setup">
<h3>单文件状态机配置<a class="headerlink" href="#single-file-state-machine-setup" title="Link to this heading"></a></h3>
<p>在某些情况下,例如做原型或参加 Game Jam 时,把状态机代码放在单个文件里更实用。针对这类情况,<a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> <strong>支持委托(delegation)</strong>,并提供<strong>链式方法</strong>以便更轻松地完成配置。下面用一个实际的代码示例来说明:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">CharacterBody2D</span>
<span class="k">var</span><span class="w"> </span><span class="n">hsm</span><span class="p">:</span><span class="w"> </span><span class="n">LimboHSM</span>
<span class="err">@</span><span class="k">onready</span><span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">animation_player</span><span class="p">:</span><span class="w"> </span><span class="n">AnimationPlayer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">$</span><span class="n">AnimationPlayer</span>
<span class="k">func</span><span class="w"> </span><span class="n">_ready</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">_init_state_machine</span><span class="p">()</span>
<span class="k">func</span><span class="w"> </span><span class="n">_init_state_machine</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="n">hsm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LimboHSM</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>
<span class="w"> </span><span class="n">add_child</span><span class="p">(</span><span class="n">hsm</span><span class="p">)</span>
<span class="w"> </span><span class="c1"># 使用链式方法与委托来配置状态:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">idle_state</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="n">LimboState</span><span class="o">.</span><span class="n">new</span><span class="p">()</span><span class="o">.</span><span class="n">named</span><span class="p">(</span><span class="s2">"Idle"</span><span class="p">)</span><span class="w"> </span>\
<span class="w"> </span><span class="o">.</span><span class="n">call_on_enter</span><span class="p">(</span><span class="k">func</span><span class="p">():</span><span class="w"> </span><span class="n">animation_player</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="s2">"idle"</span><span class="p">))</span><span class="w"> </span>\
<span class="w"> </span><span class="o">.</span><span class="n">call_on_update</span><span class="p">(</span><span class="n">_idle_update</span><span class="p">)</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">move_state</span><span class="w"> </span><span class="p">:</span><span class="o">=</span><span class="w"> </span><span class="n">LimboState</span><span class="o">.</span><span class="n">new</span><span class="p">()</span><span class="o">.</span><span class="n">named</span><span class="p">(</span><span class="s2">"Move"</span><span class="p">)</span><span class="w"> </span>\
<span class="w"> </span><span class="o">.</span><span class="n">call_on_enter</span><span class="p">(</span><span class="k">func</span><span class="p">():</span><span class="w"> </span><span class="n">animation_player</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="s2">"walk"</span><span class="p">))</span><span class="w"> </span>\
<span class="w"> </span><span class="o">.</span><span class="n">call_on_update</span><span class="p">(</span><span class="n">_move_update</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_child</span><span class="p">(</span><span class="n">idle_state</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_child</span><span class="p">(</span><span class="n">move_state</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_transition</span><span class="p">(</span><span class="n">idle_state</span><span class="p">,</span><span class="w"> </span><span class="n">move_state</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"movement_started"</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">add_transition</span><span class="p">(</span><span class="n">move_state</span><span class="p">,</span><span class="w"> </span><span class="n">idle_state</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"movement_ended"</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">set_active</span><span class="p">(</span><span class="bp">true</span><span class="p">)</span>
<span class="k">func</span><span class="w"> </span><span class="n">_idle_update</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">dir</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">Vector2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Input</span><span class="o">.</span><span class="n">get_vector</span><span class="p">(</span>
<span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_left"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_right"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_up"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_down"</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">dir</span><span class="o">.</span><span class="n">is_zero_approx</span><span class="p">():</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">"movement_started"</span><span class="p">)</span>
<span class="k">func</span><span class="w"> </span><span class="n">_move_update</span><span class="p">(</span><span class="n">delta</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">float</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">dir</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">Vector2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Input</span><span class="o">.</span><span class="n">get_vector</span><span class="p">(</span>
<span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_left"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_right"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_up"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="s2">"ui_down"</span><span class="p">)</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">desired_velocity</span><span class="p">:</span><span class="w"> </span><span class="nb nb-Type">Vector2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dir</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">200.0</span>
<span class="w"> </span><span class="n">velocity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">desired_velocity</span>
<span class="w"> </span><span class="n">move_and_slide</span><span class="p">()</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">desired_velocity</span><span class="o">.</span><span class="n">is_zero_approx</span><span class="p">():</span>
<span class="w"> </span><span class="n">hsm</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="o">&amp;</span><span class="s2">"movement_ended"</span><span class="p">)</span>
</pre></div>
</div>
</section>
</section>
</div>
<div class="toctree-wrapper compound">
<span id="document-classes/featured-classes"></span><section id="important-classes">
<span id="featured-classes"></span><h2>重要类<a class="headerlink" href="#important-classes" title="Link to this heading"></a></h2>
<p>LimboAI 中引入了很多类。下面列出你应该了解的最重要的那些:</p>
<div class="toctree-wrapper compound">
<span id="document-classes/class_bttask"></span><section id="bttask">
<span id="class-bttask"></span><h3>BTTask<a class="headerlink" href="#bttask" title="Link to this heading"></a></h3>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a>、<a class="reference internal" href="#document-classes/class_btcomment#class-btcomment"><span class="std std-ref">BTComment</span></a>、<a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a>、<a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a>、<a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a></p>
<p>所有 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的基类。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p>所有 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的基类。任务是 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中的基本积木块,代表某个具体行为或控制流。通过按层次组合和嵌套任务,可以构建出复杂的行为。</p>
<p>任务可以是以下类型之一:动作、条件、组合或装饰器。每种任务类型都有对应的子类:<a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a>、<a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a>、<a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a>、<a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a>。</p>
<p>任务通过 <a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 方法执行工作并返回状态。状态值定义在 <a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> 中。任务可以用 <a class="reference internal" href="#class-bttask-private-method-setup"><span class="std std-ref">_setup</span></a> 方法初始化。另见 <a class="reference internal" href="#class-bttask-private-method-enter"><span class="std std-ref">_enter</span></a> 与 <a class="reference internal" href="#class-bttask-private-method-exit"><span class="std std-ref">_exit</span></a>。</p>
<p><strong>注意:</strong>不要直接继承 <strong>BTTask</strong> 来实现你自己的任务,而应继承上面提到的某个子类型。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h4>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">Node</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-property-agent"><span class="std std-ref">agent</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-property-blackboard"><span class="std std-ref">blackboard</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-property-custom-name"><span class="std std-ref">custom_name</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-property-elapsed-time"><span class="std std-ref">elapsed_time</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">Node</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-property-scene-root"><span class="std std-ref">scene_root</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-property-status"><span class="std std-ref">status</span></a></p></td>
<td></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-private-method-enter"><span class="std std-ref">_enter</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-private-method-exit"><span class="std std-ref">_exit</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-private-method-generate-name"><span class="std std-ref">_generate_name</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-private-method-get-configuration-warnings"><span class="std std-ref">_get_configuration_warnings</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-private-method-setup"><span class="std std-ref">_setup</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-abort"><span class="std std-ref">abort</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-add-child"><span class="std std-ref">add_child</span></a>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-add-child-at-index"><span class="std std-ref">add_child_at_index</span></a>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>, idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-clone"><span class="std std-ref">clone</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-editor-get-behavior-tree"><span class="std std-ref">editor_get_behavior_tree</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-execute"><span class="std std-ref">execute</span></a>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-child"><span class="std std-ref">get_child</span></a>(idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-child-count"><span class="std std-ref">get_child_count</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-child-count-excluding-comments"><span class="std std-ref">get_child_count_excluding_comments</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-index"><span class="std std-ref">get_index</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-parent"><span class="std std-ref">get_parent</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-root"><span class="std std-ref">get_root</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-get-task-name"><span class="std std-ref">get_task_name</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-has-child"><span class="std std-ref">has_child</span></a>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-initialize"><span class="std std-ref">initialize</span></a>(agent: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-is-descendant-of"><span class="std std-ref">is_descendant_of</span></a>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-is-root"><span class="std std-ref">is_root</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-next-sibling"><span class="std std-ref">next_sibling</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-print-tree"><span class="std std-ref">print_tree</span></a>(initial_tabs: <code class="docutils literal notranslate"><span class="pre">int</span></code> = 0)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-remove-child"><span class="std std-ref">remove_child</span></a>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-bttask-method-remove-child-at-index"><span class="std std-ref">remove_child_at_index</span></a>(idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h4>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h4>
<p class="classref-property" id="class-bttask-property-agent"><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>agent</strong> <a class="reference internal" href="#class-bttask-property-agent"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_agent</strong>(value: <code class="docutils literal notranslate"><span class="pre">Node</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>get_agent</strong>()</p></li>
</ul>
<p>agent 是 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例的上下文对象。通常它是使用 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源的 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a> 节点的父节点。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bttask-property-blackboard"><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>blackboard</strong> <a class="reference internal" href="#class-bttask-property-blackboard"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>get_blackboard</strong>()</p></li>
</ul>
<p>提供对 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 的访问。黑板用于在同一 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 的各任务之间共享数据。</p>
<p>更多信息见 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bttask-property-custom-name"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>custom_name</strong> = <code class="docutils literal notranslate"><span class="pre">""</span></code> <a class="reference internal" href="#class-bttask-property-custom-name"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_custom_name</strong>(value: <code class="docutils literal notranslate"><span class="pre">String</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_custom_name</strong>()</p></li>
</ul>
<p>用户为任务提供的名称。如果不为空,编辑器会用它来表示该任务。见 <a class="reference internal" href="#class-bttask-method-get-task-name"><span class="std std-ref">get_task_name</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bttask-property-elapsed-time"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>elapsed_time</strong> <a class="reference internal" href="#class-bttask-property-elapsed-time"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_elapsed_time</strong>()</p></li>
</ul>
<p>自任务被“进入”以来所经过的时间。见 <a class="reference internal" href="#class-bttask-private-method-enter"><span class="std std-ref">_enter</span></a>。</p>
<p>当任务不处于 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 状态时返回 <code class="docutils literal notranslate"><span class="pre">0</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bttask-property-scene-root"><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>scene_root</strong> <a class="reference internal" href="#class-bttask-property-scene-root"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>get_scene_root</strong>()</p></li>
</ul>
<p>行为树所在场景的根节点(例如 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a> 节点的拥有者)。可用于获取 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 引用。</p>
<p><strong>示例:</strong></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">extends</span> <span class="n">BTAction</span>
<span class="nd">@export</span> <span class="n">var</span> <span class="n">node_path</span><span class="p">:</span> <span class="n">NodePath</span>
<span class="n">func</span> <span class="n">_setup</span><span class="p">():</span>
<span class="n">var</span> <span class="n">node</span><span class="p">:</span> <span class="n">Node</span> <span class="o">=</span> <span class="n">scene_root</span><span class="o">.</span><span class="n">get_node</span><span class="p">(</span><span class="n">node_path</span><span class="p">)</span>
</pre></div>
</div>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bttask-property-status"><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>status</strong> <a class="reference internal" href="#class-bttask-property-status"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>get_status</strong>()</p></li>
</ul>
<p><a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 返回的最后一次执行 <a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a>。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-bttask-private-method-enter"><abbr title="无返回值。">void</abbr> <strong>_enter</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-bttask-private-method-enter"><span class="std std-ref">🔗</span></a></p>
<p>当任务被“进入”时调用,即任务在不具有 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> <a class="reference internal" href="#class-bttask-property-status"><span class="std std-ref">status</span></a> 的情况下被执行时。</p>
<p>在执行顺序上,它先于 <a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 被调用。当主要工作开始前需要做准备时使用此方法,通常是在任务需要不止一个 tick 才能完成时。另见 <a class="reference internal" href="#class-bttask-method-execute"><span class="std std-ref">execute</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-private-method-exit"><abbr title="无返回值。">void</abbr> <strong>_exit</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-bttask-private-method-exit"><span class="std std-ref">🔗</span></a></p>
<p>当任务被“退出”时调用,即在 <a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 状态之后。另见 <a class="reference internal" href="#class-bttask-method-execute"><span class="std std-ref">execute</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-private-method-generate-name"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>_generate_name</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-private-method-generate-name"><span class="std std-ref">🔗</span></a></p>
<p>在未设置 <a class="reference internal" href="#class-bttask-property-custom-name"><span class="std std-ref">custom_name</span></a> 时,调用它来为任务生成显示名称。见 <a class="reference internal" href="#class-bttask-method-get-task-name"><span class="std std-ref">get_task_name</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-private-method-get-configuration-warnings"><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code> <strong>_get_configuration_warnings</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-private-method-get-configuration-warnings"><span class="std std-ref">🔗</span></a></p>
<p>此方法返回的字符串会作为警告消息显示在行为树编辑器中。任何重写了此方法的任务脚本都必须在文件顶部包含 <code class="docutils literal notranslate"><span class="pre">@tool</span></code> 注解。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-private-method-setup"><abbr title="无返回值。">void</abbr> <strong>_setup</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-bttask-private-method-setup"><span class="std std-ref">🔗</span></a></p>
<p>在初始化阶段调用,用于初始化任务。它只会在任务第一次执行 tick 之前被调用一次。借助这个方法,你可以在任务开始执行之前为它设置所需的状态或配置。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-private-method-tick"><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>_tick</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">🔗</span></a></p>
<p>当任务被“tick”时调用,也就是在更新过程中由 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a> 或 <a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a> 执行它时。</p>
<p>返回定义在 <a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> 中的执行状态。</p>
<p><strong>注意:</strong>任务通过实现这个方法来执行其主要功能。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-abort"><abbr title="无返回值。">void</abbr> <strong>abort</strong>() <a class="reference internal" href="#class-bttask-method-abort"><span class="std std-ref">🔗</span></a></p>
<p>递归地重置该任务及其子任务。如果任务处于 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 状态,它会被退出,并且其状态被重置为 <code class="docutils literal notranslate"><span class="pre">FRESH</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-add-child"><abbr title="无返回值。">void</abbr> <strong>add_child</strong>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>) <a class="reference internal" href="#class-bttask-method-add-child"><span class="std std-ref">🔗</span></a></p>
<p>添加一个子任务。<code class="docutils literal notranslate"><span class="pre">task</span></code> 会被放到子任务列表的末尾。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-add-child-at-index"><abbr title="无返回值。">void</abbr> <strong>add_child_at_index</strong>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>, idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <a class="reference internal" href="#class-bttask-method-add-child-at-index"><span class="std std-ref">🔗</span></a></p>
<p>添加一个子任务。<code class="docutils literal notranslate"><span class="pre">task</span></code> 会被放到子任务列表中的 <code class="docutils literal notranslate"><span class="pre">idx</span></code> 位置。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-clone"><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>clone</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-clone"><span class="std std-ref">🔗</span></a></p>
<p>复制该任务及其子任务,并复制导出的成员。出于效率考虑,子资源是共享的,但 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a> 的子类型例外,它们总是会被复制。编辑器用它来实例化 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>,以及复制粘贴任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-editor-get-behavior-tree"><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>editor_get_behavior_tree</strong>() <a class="reference internal" href="#class-bttask-method-editor-get-behavior-tree"><span class="std std-ref">🔗</span></a></p>
<p>返回拥有此任务的行为树。仅在编辑器中可用。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-execute"><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>execute</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-bttask-method-execute"><span class="std std-ref">🔗</span></a></p>
<p>执行该任务。执行遵循特定的顺序:</p>
<ul class="simple">
<li><p>如果任务当前的 <a class="reference internal" href="#class-bttask-property-status"><span class="std std-ref">status</span></a> 不是 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,会先调用 <a class="reference internal" href="#class-bttask-private-method-enter"><span class="std std-ref">_enter</span></a> 方法。</p></li>
<li><p>接着调用 <a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 方法来执行任务的工作。</p></li>
<li><p>如果 <a class="reference internal" href="#class-bttask-private-method-tick"><span class="std std-ref">_tick</span></a> 方法返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 状态,接下来会调用 <a class="reference internal" href="#class-bttask-private-method-exit"><span class="std std-ref">_exit</span></a> 方法,作为执行清理的一部分。</p></li>
</ul>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-child"><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>get_child</strong>(idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-get-child"><span class="std std-ref">🔗</span></a></p>
<p>通过指定索引返回一个子任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-child-count"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_child_count</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-get-child-count"><span class="std std-ref">🔗</span></a></p>
<p>返回子任务的数量。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-child-count-excluding-comments"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_child_count_excluding_comments</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-get-child-count-excluding-comments"><span class="std std-ref">🔗</span></a></p>
<p>返回子任务的数量,不把 <a class="reference internal" href="#document-classes/class_btcomment#class-btcomment"><span class="std std-ref">BTComment</span></a> 任务计算在内。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-index"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_index</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-get-index"><span class="std std-ref">🔗</span></a></p>
<p>返回该任务在行为树分支中的位置。如果该任务不属于任务树(也就是没有父任务),则返回 <code class="docutils literal notranslate"><span class="pre">-1</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-parent"><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>get_parent</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-get-parent"><span class="std std-ref">🔗</span></a></p>
<p>返回该任务的父任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-root"><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>get_root</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-get-root"><span class="std std-ref">🔗</span></a></p>
<p>返回行为树的根任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-get-task-name"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_task_name</strong>() <a class="reference internal" href="#class-bttask-method-get-task-name"><span class="std std-ref">🔗</span></a></p>
<p>此方法返回的字符串用于在编辑器中表示该任务。</p>
<p>除非设置了 <a class="reference internal" href="#class-bttask-property-custom-name"><span class="std std-ref">custom_name</span></a>,否则会调用 <a class="reference internal" href="#class-bttask-private-method-generate-name"><span class="std std-ref">_generate_name</span></a> 方法为任务生成显示名称。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-has-child"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>has_child</strong>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-has-child"><span class="std std-ref">🔗</span></a></p>
<p>如果 <code class="docutils literal notranslate"><span class="pre">task</span></code> 是此任务的子任务,则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-initialize"><abbr title="无返回值。">void</abbr> <strong>initialize</strong>(agent: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>) <a class="reference internal" href="#class-bttask-method-initialize"><span class="std std-ref">🔗</span></a></p>
<p>初始化该任务。为它赋值 <a class="reference internal" href="#class-bttask-property-agent"><span class="std std-ref">agent</span></a> 和 <a class="reference internal" href="#class-bttask-property-blackboard"><span class="std std-ref">blackboard</span></a>,并对该任务及其子任务调用 <a class="reference internal" href="#class-bttask-private-method-setup"><span class="std std-ref">_setup</span></a>。</p>
<p>该方法会对每个子任务递归调用。<code class="docutils literal notranslate"><span class="pre">scene_root</span></code> 应当是行为树所在场景的根节点(例如包含该行为树的节点的拥有者)。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-is-descendant-of"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_descendant_of</strong>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-is-descendant-of"><span class="std std-ref">🔗</span></a></p>
<p>如果此任务是 <code class="docutils literal notranslate"><span class="pre">task</span></code> 的后代,则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。换句话说,此任务必须是 <code class="docutils literal notranslate"><span class="pre">task</span></code> 的子任务,或者是它的子任务、孙任务之一。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-is-root"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_root</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-is-root"><span class="std std-ref">🔗</span></a></p>
<p>如果此任务是其行为树的根任务,则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。一棵行为树只能有一个根任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-next-sibling"><a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>next_sibling</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bttask-method-next-sibling"><span class="std std-ref">🔗</span></a></p>
<p>返回父任务子任务列表中紧接在此任务之后的任务。</p>
<p>如果此任务没有父任务,或者它是父任务子任务列表中的最后一个子任务,则返回 <code class="docutils literal notranslate"><span class="pre">null</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-print-tree"><abbr title="无返回值。">void</abbr> <strong>print_tree</strong>(initial_tabs: <code class="docutils literal notranslate"><span class="pre">int</span></code> = 0) <a class="reference internal" href="#class-bttask-method-print-tree"><span class="std std-ref">🔗</span></a></p>
<p>把以此任务为起点的子树打印到控制台。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-remove-child"><abbr title="无返回值。">void</abbr> <strong>remove_child</strong>(task: <a class="reference internal" href="#class-bttask"><span class="std std-ref">BTTask</span></a>) <a class="reference internal" href="#class-bttask-method-remove-child"><span class="std std-ref">🔗</span></a></p>
<p>从子任务中移除 <code class="docutils literal notranslate"><span class="pre">task</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bttask-method-remove-child-at-index"><abbr title="无返回值。">void</abbr> <strong>remove_child_at_index</strong>(idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <a class="reference internal" href="#class-bttask-method-remove-child-at-index"><span class="std std-ref">🔗</span></a></p>
<p>从子任务中移除指定索引处的子任务。</p>
</section>
</section>
<span id="document-classes/class_btplayer"></span><section id="btplayer">
<span id="class-btplayer"></span><h3>BTPlayer<a class="headerlink" href="#btplayer" title="Link to this heading"></a></h3>
<p><strong>继承:</strong></p>
<p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源的播放器。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p><strong>BTPlayer</strong> 节点用于在运行时实例化和播放 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源。初始化期间,行为树实例会获得对智能体、<a class="reference internal" href="#class-btplayer-property-blackboard"><span class="std std-ref">blackboard</span></a> 以及当前场景根节点的引用。智能体可以通过 <a class="reference internal" href="#class-btplayer-property-agent-node"><span class="std std-ref">agent_node</span></a> 属性指定(默认是 BTPlayer 的父节点)。</p>
<p>行为树的入门介绍见 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h4>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-active"><span class="std std-ref">active</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">true</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">NodePath</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-agent-node"><span class="std std-ref">agent_node</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">NodePath("..")</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-behavior-tree"><span class="std std-ref">behavior_tree</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-blackboard"><span class="std std-ref">blackboard</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-blackboard-plan"><span class="std std-ref">blackboard_plan</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-monitor-performance"><span class="std std-ref">monitor_performance</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btplayer-property-update-mode"><span class="std std-ref">update_mode</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a></p></td>
<td><p><a class="reference internal" href="#class-btplayer-method-get-bt-instance"><span class="std std-ref">get_bt_instance</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btplayer-method-restart"><span class="std std-ref">restart</span></a>()</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btplayer-method-set-bt-instance"><span class="std std-ref">set_bt_instance</span></a>(bt_instance: <a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a>)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btplayer-method-set-scene-root-hint"><span class="std std-ref">set_scene_root_hint</span></a>(scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btplayer-method-update"><span class="std std-ref">update</span></a>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="signals">
<h4>信号<a class="headerlink" href="#signals" title="Link to this heading"></a></h4>
<p class="classref-signal" id="class-btplayer-signal-behavior-tree-finished"><strong>behavior_tree_finished</strong>(status: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <a class="reference internal" href="#class-btplayer-signal-behavior-tree-finished"><span class="std std-ref">🔗</span></a></p>
<p><strong>已废弃:</strong>请改用 <a class="reference internal" href="#class-btplayer-signal-updated"><span class="std std-ref">updated</span></a> 信号。</p>
<p>当行为树执行完毕并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时发出。</p>
<p>参数 <code class="docutils literal notranslate"><span class="pre">status</span></code> 保存行为树返回的状态。见 <a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-signal" id="class-btplayer-signal-updated"><strong>updated</strong>(status: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <a class="reference internal" href="#class-btplayer-signal-updated"><span class="std std-ref">🔗</span></a></p>
<p>当 BTPlayer 完成行为树更新时发出。</p>
<p>参数 <code class="docutils literal notranslate"><span class="pre">status</span></code> 保存行为树返回的状态。见 <a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a>。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="enumerations">
<h4>枚举<a class="headerlink" href="#enumerations" title="Link to this heading"></a></h4>
<p class="classref-enumeration" id="enum-btplayer-updatemode">enum <strong>UpdateMode</strong>: <a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-btplayer-constant-idle"><a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>IDLE</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>在空闲(idle)处理期间执行行为树。</p>
<p class="classref-enumeration-constant" id="class-btplayer-constant-physics"><a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>PHYSICS</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>在物理(physics)处理期间执行行为树。</p>
<p class="classref-enumeration-constant" id="class-btplayer-constant-manual"><a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>MANUAL</strong> = <code class="docutils literal notranslate"><span class="pre">2</span></code></p>
<p>通过调用 <a class="reference internal" href="#class-btplayer-method-update"><span class="std std-ref">update</span></a> 手动执行行为树。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h4>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h4>
<p class="classref-property" id="class-btplayer-property-active"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>active</strong> = <code class="docutils literal notranslate"><span class="pre">true</span></code> <a class="reference internal" href="#class-btplayer-property-active"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_active</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_active</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,行为树将在更新期间被执行。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayer-property-agent-node"><code class="docutils literal notranslate"><span class="pre">NodePath</span></code> <strong>agent_node</strong> = <code class="docutils literal notranslate"><span class="pre">NodePath("..")</span></code> <a class="reference internal" href="#class-btplayer-property-agent-node"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_agent_node</strong>(value: <code class="docutils literal notranslate"><span class="pre">NodePath</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">NodePath</span></code> <strong>get_agent_node</strong>()</p></li>
</ul>
<p>用作智能体的节点路径。在实例化之后再设置它不会生效。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayer-property-behavior-tree"><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>behavior_tree</strong> <a class="reference internal" href="#class-btplayer-property-behavior-tree"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_behavior_tree</strong>(value: <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>get_behavior_tree</strong>()</p></li>
</ul>
<p>要在运行时实例化并执行的 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayer-property-blackboard"><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>blackboard</strong> <a class="reference internal" href="#class-btplayer-property-blackboard"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_blackboard</strong>(value: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>get_blackboard</strong>()</p></li>
</ul>
<p>保存行为树各任务共享的数据。见 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayer-property-blackboard-plan"><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>blackboard_plan</strong> <a class="reference internal" href="#class-btplayer-property-blackboard-plan"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_blackboard_plan</strong>(value: <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>get_blackboard_plan</strong>()</p></li>
</ul>
<p>存储并管理用于构建新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 实例的变量。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayer-property-monitor-performance"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>monitor_performance</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btplayer-property-monitor-performance"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_monitor_performance</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_monitor_performance</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,会为此 <strong>BTPlayer</strong> 节点的每个实例在 “Debugger-&gt;Monitors” 中添加一个性能监视器。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayer-property-update-mode"><a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>update_mode</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-btplayer-property-update-mode"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_update_mode</strong>(value: <a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a>)</p></li>
<li><p><a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>get_update_mode</strong>()</p></li>
</ul>
<p>决定行为树何时执行。见 <a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a>。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-btplayer-method-get-bt-instance"><a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a> <strong>get_bt_instance</strong>() <a class="reference internal" href="#class-btplayer-method-get-bt-instance"><span class="std std-ref">🔗</span></a></p>
<p>返回行为树实例。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btplayer-method-restart"><abbr title="无返回值。">void</abbr> <strong>restart</strong>() <a class="reference internal" href="#class-btplayer-method-restart"><span class="std std-ref">🔗</span></a></p>
<p>重置行为树的执行。所有正在运行的任务都会被中止,下一次树执行会从头开始。此方法不会重置 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btplayer-method-set-bt-instance"><abbr title="无返回值。">void</abbr> <strong>set_bt_instance</strong>(bt_instance: <a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a>) <a class="reference internal" href="#class-btplayer-method-set-bt-instance"><span class="std std-ref">🔗</span></a></p>
<p>设置要播放的 <a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a>。当你想在运行时切换到另一个行为树实例时,这个方法很有用。另见 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree-method-instantiate"><span class="std std-ref">BehaviorTree.instantiate</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btplayer-method-set-scene-root-hint"><abbr title="无返回值。">void</abbr> <strong>set_scene_root_hint</strong>(scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>) <a class="reference internal" href="#class-btplayer-method-set-scene-root-hint"><span class="std std-ref">🔗</span></a></p>
<p>设置新实例化的行为树要使用的场景根节点 <code class="docutils literal notranslate"><span class="pre">Node</span></code>。应当在 <strong>BTPlayer</strong> 被加入场景树之前调用(即 <code class="docutils literal notranslate"><span class="pre">NOTIFICATION_READY</span></code> 之前)。当你需要用代码动态创建 <strong>BTPlayer</strong> 节点时,这通常很有用。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btplayer-method-update"><abbr title="无返回值。">void</abbr> <strong>update</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-btplayer-method-update"><span class="std std-ref">🔗</span></a></p>
<p>如果 <a class="reference internal" href="#class-btplayer-property-active"><span class="std std-ref">active</span></a> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,则执行行为树实例的根任务。当 <a class="reference internal" href="#class-btplayer-property-update-mode"><span class="std std-ref">update_mode</span></a> 设为 <a class="reference internal" href="#class-btplayer-constant-manual"><span class="std std-ref">MANUAL</span></a> 时调用此方法。当 <a class="reference internal" href="#class-btplayer-property-update-mode"><span class="std std-ref">update_mode</span></a> 不是 <a class="reference internal" href="#class-btplayer-constant-manual"><span class="std std-ref">MANUAL</span></a> 时,会自动调用 <a class="reference internal" href="#class-btplayer-method-update"><span class="std std-ref">update</span></a>。见 <a class="reference internal" href="#enum-btplayer-updatemode"><span class="std std-ref">UpdateMode</span></a>。</p>
</section>
</section>
<span id="document-classes/class_blackboard"></span><section id="blackboard">
<span id="class-blackboard"></span><h3>Blackboard<a class="headerlink" href="#blackboard" title="Link to this heading"></a></h3>
<p><strong>继承:</strong></p>
<p>用于在 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 状态与 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务之间共享数据的键值存储。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p>Blackboard 是 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 系统中的状态与 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中的任务之间存储和共享数据的地方。<a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中的每个状态和任务都能访问这个 Blackboard,从而可以读取和写入数据。这让不同动作与行为之间共享信息变得非常简单。</p>
<p>Blackboard 也可以充当另一个 Blackboard 的父作用域。如果在当前作用域中找不到某个变量,它就会到父级 Blackboard 中查找。父级 Blackboard 本身也可以拥有自己的父作用域,从而形成我们所说的“黑板作用域链”。重要的是,这条链中 Blackboard 的数量没有上限,而且 Blackboard 不会修改父作用域中的值。</p>
<p>可以用 <a class="reference internal" href="#document-classes/class_btnewscope#class-btnewscope"><span class="std std-ref">BTNewScope</span></a> 和 <a class="reference internal" href="#document-classes/class_btsubtree#class-btsubtree"><span class="std std-ref">BTSubtree</span></a> 装饰器创建新作用域。此外,对于任何定义了非空 Blackboard 数据的 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>,或任何根层级的 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 节点,都会自动创建一个新作用域。</p>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-bind-var-to-property"><span class="std std-ref">bind_var_to_property</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, object: <code class="docutils literal notranslate"><span class="pre">Object</span></code>, property: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, create: <code class="docutils literal notranslate"><span class="pre">bool</span></code> = false)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-clear"><span class="std std-ref">clear</span></a>()</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-erase-var"><span class="std std-ref">erase_var</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-get-parent"><span class="std std-ref">get_parent</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">Variant</span></code></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-get-var"><span class="std std-ref">get_var</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, default: <code class="docutils literal notranslate"><span class="pre">Variant</span></code> = null, complain: <code class="docutils literal notranslate"><span class="pre">bool</span></code> = true) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">Dictionary</span></code></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-get-vars-as-dict"><span class="std std-ref">get_vars_as_dict</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-has-var"><span class="std std-ref">has_var</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-link-var"><span class="std std-ref">link_var</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, target_blackboard: <a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a>, target_var: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, create: <code class="docutils literal notranslate"><span class="pre">bool</span></code> = false)</p></td>
</tr>
<tr class="row-odd"><td><p>Array[<code class="docutils literal notranslate"><span class="pre">StringName</span></code>]</p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-list-vars"><span class="std std-ref">list_vars</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-populate-from-dict"><span class="std std-ref">populate_from_dict</span></a>(dictionary: <code class="docutils literal notranslate"><span class="pre">Dictionary</span></code>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-print-state"><span class="std std-ref">print_state</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-set-parent"><span class="std std-ref">set_parent</span></a>(blackboard: <a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-set-var"><span class="std std-ref">set_var</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, value: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-top"><span class="std std-ref">top</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboard-method-unbind-var"><span class="std std-ref">unbind_var</span></a>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-blackboard-method-bind-var-to-property"><abbr title="无返回值。">void</abbr> <strong>bind_var_to_property</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, object: <code class="docutils literal notranslate"><span class="pre">Object</span></code>, property: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, create: <code class="docutils literal notranslate"><span class="pre">bool</span></code> = false) <a class="reference internal" href="#class-blackboard-method-bind-var-to-property"><span class="std std-ref">🔗</span></a></p>
<p>在变量与由 <code class="docutils literal notranslate"><span class="pre">property</span></code> 和 <code class="docutils literal notranslate"><span class="pre">object</span></code> 指定的对象属性之间建立绑定。变量发生变化会更新该属性,反之亦然。如果 <code class="docutils literal notranslate"><span class="pre">create</span></code> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,则变量不存在时会被创建。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-clear"><abbr title="无返回值。">void</abbr> <strong>clear</strong>() <a class="reference internal" href="#class-blackboard-method-clear"><span class="std std-ref">🔗</span></a></p>
<p>从 Blackboard 中移除所有变量。父作用域不受影响。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-erase-var"><abbr title="无返回值。">void</abbr> <strong>erase_var</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <a class="reference internal" href="#class-blackboard-method-erase-var"><span class="std std-ref">🔗</span></a></p>
<p>按名称移除一个变量。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-get-parent"><a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>get_parent</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-get-parent"><span class="std std-ref">🔗</span></a></p>
<p>返回作为此实例父作用域的 Blackboard。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-get-var"><code class="docutils literal notranslate"><span class="pre">Variant</span></code> <strong>get_var</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, default: <code class="docutils literal notranslate"><span class="pre">Variant</span></code> = null, complain: <code class="docutils literal notranslate"><span class="pre">bool</span></code> = true) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-get-var"><span class="std std-ref">🔗</span></a></p>
<p>返回变量值;如果变量不存在则返回 <code class="docutils literal notranslate"><span class="pre">default</span></code>。如果 <code class="docutils literal notranslate"><span class="pre">complain</span></code> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,变量不存在时会打印错误。如果该变量在当前 <strong>Blackboard</strong> 作用域中不存在,它会在父作用域 <strong>Blackboard</strong> 中查找。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-get-vars-as-dict"><code class="docutils literal notranslate"><span class="pre">Dictionary</span></code> <strong>get_vars_as_dict</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-get-vars-as-dict"><span class="std std-ref">🔗</span></a></p>
<p>以字典形式返回 Blackboard 中的所有变量。键是变量名,值是变量值。不包含父作用域。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-has-var"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>has_var</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-has-var"><span class="std std-ref">🔗</span></a></p>
<p>如果 Blackboard 包含 <code class="docutils literal notranslate"><span class="pre">var_name</span></code> 变量(含父作用域),则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-link-var"><abbr title="无返回值。">void</abbr> <strong>link_var</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, target_blackboard: <a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a>, target_var: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, create: <code class="docutils literal notranslate"><span class="pre">bool</span></code> = false) <a class="reference internal" href="#class-blackboard-method-link-var"><span class="std std-ref">🔗</span></a></p>
<p>把一个变量链接到另一个 Blackboard 变量。如果一个变量被链接到另一个变量,它们的状态将始终一致,任何一方发生变化都会反映到另一方。如果 <code class="docutils literal notranslate"><span class="pre">create</span></code> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,则变量不存在时会被创建。</p>
<p>你可以用这个方法把当前作用域中的变量链接到另一个作用域或另一个 Blackboard 实例中的变量。一个变量只能链接到另一个变量。再次调用此方法会覆盖之前的链接。不过,同一个变量可以被多个不同的变量链接。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-list-vars">Array[<code class="docutils literal notranslate"><span class="pre">StringName</span></code>] <strong>list_vars</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-list-vars"><span class="std std-ref">🔗</span></a></p>
<p>返回 Blackboard 中所有变量的名称。不包含父作用域。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-populate-from-dict"><abbr title="无返回值。">void</abbr> <strong>populate_from_dict</strong>(dictionary: <code class="docutils literal notranslate"><span class="pre">Dictionary</span></code>) <a class="reference internal" href="#class-blackboard-method-populate-from-dict"><span class="std std-ref">🔗</span></a></p>
<p>用字典中的多个变量填充 Blackboard。字典的键必须是变量名,字典的值必须是变量值。键必须是 StringName 或 String。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-print-state"><abbr title="无返回值。">void</abbr> <strong>print_state</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-print-state"><span class="std std-ref">🔗</span></a></p>
<p>打印每个作用域中所有变量的值。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-set-parent"><abbr title="无返回值。">void</abbr> <strong>set_parent</strong>(blackboard: <a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a>) <a class="reference internal" href="#class-blackboard-method-set-parent"><span class="std std-ref">🔗</span></a></p>
<p>赋值父作用域。如果某个值不在当前 Blackboard 作用域中,它会在父作用域 Blackboard 中查找。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-set-var"><abbr title="无返回值。">void</abbr> <strong>set_var</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, value: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>) <a class="reference internal" href="#class-blackboard-method-set-var"><span class="std std-ref">🔗</span></a></p>
<p>为当前 Blackboard 作用域中的变量赋值。如果变量不存在,它会被创建。如果该变量已存在于父作用域中,父作用域的值不会被修改。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-top"><a class="reference internal" href="#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>top</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboard-method-top"><span class="std std-ref">🔗</span></a></p>
<p>返回作用域链中最顶层的 <strong>Blackboard</strong>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboard-method-unbind-var"><abbr title="无返回值。">void</abbr> <strong>unbind_var</strong>(var_name: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <a class="reference internal" href="#class-blackboard-method-unbind-var"><span class="std std-ref">🔗</span></a></p>
<p>移除变量的绑定。</p>
</section>
</section>
<span id="document-classes/class_bbparam"></span><section id="bbparam">
<span id="class-bbparam"></span><h3>BBParam<a class="headerlink" href="#bbparam" title="Link to this heading"></a></h3>
<p><strong>继承:</strong></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_bbaabb#class-bbaabb"><span class="std std-ref">BBAabb</span></a>、<a class="reference internal" href="#document-classes/class_bbarray#class-bbarray"><span class="std std-ref">BBArray</span></a>、<a class="reference internal" href="#document-classes/class_bbbasis#class-bbbasis"><span class="std std-ref">BBBasis</span></a>、<a class="reference internal" href="#document-classes/class_bbbool#class-bbbool"><span class="std std-ref">BBBool</span></a>、<a class="reference internal" href="#document-classes/class_bbbytearray#class-bbbytearray"><span class="std std-ref">BBByteArray</span></a>、<a class="reference internal" href="#document-classes/class_bbcolor#class-bbcolor"><span class="std std-ref">BBColor</span></a>、<a class="reference internal" href="#document-classes/class_bbcolorarray#class-bbcolorarray"><span class="std std-ref">BBColorArray</span></a>、<a class="reference internal" href="#document-classes/class_bbdictionary#class-bbdictionary"><span class="std std-ref">BBDictionary</span></a>、<a class="reference internal" href="#document-classes/class_bbfloat#class-bbfloat"><span class="std std-ref">BBFloat</span></a>、<a class="reference internal" href="#document-classes/class_bbfloat32array#class-bbfloat32array"><span class="std std-ref">BBFloat32Array</span></a>、<a class="reference internal" href="#document-classes/class_bbfloat64array#class-bbfloat64array"><span class="std std-ref">BBFloat64Array</span></a>、<a class="reference internal" href="#document-classes/class_bbint#class-bbint"><span class="std std-ref">BBInt</span></a>、<a class="reference internal" href="#document-classes/class_bbint32array#class-bbint32array"><span class="std std-ref">BBInt32Array</span></a>、<a class="reference internal" href="#document-classes/class_bbint64array#class-bbint64array"><span class="std std-ref">BBInt64Array</span></a>、<a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>、<a class="reference internal" href="#document-classes/class_bbplane#class-bbplane"><span class="std std-ref">BBPlane</span></a>、<a class="reference internal" href="#document-classes/class_bbprojection#class-bbprojection"><span class="std std-ref">BBProjection</span></a>、<a class="reference internal" href="#document-classes/class_bbquaternion#class-bbquaternion"><span class="std std-ref">BBQuaternion</span></a>、<a class="reference internal" href="#document-classes/class_bbrect2#class-bbrect2"><span class="std std-ref">BBRect2</span></a>、<a class="reference internal" href="#document-classes/class_bbrect2i#class-bbrect2i"><span class="std std-ref">BBRect2i</span></a>、<a class="reference internal" href="#document-classes/class_bbstring#class-bbstring"><span class="std std-ref">BBString</span></a>、<a class="reference internal" href="#document-classes/class_bbstringarray#class-bbstringarray"><span class="std std-ref">BBStringArray</span></a>、<a class="reference internal" href="#document-classes/class_bbstringname#class-bbstringname"><span class="std std-ref">BBStringName</span></a>、<a class="reference internal" href="#document-classes/class_bbtransform2d#class-bbtransform2d"><span class="std std-ref">BBTransform2D</span></a>、<a class="reference internal" href="#document-classes/class_bbtransform3d#class-bbtransform3d"><span class="std std-ref">BBTransform3D</span></a>、<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>、<a class="reference internal" href="#document-classes/class_bbvector2#class-bbvector2"><span class="std std-ref">BBVector2</span></a>、<a class="reference internal" href="#document-classes/class_bbvector2array#class-bbvector2array"><span class="std std-ref">BBVector2Array</span></a>、<a class="reference internal" href="#document-classes/class_bbvector2i#class-bbvector2i"><span class="std std-ref">BBVector2i</span></a>、<a class="reference internal" href="#document-classes/class_bbvector3#class-bbvector3"><span class="std std-ref">BBVector3</span></a>、<a class="reference internal" href="#document-classes/class_bbvector3array#class-bbvector3array"><span class="std std-ref">BBVector3Array</span></a>、<a class="reference internal" href="#document-classes/class_bbvector3i#class-bbvector3i"><span class="std std-ref">BBVector3i</span></a>、<a class="reference internal" href="#document-classes/class_bbvector4#class-bbvector4"><span class="std std-ref">BBVector4</span></a>、<a class="reference internal" href="#document-classes/class_bbvector4i#class-bbvector4i"><span class="std std-ref">BBVector4i</span></a></p>
<p>LimboAI 类型化参数的基类。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p>LimboAI 类型化参数的基类,既可以引用 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量,也可以直接保存某个 Variant.Type 类型的原始值。</p>
<p><strong>注意</strong>:不要直接实例化,请改用具体的子类型。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h4>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">Variant</span></code></p></td>
<td><p><a class="reference internal" href="#class-bbparam-property-saved-value"><span class="std std-ref">saved_value</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">null</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a></p></td>
<td><p><a class="reference internal" href="#class-bbparam-property-value-source"><span class="std std-ref">value_source</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-bbparam-property-variable"><span class="std std-ref">variable</span></a></p></td>
<td></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p>Variant.Type</p></td>
<td><p><a class="reference internal" href="#class-bbparam-method-get-type"><span class="std std-ref">get_type</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">Variant</span></code></p></td>
<td><p><a class="reference internal" href="#class-bbparam-method-get-value"><span class="std std-ref">get_value</span></a>(scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, default: <code class="docutils literal notranslate"><span class="pre">Variant</span></code> = null)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="enumerations">
<h4>枚举<a class="headerlink" href="#enumerations" title="Link to this heading"></a></h4>
<p class="classref-enumeration" id="enum-bbparam-valuesource">enum <strong>ValueSource</strong>: <a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-bbparam-constant-saved-value"><a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a> <strong>SAVED_VALUE</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>值直接存储在 BBParam 资源中。</p>
<p class="classref-enumeration-constant" id="class-bbparam-constant-blackboard-var"><a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a> <strong>BLACKBOARD_VAR</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>值通过变量名引用,并从 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 中获取。变量名存储在 BBParam 资源中。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h4>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h4>
<p class="classref-property" id="class-bbparam-property-saved-value"><code class="docutils literal notranslate"><span class="pre">Variant</span></code> <strong>saved_value</strong> = <code class="docutils literal notranslate"><span class="pre">null</span></code> <a class="reference internal" href="#class-bbparam-property-saved-value"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_saved_value</strong>(value: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Variant</span></code> <strong>get_saved_value</strong>()</p></li>
</ul>
<p>当 <a class="reference internal" href="#class-bbparam-property-value-source"><span class="std std-ref">value_source</span></a> 设为 <a class="reference internal" href="#class-bbparam-constant-saved-value"><span class="std std-ref">SAVED_VALUE</span></a> 时,用于存储参数值。值的类型由 <a class="reference internal" href="#class-bbparam-method-get-type"><span class="std std-ref">get_type</span></a> 决定。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bbparam-property-value-source"><a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a> <strong>value_source</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-bbparam-property-value-source"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_value_source</strong>(value: <a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a>)</p></li>
<li><p><a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a> <strong>get_value_source</strong>()</p></li>
</ul>
<p>指定 BBParam 取值的来源。见 <a class="reference internal" href="#enum-bbparam-valuesource"><span class="std std-ref">ValueSource</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-bbparam-property-variable"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>variable</strong> <a class="reference internal" href="#class-bbparam-property-variable"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_variable</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_variable</strong>()</p></li>
</ul>
<p>当 <a class="reference internal" href="#class-bbparam-property-value-source"><span class="std std-ref">value_source</span></a> 设为 <a class="reference internal" href="#class-bbparam-constant-blackboard-var"><span class="std std-ref">BLACKBOARD_VAR</span></a> 时,存储 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量的名称。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-bbparam-method-get-type">Variant.Type <strong>get_type</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-bbparam-method-get-type"><span class="std std-ref">🔗</span></a></p>
<p>返回该参数预期的数据类型。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-bbparam-method-get-value"><code class="docutils literal notranslate"><span class="pre">Variant</span></code> <strong>get_value</strong>(scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, default: <code class="docutils literal notranslate"><span class="pre">Variant</span></code> = null) <a class="reference internal" href="#class-bbparam-method-get-value"><span class="std std-ref">🔗</span></a></p>
<p>返回该参数的值。</p>
</section>
</section>
<span id="document-classes/class_limbostate"></span><section id="limbostate">
<span id="class-limbostate"></span><h3>LimboState<a class="headerlink" href="#limbostate" title="Link to this heading"></a></h3>
<p><strong>继承:</strong></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a>、<a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a></p>
<p>用于分层状态机(HSM)的状态节点。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p>LimboAI 中用于分层状态机(HSM)的状态节点。</p>
<p>你可以通过继承这个类来编写自己的状态行为。要实现状态逻辑,可以重写 <a class="reference internal" href="#class-limbostate-private-method-enter"><span class="std std-ref">_enter</span></a>、<a class="reference internal" href="#class-limbostate-private-method-exit"><span class="std std-ref">_exit</span></a>、<a class="reference internal" href="#class-limbostate-private-method-setup"><span class="std std-ref">_setup</span></a> 和 <a class="reference internal" href="#class-limbostate-private-method-update"><span class="std std-ref">_update</span></a>。或者,你也可以用 <code class="docutils literal notranslate"><span class="pre">call_on_*</span></code> 方法把状态实现委托给外部方法。</p>
<p>关于状态机的更多细节,请参阅 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h4>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-limbostate-property-event-finished"><span class="std std-ref">EVENT_FINISHED</span></a></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">Node</span></code></p></td>
<td><p><a class="reference internal" href="#class-limbostate-property-agent"><span class="std std-ref">agent</span></a></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-property-blackboard"><span class="std std-ref">blackboard</span></a></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-property-blackboard-plan"><span class="std std-ref">blackboard_plan</span></a></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-private-method-enter"><span class="std std-ref">_enter</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-private-method-exit"><span class="std std-ref">_exit</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-private-method-setup"><span class="std std-ref">_setup</span></a>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-private-method-update"><span class="std std-ref">_update</span></a>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-add-event-handler"><span class="std std-ref">add_event_handler</span></a>(event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, handler: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-call-on-enter"><span class="std std-ref">call_on_enter</span></a>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>)</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-call-on-exit"><span class="std std-ref">call_on_exit</span></a>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-call-on-update"><span class="std std-ref">call_on_update</span></a>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-clear-guard"><span class="std std-ref">clear_guard</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-dispatch"><span class="std std-ref">dispatch</span></a>(event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, cargo: <code class="docutils literal notranslate"><span class="pre">Variant</span></code> = null)</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-get-root"><span class="std std-ref">get_root</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-is-active"><span class="std std-ref">is_active</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-named"><span class="std std-ref">named</span></a>(name: <code class="docutils literal notranslate"><span class="pre">String</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbostate-method-set-guard"><span class="std std-ref">set_guard</span></a>(guard_callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="signals">
<h4>信号<a class="headerlink" href="#signals" title="Link to this heading"></a></h4>
<p class="classref-signal" id="class-limbostate-signal-entered"><strong>entered</strong>() <a class="reference internal" href="#class-limbostate-signal-entered"><span class="std std-ref">🔗</span></a></p>
<p>当状态被进入时发出。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-signal" id="class-limbostate-signal-exited"><strong>exited</strong>() <a class="reference internal" href="#class-limbostate-signal-exited"><span class="std std-ref">🔗</span></a></p>
<p>当状态被退出时发出。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-signal" id="class-limbostate-signal-setup"><strong>setup</strong>() <a class="reference internal" href="#class-limbostate-signal-setup"><span class="std std-ref">🔗</span></a></p>
<p>当状态被初始化时发出。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-signal" id="class-limbostate-signal-updated"><strong>updated</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-limbostate-signal-updated"><span class="std std-ref">🔗</span></a></p>
<p>当状态被更新时发出。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h4>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h4>
<p class="classref-property" id="class-limbostate-property-event-finished"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>EVENT_FINISHED</strong> <a class="reference internal" href="#class-limbostate-property-event-finished"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>event_finished</strong>()</p></li>
</ul>
<p>一个常用事件,表示状态已经完成其工作。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-limbostate-property-agent"><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>agent</strong> <a class="reference internal" href="#class-limbostate-property-agent"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_agent</strong>(value: <code class="docutils literal notranslate"><span class="pre">Node</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>get_agent</strong>()</p></li>
</ul>
<p>与该状态关联的智能体,在初始化时赋值。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-limbostate-property-blackboard"><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>blackboard</strong> <a class="reference internal" href="#class-limbostate-property-blackboard"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>get_blackboard</strong>()</p></li>
</ul>
<p>该状态所属状态机中各状态共享的键值数据存储。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-limbostate-property-blackboard-plan"><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>blackboard_plan</strong> <a class="reference internal" href="#class-limbostate-property-blackboard-plan"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_blackboard_plan</strong>(value: <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>get_blackboard_plan</strong>()</p></li>
</ul>
<p>存储并管理用于构建新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 实例的变量。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-limbostate-private-method-enter"><abbr title="无返回值。">void</abbr> <strong>_enter</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-limbostate-private-method-enter"><span class="std std-ref">🔗</span></a></p>
<p>当状态被进入时调用。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-private-method-exit"><abbr title="无返回值。">void</abbr> <strong>_exit</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-limbostate-private-method-exit"><span class="std std-ref">🔗</span></a></p>
<p>当状态被退出时调用。这会在转换到另一个状态时发生,也会在状态机从场景树中被移除时发生(例如节点被 Node.queue_free 释放或场景切换)。由于实现细节,<a class="reference internal" href="#class-limbostate-private-method-exit"><span class="std std-ref">_exit</span></a> 不会在调用 Object.free 时被执行!</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-private-method-setup"><abbr title="无返回值。">void</abbr> <strong>_setup</strong>() <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-limbostate-private-method-setup"><span class="std std-ref">🔗</span></a></p>
<p>在初始化期间被调用一次。用这个方法初始化你的状态。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-private-method-update"><abbr title="无返回值。">void</abbr> <strong>_update</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <abbr title="该方法通常需要由用户重写才能生效。">virtual</abbr> <a class="reference internal" href="#class-limbostate-private-method-update"><span class="std std-ref">🔗</span></a></p>
<p>在更新期间调用。用这个方法实现你状态的行为。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-add-event-handler"><abbr title="无返回值。">void</abbr> <strong>add_event_handler</strong>(event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, handler: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>) <a class="reference internal" href="#class-limbostate-method-add-event-handler"><span class="std std-ref">🔗</span></a></p>
<p>注册一个 <code class="docutils literal notranslate"><span class="pre">handler</span></code>,在 <code class="docutils literal notranslate"><span class="pre">event</span></code> 被派发时调用。处理函数应具有以下签名:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">func</span> <span class="n">my_event_handler</span><span class="p">(</span><span class="n">cargo</span><span class="o">=</span><span class="n">null</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</pre></div>
</div>
<p>如果处理函数返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>,事件将被消费。Cargo 是可选参数,可以传给处理函数。另见 <a class="reference internal" href="#class-limbostate-method-dispatch"><span class="std std-ref">dispatch</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-call-on-enter"><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>call_on_enter</strong>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>) <a class="reference internal" href="#class-limbostate-method-call-on-enter"><span class="std std-ref">🔗</span></a></p>
<p>链式方法,把 <a class="reference internal" href="#class-limbostate-signal-entered"><span class="std std-ref">entered</span></a> 信号连接到一个 <code class="docutils literal notranslate"><span class="pre">callable</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-call-on-exit"><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>call_on_exit</strong>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>) <a class="reference internal" href="#class-limbostate-method-call-on-exit"><span class="std std-ref">🔗</span></a></p>
<p>链式方法,把 <a class="reference internal" href="#class-limbostate-signal-exited"><span class="std std-ref">exited</span></a> 信号连接到一个 <code class="docutils literal notranslate"><span class="pre">callable</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-call-on-update"><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>call_on_update</strong>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>) <a class="reference internal" href="#class-limbostate-method-call-on-update"><span class="std std-ref">🔗</span></a></p>
<p>链式方法,把 <a class="reference internal" href="#class-limbostate-signal-updated"><span class="std std-ref">updated</span></a> 信号连接到一个 <code class="docutils literal notranslate"><span class="pre">callable</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-clear-guard"><abbr title="无返回值。">void</abbr> <strong>clear_guard</strong>() <a class="reference internal" href="#class-limbostate-method-clear-guard"><span class="std std-ref">🔗</span></a></p>
<p>清除守卫函数,移除之前由 <a class="reference internal" href="#class-limbostate-method-set-guard"><span class="std std-ref">set_guard</span></a> 设置的 <code class="docutils literal notranslate"><span class="pre">Callable</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-dispatch"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>dispatch</strong>(event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, cargo: <code class="docutils literal notranslate"><span class="pre">Variant</span></code> = null) <a class="reference internal" href="#class-limbostate-method-dispatch"><span class="std std-ref">🔗</span></a></p>
<p>递归派发一个名为 <code class="docutils literal notranslate"><span class="pre">event</span></code> 的状态机事件,可选参数为 <code class="docutils literal notranslate"><span class="pre">cargo</span></code>。如果事件被消费则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<p>事件会从叶状态向根状态传播,一旦某个状态消费了该事件,传播就会停止。如果状态有相关的转换或事件处理器,它就会消费该事件。关于事件处理器的更多信息,见 <a class="reference internal" href="#class-limbostate-method-add-event-handler"><span class="std std-ref">add_event_handler</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-get-root"><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>get_root</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limbostate-method-get-root"><span class="std std-ref">🔗</span></a></p>
<p>返回根 <strong>LimboState</strong>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-is-active"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_active</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limbostate-method-is-active"><span class="std std-ref">🔗</span></a></p>
<p>如果当前处于活动状态(即它是父级 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a> 的活动子状态),则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-named"><a class="reference internal" href="#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>named</strong>(name: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <a class="reference internal" href="#class-limbostate-method-named"><span class="std std-ref">🔗</span></a></p>
<p>用于设置此状态名称的链式方法。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbostate-method-set-guard"><abbr title="无返回值。">void</abbr> <strong>set_guard</strong>(guard_callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>) <a class="reference internal" href="#class-limbostate-method-set-guard"><span class="std std-ref">🔗</span></a></p>
<p>设置守卫(guard)函数,每当考虑转换到该状态时都会调用它。如果该函数返回 <code class="docutils literal notranslate"><span class="pre">false</span></code>,该转换将被禁止。</p>
</section>
</section>
<span id="document-classes/class_limbohsm"></span><section id="limbohsm">
<span id="class-limbohsm"></span><h3>LimboHSM<a class="headerlink" href="#limbohsm" title="Link to this heading"></a></h3>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p>
<p>基于事件的分层状态机(HSM)。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p>基于事件的分层状态机(HSM),用于管理 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> 实例并处理它们之间的转换。LimboHSM 本身就是一个 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>,也可以作为另一个 LimboHSM 节点的子节点。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h4>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-property-anystate"><span class="std std-ref">ANYSTATE</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-property-initial-state"><span class="std std-ref">initial_state</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-property-update-mode"><span class="std std-ref">update_mode</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-add-transition"><span class="std std-ref">add_transition</span></a>(from_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, to_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, guard: <code class="docutils literal notranslate"><span class="pre">Callable</span></code> = Callable())</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-change-active-state"><span class="std std-ref">change_active_state</span></a>(state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>)</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-get-active-state"><span class="std std-ref">get_active_state</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-get-leaf-state"><span class="std std-ref">get_leaf_state</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-get-previous-active-state"><span class="std std-ref">get_previous_active_state</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-has-transition"><span class="std std-ref">has_transition</span></a>(from_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-initialize"><span class="std std-ref">initialize</span></a>(agent: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, parent_scope: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> = null)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-remove-transition"><span class="std std-ref">remove_transition</span></a>(from_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-set-active"><span class="std std-ref">set_active</span></a>(active: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-limbohsm-method-update"><span class="std std-ref">update</span></a>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="signals">
<h4>信号<a class="headerlink" href="#signals" title="Link to this heading"></a></h4>
<p class="classref-signal" id="class-limbohsm-signal-active-state-changed"><strong>active_state_changed</strong>(current: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, previous: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>) <a class="reference internal" href="#class-limbohsm-signal-active-state-changed"><span class="std std-ref">🔗</span></a></p>
<p>当当前活动的子状态切换到另一个子状态时发出。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="enumerations">
<h4>枚举<a class="headerlink" href="#enumerations" title="Link to this heading"></a></h4>
<p class="classref-enumeration" id="enum-limbohsm-updatemode">enum <strong>UpdateMode</strong>: <a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-limbohsm-constant-idle"><a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>IDLE</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>在空闲处理期间更新状态机。</p>
<p class="classref-enumeration-constant" id="class-limbohsm-constant-physics"><a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>PHYSICS</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>在物理处理期间更新状态机。</p>
<p class="classref-enumeration-constant" id="class-limbohsm-constant-manual"><a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>MANUAL</strong> = <code class="docutils literal notranslate"><span class="pre">2</span></code></p>
<p>通过在脚本中调用 <a class="reference internal" href="#class-limbohsm-method-update"><span class="std std-ref">update</span></a> 来手动更新状态机。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h4>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h4>
<p class="classref-property" id="class-limbohsm-property-anystate"><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>ANYSTATE</strong> <a class="reference internal" href="#class-limbohsm-property-anystate"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>anystate</strong>()</p></li>
</ul>
<p>用于定义“从任意状态出发”的转换。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-limbohsm-property-initial-state"><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>initial_state</strong> <a class="reference internal" href="#class-limbohsm-property-initial-state"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_initial_state</strong>(value: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>get_initial_state</strong>()</p></li>
</ul>
<p>使用 <a class="reference internal" href="#class-limbohsm-method-set-active"><span class="std std-ref">set_active</span></a> 方法激活状态机时会变为活动的子状态。如果没有显式设置,LimboHSM 的第一个子节点将被视为初始状态。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-limbohsm-property-update-mode"><a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>update_mode</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-limbohsm-property-update-mode"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_update_mode</strong>(value: <a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a>)</p></li>
<li><p><a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a> <strong>get_update_mode</strong>()</p></li>
</ul>
<p>指定状态机应在何时更新。见 <a class="reference internal" href="#enum-limbohsm-updatemode"><span class="std std-ref">UpdateMode</span></a>。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-limbohsm-method-add-transition"><abbr title="无返回值。">void</abbr> <strong>add_transition</strong>(from_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, to_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>, guard: <code class="docutils literal notranslate"><span class="pre">Callable</span></code> = Callable()) <a class="reference internal" href="#class-limbohsm-method-add-transition"><span class="std std-ref">🔗</span></a></p>
<p>建立从一个状态到另一个状态的转换,在 <code class="docutils literal notranslate"><span class="pre">event</span></code> 被派发时触发。<code class="docutils literal notranslate"><span class="pre">from_state</span></code> 和 <code class="docutils literal notranslate"><span class="pre">to_state</span></code> 都必须是此 <strong>LimboHSM</strong> 的直接子节点。</p>
<p>可选地,可以指定一个 <code class="docutils literal notranslate"><span class="pre">guard</span></code> 函数,它必须返回布尔值。如果守卫函数返回 <code class="docutils literal notranslate"><span class="pre">false</span></code>,则不会发生转换。守卫函数会在考虑该转换之前立即被调用。关于状态级别的守卫函数,请查看 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-method-set-guard"><span class="std std-ref">LimboState.set_guard</span></a>。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">func</span> <span class="n">my_guard</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="k">return</span> <span class="n">is_some_condition_met</span><span class="p">()</span>
</pre></div>
</div>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-change-active-state"><abbr title="无返回值。">void</abbr> <strong>change_active_state</strong>(state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>) <a class="reference internal" href="#class-limbohsm-method-change-active-state"><span class="std std-ref">🔗</span></a></p>
<p>把当前活动的子状态切换为 <code class="docutils literal notranslate"><span class="pre">state</span></code>。如果 <code class="docutils literal notranslate"><span class="pre">state</span></code> 已经处于活动状态,它会被退出并重新进入。</p>
<p><code class="docutils literal notranslate"><span class="pre">state</span></code> 必须是此 <strong>LimboHSM</strong> 的子节点。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-get-active-state"><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>get_active_state</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limbohsm-method-get-active-state"><span class="std std-ref">🔗</span></a></p>
<p>返回当前活动的子状态。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-get-leaf-state"><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>get_leaf_state</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limbohsm-method-get-leaf-state"><span class="std std-ref">🔗</span></a></p>
<p>返回状态机中当前活动的叶状态。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-get-previous-active-state"><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> <strong>get_previous_active_state</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limbohsm-method-get-previous-active-state"><span class="std std-ref">🔗</span></a></p>
<p>返回上一个活动的子状态。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-has-transition"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>has_transition</strong>(from_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limbohsm-method-has-transition"><span class="std std-ref">🔗</span></a></p>
<p>如果存在从 <code class="docutils literal notranslate"><span class="pre">from_state</span></code> 出发、针对给定 <code class="docutils literal notranslate"><span class="pre">event</span></code> 的转换,则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-initialize"><abbr title="无返回值。">void</abbr> <strong>initialize</strong>(agent: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, parent_scope: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> = null) <a class="reference internal" href="#class-limbohsm-method-initialize"><span class="std std-ref">🔗</span></a></p>
<p>初始化该状态,并为它自身及所有子状态调用 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-private-method-setup"><span class="std std-ref">LimboState._setup</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-remove-transition"><abbr title="无返回值。">void</abbr> <strong>remove_transition</strong>(from_state: <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a>, event: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>) <a class="reference internal" href="#class-limbohsm-method-remove-transition"><span class="std std-ref">🔗</span></a></p>
<p>移除某个状态上与特定 <code class="docutils literal notranslate"><span class="pre">event</span></code> 关联的转换。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-set-active"><abbr title="无返回值。">void</abbr> <strong>set_active</strong>(active: <code class="docutils literal notranslate"><span class="pre">bool</span></code>) <a class="reference internal" href="#class-limbohsm-method-set-active"><span class="std std-ref">🔗</span></a></p>
<p>设为 <code class="docutils literal notranslate"><span class="pre">true</span></code> 时,会把状态切换到 <a class="reference internal" href="#class-limbohsm-property-initial-state"><span class="std std-ref">initial_state</span></a>,并根据 <a class="reference internal" href="#class-limbohsm-property-update-mode"><span class="std std-ref">update_mode</span></a> 激活状态处理。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limbohsm-method-update"><abbr title="无返回值。">void</abbr> <strong>update</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-limbohsm-method-update"><span class="std std-ref">🔗</span></a></p>
<p>对它自身和活动子状态调用 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-private-method-update"><span class="std std-ref">LimboState._update</span></a>,调用会逐级向下传递到叶状态。如果 <a class="reference internal" href="#class-limbohsm-property-update-mode"><span class="std std-ref">update_mode</span></a> 未设为 <a class="reference internal" href="#class-limbohsm-constant-manual"><span class="std std-ref">MANUAL</span></a>,此方法会自动触发。</p>
</section>
</section>
<span id="document-classes/class_btstate"></span><section id="btstate">
<span id="class-btstate"></span><h3>BTState<a class="headerlink" href="#btstate" title="Link to this heading"></a></h3>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_limbohsm#class-limbohsm"><span class="std std-ref">LimboHSM</span></a>、承载 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 的状态节点。</p>
<section class="classref-introduction-group" id="description">
<h4>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h4>
<p>BTState 是一种 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate"><span class="std std-ref">LimboState</span></a> 节点,它通过管理 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 来为该状态提供行为逻辑。它会实例化并运行 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源,并在 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时派发状态机事件。事件名称可以通过 <a class="reference internal" href="#class-btstate-property-success-event"><span class="std std-ref">success_event</span></a> 和 <a class="reference internal" href="#class-btstate-property-failure-event"><span class="std std-ref">failure_event</span></a> 自定义。关于状态机事件的更多细节,见 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-method-dispatch"><span class="std std-ref">LimboState.dispatch</span></a>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h4>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a></p></td>
<td><p><a class="reference internal" href="#class-btstate-property-behavior-tree"><span class="std std-ref">behavior_tree</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btstate-property-failure-event"><span class="std std-ref">failure_event</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;"failure"</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btstate-property-monitor-performance"><span class="std std-ref">monitor_performance</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btstate-property-success-event"><span class="std std-ref">success_event</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;"success"</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h4>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h4>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a></p></td>
<td><p><a class="reference internal" href="#class-btstate-method-get-bt-instance"><span class="std std-ref">get_bt_instance</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btstate-method-set-scene-root-hint"><span class="std std-ref">set_scene_root_hint</span></a>(scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h4>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h4>
<p class="classref-property" id="class-btstate-property-behavior-tree"><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>behavior_tree</strong> <a class="reference internal" href="#class-btstate-property-behavior-tree"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_behavior_tree</strong>(value: <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>get_behavior_tree</strong>()</p></li>
</ul>
<p>定义状态行为的 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btstate-property-failure-event"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>failure_event</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;"failure"</span></code> <a class="reference internal" href="#class-btstate-property-failure-event"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_failure_event</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_failure_event</strong>()</p></li>
</ul>
<p>当行为树结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时将被派发的 HSM 事件。见 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-method-dispatch"><span class="std std-ref">LimboState.dispatch</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btstate-property-monitor-performance"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>monitor_performance</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btstate-property-monitor-performance"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_monitor_performance</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_monitor_performance</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,会为此 <strong>BTState</strong> 节点的每个实例在 “Debugger-&gt;Monitors” 中添加一个性能监视器。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btstate-property-success-event"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>success_event</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;"success"</span></code> <a class="reference internal" href="#class-btstate-property-success-event"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_success_event</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_success_event</strong>()</p></li>
</ul>
<p>当行为树结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 时将被派发的 HSM 事件。见 <a class="reference internal" href="#document-classes/class_limbostate#class-limbostate-method-dispatch"><span class="std std-ref">LimboState.dispatch</span></a>。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h4>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h4>
<p class="classref-method" id="class-btstate-method-get-bt-instance"><a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a> <strong>get_bt_instance</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btstate-method-get-bt-instance"><span class="std std-ref">🔗</span></a></p>
<p>返回行为树实例。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btstate-method-set-scene-root-hint"><abbr title="无返回值。">void</abbr> <strong>set_scene_root_hint</strong>(scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>) <a class="reference internal" href="#class-btstate-method-set-scene-root-hint"><span class="std std-ref">🔗</span></a></p>
<p>设置新实例化的行为树要使用的场景根节点 <code class="docutils literal notranslate"><span class="pre">Node</span></code>。应当在状态机初始化之前调用。当你需要用代码动态创建 <strong>BTState</strong> 节点时,这通常很有用。</p>
</section>
</section>
</div>
<p>完整的类参考可以在侧边栏中找到。</p>
</section>
<span id="document-classes/class_bbaabb"></span><section id="bbaabb">
<span id="class-bbaabb"></span><h2>BBAabb<a class="headerlink" href="#bbaabb" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 AABB 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbarray"></span><section id="bbarray">
<span id="class-bbarray"></span><h2>BBArray<a class="headerlink" href="#bbarray" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbbasis"></span><section id="bbbasis">
<span id="class-bbbasis"></span><h2>BBBasis<a class="headerlink" href="#bbbasis" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Basis 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbbool"></span><section id="bbbool">
<span id="class-bbbool"></span><h2>BBBool<a class="headerlink" href="#bbbool" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Bool 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbbytearray"></span><section id="bbbytearray">
<span id="class-bbbytearray"></span><h2>BBByteArray<a class="headerlink" href="#bbbytearray" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 ByteArray 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbcolor"></span><section id="bbcolor">
<span id="class-bbcolor"></span><h2>BBColor<a class="headerlink" href="#bbcolor" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Color 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbcolorarray"></span><section id="bbcolorarray">
<span id="class-bbcolorarray"></span><h2>BBColorArray<a class="headerlink" href="#bbcolorarray" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 ColorArray 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbdictionary"></span><section id="bbdictionary">
<span id="class-bbdictionary"></span><h2>BBDictionary<a class="headerlink" href="#bbdictionary" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Dictionary 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbfloat"></span><section id="bbfloat">
<span id="class-bbfloat"></span><h2>BBFloat<a class="headerlink" href="#bbfloat" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Float 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbfloat32array"></span><section id="bbfloat32array">
<span id="class-bbfloat32array"></span><h2>BBFloat32Array<a class="headerlink" href="#bbfloat32array" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 PackedFloat32Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbfloat64array"></span><section id="bbfloat64array">
<span id="class-bbfloat64array"></span><h2>BBFloat64Array<a class="headerlink" href="#bbfloat64array" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 PackedFloat64Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbint"></span><section id="bbint">
<span id="class-bbint"></span><h2>BBInt<a class="headerlink" href="#bbint" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Integer 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbint32array"></span><section id="bbint32array">
<span id="class-bbint32array"></span><h2>BBInt32Array<a class="headerlink" href="#bbint32array" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 PackedInt32Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbint64array"></span><section id="bbint64array">
<span id="class-bbint64array"></span><h2>BBInt64Array<a class="headerlink" href="#bbint64array" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 PackedInt64Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbnode"></span><section id="bbnode">
<span id="class-bbnode"></span><h2>BBNode<a class="headerlink" href="#bbnode" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Node 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>面向 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务使用的 Node 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
<p>如果来源是黑板变量,则允许任何继承自 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 的类型。</p>
</section>
</section>
<span id="document-classes/class_bbplane"></span><section id="bbplane">
<span id="class-bbplane"></span><h2>BBPlane<a class="headerlink" href="#bbplane" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Plane 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbprojection"></span><section id="bbprojection">
<span id="class-bbprojection"></span><h2>BBProjection<a class="headerlink" href="#bbprojection" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Projection 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbquaternion"></span><section id="bbquaternion">
<span id="class-bbquaternion"></span><h2>BBQuaternion<a class="headerlink" href="#bbquaternion" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Quaternion 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbrect2"></span><section id="bbrect2">
<span id="class-bbrect2"></span><h2>BBRect2<a class="headerlink" href="#bbrect2" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Rect2 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbrect2i"></span><section id="bbrect2i">
<span id="class-bbrect2i"></span><h2>BBRect2i<a class="headerlink" href="#bbrect2i" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Rect2i 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbstring"></span><section id="bbstring">
<span id="class-bbstring"></span><h2>BBString<a class="headerlink" href="#bbstring" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 String 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbstringarray"></span><section id="bbstringarray">
<span id="class-bbstringarray"></span><h2>BBStringArray<a class="headerlink" href="#bbstringarray" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 StringArray 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbstringname"></span><section id="bbstringname">
<span id="class-bbstringname"></span><h2>BBStringName<a class="headerlink" href="#bbstringname" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 StringName 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbtransform2d"></span><section id="bbtransform2d">
<span id="class-bbtransform2d"></span><h2>BBTransform2D<a class="headerlink" href="#bbtransform2d" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Transform2D 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbtransform3d"></span><section id="bbtransform3d">
<span id="class-bbtransform3d"></span><h2>BBTransform3D<a class="headerlink" href="#bbtransform3d" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Transform3D 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvariant"></span><section id="bbvariant">
<span id="class-bbvariant"></span><h2>BBVariant<a class="headerlink" href="#bbvariant" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Variant 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>面向 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务使用的 Variant 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
<p>数据类型由 <a class="reference internal" href="#class-bbvariant-property-type"><span class="std std-ref">type</span></a> 指定。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p>Variant.Type</p></td>
<td><p><a class="reference internal" href="#class-bbvariant-property-type"><span class="std std-ref">type</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-bbvariant-property-type">Variant.Type <strong>type</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-bbvariant-property-type"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_type</strong>(value: Variant.Type)</p></li>
<li><p>Variant.Type <strong>get_type</strong>()</p></li>
</ul>
<p>为该参数值指定的 Variant.Type。</p>
</section>
</section>
<span id="document-classes/class_bbvector2"></span><section id="bbvector2">
<span id="class-bbvector2"></span><h2>BBVector2<a class="headerlink" href="#bbvector2" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector2 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector2array"></span><section id="bbvector2array">
<span id="class-bbvector2array"></span><h2>BBVector2Array<a class="headerlink" href="#bbvector2array" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector2Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector2i"></span><section id="bbvector2i">
<span id="class-bbvector2i"></span><h2>BBVector2i<a class="headerlink" href="#bbvector2i" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector2i 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector3"></span><section id="bbvector3">
<span id="class-bbvector3"></span><h2>BBVector3<a class="headerlink" href="#bbvector3" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector3 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector3array"></span><section id="bbvector3array">
<span id="class-bbvector3array"></span><h2>BBVector3Array<a class="headerlink" href="#bbvector3array" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector3Array 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector3i"></span><section id="bbvector3i">
<span id="class-bbvector3i"></span><h2>BBVector3i<a class="headerlink" href="#bbvector3i" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector3i 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector4"></span><section id="bbvector4">
<span id="class-bbvector4"></span><h2>BBVector4<a class="headerlink" href="#bbvector4" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector4 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_bbvector4i"></span><section id="bbvector4i">
<span id="class-bbvector4i"></span><h2>BBVector4i<a class="headerlink" href="#bbvector4i" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a></p>
<p>用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 任务的 Vector4i 类型参数。见 <a class="reference internal" href="#document-classes/class_bbparam#class-bbparam"><span class="std std-ref">BBParam</span></a>。</p>
</section>
<span id="document-classes/class_behaviortree"></span><section id="behaviortree">
<span id="class-behaviortree"></span><h2>BehaviorTree<a class="headerlink" href="#behaviortree" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p>包含行为树数据。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>行为树是一种层次结构,用于建模和控制游戏中智能体(例如角色、敌人、实体)的行为。它旨在让你更轻松地为游戏创建复杂且高度模块化的行为。</p>
<p>行为树由若干任务组成,这些任务代表具体的动作或决策规则。任务大致可分为两大类:控制任务和叶任务。控制任务决定树内的执行流程,包括 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a>、<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a> 和 <a class="reference internal" href="#document-classes/class_btinvert#class-btinvert"><span class="std std-ref">BTInvert</span></a>。叶任务代表要执行的具体动作(例如移动或攻击),或是需要检查的条件。<a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 类为行为树的各种积木块提供了基础。BT 任务可以借助 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 共享数据。见 <a class="reference internal" href="#document-classes/class_bttask#class-bttask-property-blackboard"><span class="std std-ref">BTTask.blackboard</span></a> 和 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
<p><strong>注意:</strong>要创建你自己的动作,请继承 <a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> 类。</p>
<p>BehaviorTree 从根任务开始执行,遵循控制任务规定的规则,一路向下直到叶任务 —— 叶任务代表智能体应当执行的实际动作,或应当检查的条件。每个任务在执行时都会返回一个状态,可能是 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>、<code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。这些状态决定树的推进方式,它们定义在 <a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> 中。</p>
<p>行为树通过条件任务处理条件逻辑。这些任务检查特定条件,并根据智能体或其环境的状态返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>(例如 “IsLowOnHealth”、“IsTargetInSight”)。条件可以与 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 和 <a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a> 搭配使用,构建你的决策逻辑。</p>
<p><strong>注意</strong>:要创建你自己的条件,请继承 <a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a> 类。</p>
<p>请查阅 <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 类,它为行为树的各种积木块提供了基础。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-property-blackboard-plan"><span class="std std-ref">blackboard_plan</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-property-description"><span class="std std-ref">description</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-method-clone"><span class="std std-ref">clone</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-method-copy-other"><span class="std std-ref">copy_other</span></a>(other: <a class="reference internal" href="#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>)</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-method-get-root-task"><span class="std std-ref">get_root_task</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-method-instantiate"><span class="std std-ref">instantiate</span></a>(agent: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, instance_owner: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, custom_scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code> = null) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-behaviortree-method-set-root-task"><span class="std std-ref">set_root_task</span></a>(task: <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="signals">
<h3>信号<a class="headerlink" href="#signals" title="Link to this heading"></a></h3>
<p class="classref-signal" id="class-behaviortree-signal-plan-changed"><strong>plan_changed</strong>() <a class="reference internal" href="#class-behaviortree-signal-plan-changed"><span class="std std-ref">🔗</span></a></p>
<p>当 <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> 发生变化时发出。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-behaviortree-property-blackboard-plan"><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>blackboard_plan</strong> <a class="reference internal" href="#class-behaviortree-property-blackboard-plan"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_blackboard_plan</strong>(value: <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>get_blackboard_plan</strong>()</p></li>
</ul>
<p>存储并管理用于构建新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 实例的变量。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-behaviortree-property-description"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>description</strong> = <code class="docutils literal notranslate"><span class="pre">""</span></code> <a class="reference internal" href="#class-behaviortree-property-description"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_description</strong>(value: <code class="docutils literal notranslate"><span class="pre">String</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_description</strong>()</p></li>
</ul>
<p>用户为 <strong>BehaviorTree</strong> 提供的描述。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-behaviortree-method-clone"><a class="reference internal" href="#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>clone</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-behaviortree-method-clone"><span class="std std-ref">🔗</span></a></p>
<p>复制一份 BehaviorTree 资源。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-behaviortree-method-copy-other"><abbr title="无返回值。">void</abbr> <strong>copy_other</strong>(other: <a class="reference internal" href="#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>) <a class="reference internal" href="#class-behaviortree-method-copy-other"><span class="std std-ref">🔗</span></a></p>
<p>变成另一棵行为树的副本。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-behaviortree-method-get-root-task"><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>get_root_task</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-behaviortree-method-get-root-task"><span class="std std-ref">🔗</span></a></p>
<p>返回 BehaviorTree 资源的根任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-behaviortree-method-instantiate"><a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a> <strong>instantiate</strong>(agent: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, instance_owner: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, custom_scene_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code> = null) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-behaviortree-method-instantiate"><span class="std std-ref">🔗</span></a></p>
<p>实例化行为树并返回 <a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a>。<code class="docutils literal notranslate"><span class="pre">instance_owner</span></code> 应当是拥有该行为树实例的场景节点,通常是 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer"><span class="std std-ref">BTPlayer</span></a>、<a class="reference internal" href="#document-classes/class_btstate#class-btstate"><span class="std std-ref">BTState</span></a>,或是负责控制行为树执行的自定义播放器节点。请确保传入的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 已从 <a class="reference internal" href="#class-behaviortree-property-blackboard-plan"><span class="std std-ref">blackboard_plan</span></a> 填充了值。另见 <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan-method-populate-blackboard"><span class="std std-ref">BlackboardPlan.populate_blackboard</span></a> 与 <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan-method-create-blackboard"><span class="std std-ref">BlackboardPlan.create_blackboard</span></a>。</p>
<p>如果 <code class="docutils literal notranslate"><span class="pre">custom_scene_root</span></code> 不是 <code class="docutils literal notranslate"><span class="pre">null</span></code>,它将被用作新实例化的行为树的场景根节点;否则场景根节点会被设为 <code class="docutils literal notranslate"><span class="pre">instance_owner.owner</span></code>。场景根节点对于 <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> 实例正常工作至关重要。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-behaviortree-method-set-root-task"><abbr title="无返回值。">void</abbr> <strong>set_root_task</strong>(task: <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a>) <a class="reference internal" href="#class-behaviortree-method-set-root-task"><span class="std std-ref">🔗</span></a></p>
<p>为 <strong>BehaviorTree</strong> 资源指定一个新的根任务。</p>
</section>
</section>
<span id="document-classes/class_behaviortreedata"></span><section id="behaviortreedata">
<span id="class-behaviortreedata"></span><h2>BehaviorTreeData<a class="headerlink" href="#behaviortreedata" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p>表示 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例的当前状态。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>该类被 LimboAI 调试器用于 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例数据的序列化与反序列化。</p>
<p>此外,它还可以配合 <a class="reference internal" href="#document-classes/class_behaviortreeview#class-behaviortreeview"><span class="std std-ref">BehaviorTreeView</span></a> 可视化 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例的当前状态。它的设计用途是在自定义的运行时工具中使用。</p>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#class-behaviortreedata"><span class="std std-ref">BehaviorTreeData</span></a></p></td>
<td><p><a class="reference internal" href="#class-behaviortreedata-method-create-from-bt-instance"><span class="std std-ref">create_from_bt_instance</span></a>(bt_instance: <a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a>) <abbr title="该方法无需实例即可调用,因此可以直接用类名调用。">static</abbr></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-behaviortreedata-method-create-from-bt-instance"><a class="reference internal" href="#class-behaviortreedata"><span class="std std-ref">BehaviorTreeData</span></a> <strong>create_from_bt_instance</strong>(bt_instance: <a class="reference internal" href="#document-classes/class_btinstance#class-btinstance"><span class="std std-ref">BTInstance</span></a>) <abbr title="该方法无需实例即可调用,因此可以直接用类名调用。">static</abbr> <a class="reference internal" href="#class-behaviortreedata-method-create-from-bt-instance"><span class="std std-ref">🔗</span></a></p>
<p>返回编码为 <strong>BehaviorTreeData</strong> 的 <code class="docutils literal notranslate"><span class="pre">bt_instance</span></code> 当前状态,适合与 <a class="reference internal" href="#document-classes/class_behaviortreeview#class-behaviortreeview"><span class="std std-ref">BehaviorTreeView</span></a> 一起使用。</p>
<p>行为树实例可以通过 <a class="reference internal" href="#document-classes/class_btplayer#class-btplayer-method-get-bt-instance"><span class="std std-ref">BTPlayer.get_bt_instance</span></a> 获取。</p>
</section>
</section>
<span id="document-classes/class_behaviortreeview"></span><section id="behaviortreeview">
<span id="class-behaviortreeview"></span><h2>BehaviorTreeView<a class="headerlink" href="#behaviortreeview" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p>可视化 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例的当前状态。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>可视化 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例的当前状态。另见 <a class="reference internal" href="#document-classes/class_behaviortreedata#class-behaviortreedata"><span class="std std-ref">BehaviorTreeData</span></a>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-behaviortreeview-property-update-interval-msec"><span class="std std-ref">update_interval_msec</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-behaviortreeview-method-clear"><span class="std std-ref">clear</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-behaviortreeview-method-update-tree"><span class="std std-ref">update_tree</span></a>(behavior_tree_data: <a class="reference internal" href="#document-classes/class_behaviortreedata#class-behaviortreedata"><span class="std std-ref">BehaviorTreeData</span></a>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="signals">
<h3>信号<a class="headerlink" href="#signals" title="Link to this heading"></a></h3>
<p class="classref-signal" id="class-behaviortreeview-signal-task-selected"><strong>task_selected</strong>(type_name: <code class="docutils literal notranslate"><span class="pre">String</span></code>, script_path: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <a class="reference internal" href="#class-behaviortreeview-signal-task-selected"><span class="std std-ref">🔗</span></a></p>
<p>在 <strong>BehaviorTreeView</strong> 中选中某个任务项时发出。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-behaviortreeview-property-update-interval-msec"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>update_interval_msec</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-behaviortreeview-property-update-interval-msec"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_update_interval_msec</strong>(value: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_update_interval_msec</strong>()</p></li>
</ul>
<p>两次更新之间的最小延迟(毫秒)。设为更大的值可以降低 CPU 负载。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-behaviortreeview-method-clear"><abbr title="无返回值。">void</abbr> <strong>clear</strong>() <a class="reference internal" href="#class-behaviortreeview-method-clear"><span class="std std-ref">🔗</span></a></p>
<p>清除树视图。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-behaviortreeview-method-update-tree"><abbr title="无返回值。">void</abbr> <strong>update_tree</strong>(behavior_tree_data: <a class="reference internal" href="#document-classes/class_behaviortreedata#class-behaviortreedata"><span class="std std-ref">BehaviorTreeData</span></a>) <a class="reference internal" href="#class-behaviortreeview-method-update-tree"><span class="std std-ref">🔗</span></a></p>
<p>更新 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 实例的显示。另见 <a class="reference internal" href="#document-classes/class_behaviortreedata#class-behaviortreedata"><span class="std std-ref">BehaviorTreeData</span></a>。</p>
</section>
</section>
<span id="document-classes/class_blackboardplan"></span><section id="blackboardplan">
<span id="class-blackboardplan"></span><h2>BlackboardPlan<a class="headerlink" href="#blackboardplan" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p>存储并管理用于构建新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 实例的变量。</p>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-property-prefetch-nodepath-vars"><span class="std std-ref">prefetch_nodepath_vars</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">true</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-create-blackboard"><span class="std std-ref">create_blackboard</span></a>(prefetch_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, parent_scope: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> = null, prefetch_root_for_base_plan: <code class="docutils literal notranslate"><span class="pre">Node</span></code> = null)</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-get-base-plan"><span class="std std-ref">get_base_plan</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">Callable</span></code></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-get-parent-scope-plan-provider"><span class="std std-ref">get_parent_scope_plan_provider</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-is-derived"><span class="std std-ref">is_derived</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-populate-blackboard"><span class="std std-ref">populate_blackboard</span></a>(blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, overwrite: <code class="docutils literal notranslate"><span class="pre">bool</span></code>, prefetch_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, prefetch_root_for_base_plan: <code class="docutils literal notranslate"><span class="pre">Node</span></code> = null)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-set-base-plan"><span class="std std-ref">set_base_plan</span></a>(blackboard_plan: <a class="reference internal" href="#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>)</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-set-parent-scope-plan-provider"><span class="std std-ref">set_parent_scope_plan_provider</span></a>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-blackboardplan-method-sync-with-base-plan"><span class="std std-ref">sync_with_base_plan</span></a>()</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-blackboardplan-property-prefetch-nodepath-vars"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>prefetch_nodepath_vars</strong> = <code class="docutils literal notranslate"><span class="pre">true</span></code> <a class="reference internal" href="#class-blackboardplan-property-prefetch-nodepath-vars"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_prefetch_nodepath_vars</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_prefetching_nodepath_vars</strong>()</p></li>
</ul>
<p>启用或禁用 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 变量预取。如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,在创建 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 时,<code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 值会被替换为对应的节点实例。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-blackboardplan-method-create-blackboard"><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>create_blackboard</strong>(prefetch_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, parent_scope: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> = null, prefetch_root_for_base_plan: <code class="docutils literal notranslate"><span class="pre">Node</span></code> = null) <a class="reference internal" href="#class-blackboardplan-method-create-blackboard"><span class="std std-ref">🔗</span></a></p>
<p>使用该计划构建一个新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 实例。如果启用了 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 预取,将用 <code class="docutils literal notranslate"><span class="pre">prefetch_root</span></code> 为 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 变量获取节点实例并替换其值。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-get-base-plan"><a class="reference internal" href="#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>get_base_plan</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboardplan-method-get-base-plan"><span class="std std-ref">🔗</span></a></p>
<p>返回基础计划。见 <a class="reference internal" href="#class-blackboardplan-method-is-derived"><span class="std std-ref">is_derived</span></a>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-get-parent-scope-plan-provider"><code class="docutils literal notranslate"><span class="pre">Callable</span></code> <strong>get_parent_scope_plan_provider</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboardplan-method-get-parent-scope-plan-provider"><span class="std std-ref">🔗</span></a></p>
<p>返回父作用域计划提供者 —— 一个返回 <strong>BlackboardPlan</strong> 的可调用对象。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-is-derived"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_derived</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-blackboardplan-method-is-derived"><span class="std std-ref">🔗</span></a></p>
<p>如果此计划派生自另一个计划(即基础计划不为 <code class="docutils literal notranslate"><span class="pre">null</span></code>),则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。派生计划只能包含基础计划中已有的变量,并且只有变量值可以不同。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-populate-blackboard"><abbr title="无返回值。">void</abbr> <strong>populate_blackboard</strong>(blackboard: <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>, overwrite: <code class="docutils literal notranslate"><span class="pre">bool</span></code>, prefetch_root: <code class="docutils literal notranslate"><span class="pre">Node</span></code>, prefetch_root_for_base_plan: <code class="docutils literal notranslate"><span class="pre">Node</span></code> = null) <a class="reference internal" href="#class-blackboardplan-method-populate-blackboard"><span class="std std-ref">🔗</span></a></p>
<p>用该计划中的变量填充 <code class="docutils literal notranslate"><span class="pre">blackboard</span></code>。如果 <code class="docutils literal notranslate"><span class="pre">overwrite</span></code> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,同名变量将被覆盖。如果启用了 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 预取,将用 <code class="docutils literal notranslate"><span class="pre">prefetch_root</span></code> 为 <code class="docutils literal notranslate"><span class="pre">NodePath</span></code> 变量获取节点实例并替换其值。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-set-base-plan"><abbr title="无返回值。">void</abbr> <strong>set_base_plan</strong>(blackboard_plan: <a class="reference internal" href="#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>) <a class="reference internal" href="#class-blackboardplan-method-set-base-plan"><span class="std std-ref">🔗</span></a></p>
<p>设置基础计划。一旦指定,该计划将从基础计划派生。</p>
<p>请谨慎使用,它会移除基础计划中不存在的变量。仅用于自定义工具开发。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-set-parent-scope-plan-provider"><abbr title="无返回值。">void</abbr> <strong>set_parent_scope_plan_provider</strong>(callable: <code class="docutils literal notranslate"><span class="pre">Callable</span></code>) <a class="reference internal" href="#class-blackboardplan-method-set-parent-scope-plan-provider"><span class="std std-ref">🔗</span></a></p>
<p>设置父作用域计划提供者 —— 一个返回 <strong>BlackboardPlan</strong> 的可调用对象。用于在检视面板中提供提示。设置之后即可使用映射功能。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-blackboardplan-method-sync-with-base-plan"><abbr title="无返回值。">void</abbr> <strong>sync_with_base_plan</strong>() <a class="reference internal" href="#class-blackboardplan-method-sync-with-base-plan"><span class="std std-ref">🔗</span></a></p>
<p>将此计划与基础计划同步:移除基础计划中不存在的变量,并更新类型信息。仅用于自定义工具开发。</p>
</section>
</section>
<span id="document-classes/class_bt"></span><section id="bt">
<span id="class-bt"></span><h2>BT<a class="headerlink" href="#bt" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a></p>
<p><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 的基类。</p>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="enumerations">
<h3>枚举<a class="headerlink" href="#enumerations" title="Link to this heading"></a></h3>
<p class="classref-enumeration" id="enum-bt-status">enum <strong>Status</strong>: <a class="reference internal" href="#enum-bt-status"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-bt-constant-fresh"><a class="reference internal" href="#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>FRESH</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>任务尚未执行,或者已被中止并重置。</p>
<p class="classref-enumeration-constant" id="class-bt-constant-running"><a class="reference internal" href="#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>RUNNING</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>任务正在执行,尚未完成。</p>
<p class="classref-enumeration-constant" id="class-bt-constant-failure"><a class="reference internal" href="#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>FAILURE</strong> = <code class="docutils literal notranslate"><span class="pre">2</span></code></p>
<p>任务以失败结束。</p>
<p class="classref-enumeration-constant" id="class-bt-constant-success"><a class="reference internal" href="#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>SUCCESS</strong> = <code class="docutils literal notranslate"><span class="pre">3</span></code></p>
<p>任务以成功结束。</p>
</section>
</section>
<span id="document-classes/class_btaction"></span><section id="btaction">
<span id="class-btaction"></span><h2>BTAction<a class="headerlink" href="#btaction" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btawaitanimation#class-btawaitanimation"><span class="std std-ref">BTAwaitAnimation</span></a>、<a class="reference internal" href="#document-classes/class_btcallmethod#class-btcallmethod"><span class="std std-ref">BTCallMethod</span></a>、<a class="reference internal" href="#document-classes/class_btconsoleprint#class-btconsoleprint"><span class="std std-ref">BTConsolePrint</span></a>、<a class="reference internal" href="#document-classes/class_btevaluateexpression#class-btevaluateexpression"><span class="std std-ref">BTEvaluateExpression</span></a>、<a class="reference internal" href="#document-classes/class_btfail#class-btfail"><span class="std std-ref">BTFail</span></a>、<a class="reference internal" href="#document-classes/class_btpauseanimation#class-btpauseanimation"><span class="std std-ref">BTPauseAnimation</span></a>、<a class="reference internal" href="#document-classes/class_btplayanimation#class-btplayanimation"><span class="std std-ref">BTPlayAnimation</span></a>、<a class="reference internal" href="#document-classes/class_btrandomwait#class-btrandomwait"><span class="std std-ref">BTRandomWait</span></a>、<a class="reference internal" href="#document-classes/class_btsetagentproperty#class-btsetagentproperty"><span class="std std-ref">BTSetAgentProperty</span></a>、<a class="reference internal" href="#document-classes/class_btsetvar#class-btsetvar"><span class="std std-ref">BTSetVar</span></a>、<a class="reference internal" href="#document-classes/class_btstopanimation#class-btstopanimation"><span class="std std-ref">BTStopAnimation</span></a>、<a class="reference internal" href="#document-classes/class_btwait#class-btwait"><span class="std std-ref">BTWait</span></a>、<a class="reference internal" href="#document-classes/class_btwaitticks#class-btwaitticks"><span class="std std-ref">BTWaitTicks</span></a></p>
<p>所有 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 动作的基类。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中所有动作的基类。你可以通过继承 <strong>BTAction</strong> 类来创建自己的动作。</p>
<p>表示 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中智能体应当执行的某个具体行为或动作。动作是 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 层次结构的最底层,负责执行达成目标所需的实际工作。动作没有子任务。</p>
<p>单个动作可以在一个或多个 tick 内完成任务。如果完成任务需要不止一个 tick,该动作应返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 状态。任务完成时,动作返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 来表示结果。</p>
</section>
</section>
<span id="document-classes/class_btalwaysfail"></span><section id="btalwaysfail">
<span id="class-btalwaysfail"></span><h2>BTAlwaysFail<a class="headerlink" href="#btalwaysfail" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>把 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 转换为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 的 BT 装饰器。</p>
</section>
<span id="document-classes/class_btalwayssucceed"></span><section id="btalwayssucceed">
<span id="class-btalwayssucceed"></span><h2>BTAlwaysSucceed<a class="headerlink" href="#btalwayssucceed" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>把 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 转换为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 装饰器。</p>
</section>
<span id="document-classes/class_btawaitanimation"></span><section id="btawaitanimation">
<span id="class-btawaitanimation"></span><h2>BTAwaitAnimation<a class="headerlink" href="#btawaitanimation" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>等待动画播放完毕的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTAwaitAnimation 动作会等待指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上的动画播放完毕,然后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果指定动画已播放完毕,或者指定动画当前未在播放,则返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果指定动画不存在,或者该动作获取 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点失败,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btawaitanimation-property-animation-name"><span class="std std-ref">animation_name</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btawaitanimation-property-animation-player"><span class="std std-ref">animation_player</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btawaitanimation-property-max-time"><span class="std std-ref">max_time</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1.0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btawaitanimation-property-animation-name"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>animation_name</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btawaitanimation-property-animation-name"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_name</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_animation_name</strong>()</p></li>
</ul>
<p>动画在 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点中的键名。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btawaitanimation-property-animation-player"><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>animation_player</strong> <a class="reference internal" href="#class-btawaitanimation-property-animation-player"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_player</strong>(value: <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>get_animation_player</strong>()</p></li>
</ul>
<p>指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btawaitanimation-property-max-time"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>max_time</strong> = <code class="docutils literal notranslate"><span class="pre">1.0</span></code> <a class="reference internal" href="#class-btawaitanimation-property-max-time"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_max_time</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_max_time</strong>()</p></li>
</ul>
<p>等待动画完成的最长时长(秒)。如果动画在此时间内没有播放完毕,BTAwaitAnimation 会停止等待并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btcallmethod"></span><section id="btcallmethod">
<span id="class-btcallmethod"></span><h2>BTCallMethod<a class="headerlink" href="#btcallmethod" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>在指定的 <code class="docutils literal notranslate"><span class="pre">Node</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 上调用方法的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTCallMethod 动作会在指定的 <code class="docutils literal notranslate"><span class="pre">Node</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 实例上调用 <a class="reference internal" href="#class-btcallmethod-property-method"><span class="std std-ref">method</span></a>,然后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果该动作在方法执行期间遇到问题,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p>Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>]</p></td>
<td><p><a class="reference internal" href="#class-btcallmethod-property-args"><span class="std std-ref">args</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">[]</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcallmethod-property-args-include-delta"><span class="std std-ref">args_include_delta</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcallmethod-property-method"><span class="std std-ref">method</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btcallmethod-property-node"><span class="std std-ref">node</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcallmethod-property-result-var"><span class="std std-ref">result_var</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btcallmethod-property-args">Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>] <strong>args</strong> = <code class="docutils literal notranslate"><span class="pre">[]</span></code> <a class="reference internal" href="#class-btcallmethod-property-args"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_args</strong>(value: Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>])</p></li>
<li><p>Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>] <strong>get_args</strong>()</p></li>
</ul>
<p>调用方法时要传入的实参。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcallmethod-property-args-include-delta"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>args_include_delta</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btcallmethod-property-args-include-delta"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_include_delta</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_delta_included</strong>()</p></li>
</ul>
<p>把 delta 作为第一个参数包含进来,并相应地后移其余参数的位置(如果有的话)。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcallmethod-property-method"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>method</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btcallmethod-property-method"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_method</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_method</strong>()</p></li>
</ul>
<p>要调用的方法名。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcallmethod-property-node"><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>node</strong> <a class="reference internal" href="#class-btcallmethod-property-node"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_node_param</strong>(value: <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>get_node_param</strong>()</p></li>
</ul>
<p>指定包含要调用方法的 <code class="docutils literal notranslate"><span class="pre">Node</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 实例。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcallmethod-property-result-var"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>result_var</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btcallmethod-property-result-var"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_result_var</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_result_var</strong>()</p></li>
</ul>
<p>如果不为空,则把方法调用的结果赋给该属性指定的黑板变量。</p>
</section>
</section>
<span id="document-classes/class_btcheckagentproperty"></span><section id="btcheckagentproperty">
<span id="class-btcheckagentproperty"></span><h2>BTCheckAgentProperty<a class="headerlink" href="#btcheckagentproperty" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>检查智能体属性值的 BT 条件。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTCheckAgentProperty 会检查智能体的属性值,并将其与 <a class="reference internal" href="#class-btcheckagentproperty-property-value"><span class="std std-ref">value</span></a> 进行比较。</p>
<p>根据 <a class="reference internal" href="#class-btcheckagentproperty-property-check-type"><span class="std std-ref">check_type</span></a> 返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a></p></td>
<td><p><a class="reference internal" href="#class-btcheckagentproperty-property-check-type"><span class="std std-ref">check_type</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcheckagentproperty-property-property"><span class="std std-ref">property</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a></p></td>
<td><p><a class="reference internal" href="#class-btcheckagentproperty-property-value"><span class="std std-ref">value</span></a></p></td>
<td></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btcheckagentproperty-property-check-type"><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>check_type</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-btcheckagentproperty-property-check-type"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_check_type</strong>(value: <a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>get_check_type</strong>()</p></li>
</ul>
<p>要执行的检查类型。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcheckagentproperty-property-property"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>property</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btcheckagentproperty-property-property"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_property</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_property</strong>()</p></li>
</ul>
<p>指定要比较的智能体属性的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcheckagentproperty-property-value"><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>value</strong> <a class="reference internal" href="#class-btcheckagentproperty-property-value"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_value</strong>(value: <a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>get_value</strong>()</p></li>
</ul>
<p>指定智能体属性将与之比较的值的参数。</p>
</section>
</section>
<span id="document-classes/class_btchecktrigger"></span><section id="btchecktrigger">
<span id="class-btchecktrigger"></span><h2>BTCheckTrigger<a class="headerlink" href="#btchecktrigger" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>检查触发器(一个布尔变量)的 BT 条件。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p><strong>BTCheckTrigger</strong> 检查 <a class="reference internal" href="#class-btchecktrigger-property-variable"><span class="std std-ref">variable</span></a> 是否被设为 <code class="docutils literal notranslate"><span class="pre">true</span></code>。如果是,它会把该变量切换为 <code class="docutils literal notranslate"><span class="pre">false</span></code> 并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>;否则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p><strong>BTCheckTrigger</strong> 可以在 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 中充当“门闩”:当触发器变量被设为 <code class="docutils literal notranslate"><span class="pre">true</span></code> 时,它允许执行后续任务,随后把该变量改为 <code class="docutils literal notranslate"><span class="pre">false</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btchecktrigger-property-variable"><span class="std std-ref">variable</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btchecktrigger-property-variable"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>variable</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btchecktrigger-property-variable"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_variable</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_variable</strong>()</p></li>
</ul>
<p>黑板上用作触发器的布尔变量。另见 <a class="reference internal" href="#document-classes/class_bttask#class-bttask-property-blackboard"><span class="std std-ref">BTTask.blackboard</span></a>。</p>
<p>如果变量的值为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,<strong>BTCheckTrigger</strong> 会把它切换为 <code class="docutils literal notranslate"><span class="pre">false</span></code> 并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果变量的值为 <code class="docutils literal notranslate"><span class="pre">false</span></code>,<strong>BTCheckTrigger</strong> 会返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btcheckvar"></span><section id="btcheckvar">
<span id="class-btcheckvar"></span><h2>BTCheckVar<a class="headerlink" href="#btcheckvar" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcondition#class-btcondition"><span class="std std-ref">BTCondition</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>检查黑板上变量的 BT 条件。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTCheckVar 会把 <a class="reference internal" href="#class-btcheckvar-property-variable"><span class="std std-ref">variable</span></a> 与 <a class="reference internal" href="#class-btcheckvar-property-value"><span class="std std-ref">value</span></a> 进行比较,并根据 <a class="reference internal" href="#class-btcheckvar-property-check-type"><span class="std std-ref">check_type</span></a> 返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a></p></td>
<td><p><a class="reference internal" href="#class-btcheckvar-property-check-type"><span class="std std-ref">check_type</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a></p></td>
<td><p><a class="reference internal" href="#class-btcheckvar-property-value"><span class="std std-ref">value</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcheckvar-property-variable"><span class="std std-ref">variable</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btcheckvar-property-check-type"><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>check_type</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-btcheckvar-property-check-type"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_check_type</strong>(value: <a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>get_check_type</strong>()</p></li>
</ul>
<p>要执行的检查类型。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcheckvar-property-value"><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>value</strong> <a class="reference internal" href="#class-btcheckvar-property-value"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_value</strong>(value: <a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>get_value</strong>()</p></li>
</ul>
<p>指定 <a class="reference internal" href="#class-btcheckvar-property-variable"><span class="std std-ref">variable</span></a> 将与之比较的值的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcheckvar-property-variable"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>variable</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btcheckvar-property-variable"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_variable</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_variable</strong>()</p></li>
</ul>
<p>要检查其值的变量名。</p>
</section>
</section>
<span id="document-classes/class_btcomment"></span><section id="btcomment">
<span id="class-btcomment"></span><h2>BTComment<a class="headerlink" href="#btcomment" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>BTComment 为 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 添加注解或说明性文字。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTComment 用于为 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 添加注解或说明性备注。</p>
<p>注释不会作为树的一部分被执行,并且在 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 的运行时实例中会被移除。</p>
</section>
</section>
<span id="document-classes/class_btcomposite"></span><section id="btcomposite">
<span id="class-btcomposite"></span><h2>BTComposite<a class="headerlink" href="#btcomposite" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btdynamicselector#class-btdynamicselector"><span class="std std-ref">BTDynamicSelector</span></a>、<a class="reference internal" href="#document-classes/class_btdynamicsequence#class-btdynamicsequence"><span class="std std-ref">BTDynamicSequence</span></a>、<a class="reference internal" href="#document-classes/class_btparallel#class-btparallel"><span class="std std-ref">BTParallel</span></a>、<a class="reference internal" href="#document-classes/class_btprobabilityselector#class-btprobabilityselector"><span class="std std-ref">BTProbabilitySelector</span></a>、<a class="reference internal" href="#document-classes/class_btrandomselector#class-btrandomselector"><span class="std std-ref">BTRandomSelector</span></a>、<a class="reference internal" href="#document-classes/class_btrandomsequence#class-btrandomsequence"><span class="std std-ref">BTRandomSequence</span></a>、<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a>、<a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a></p>
<p>BT 组合任务的基类。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>所有 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 组合任务的基类。你可以通过继承 BTComposite 类来创建自己的组合任务。</p>
<p>组合任务(Composite)是 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中的一种控制任务,包含一个或多个子任务。它通过规定子任务的执行方式,定义 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 的结构与流程。组合任务可以把相关任务归组为一个单元,让 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 更易管理和维护。<a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 组合任务的例子包括 <a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a>、<a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 和 <a class="reference internal" href="#document-classes/class_btparallel#class-btparallel"><span class="std std-ref">BTParallel</span></a>。</p>
</section>
</section>
<span id="document-classes/class_btcondition"></span><section id="btcondition">
<span id="class-btcondition"></span><h2>BTCondition<a class="headerlink" href="#btcondition" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btcheckagentproperty#class-btcheckagentproperty"><span class="std std-ref">BTCheckAgentProperty</span></a>、<a class="reference internal" href="#document-classes/class_btchecktrigger#class-btchecktrigger"><span class="std std-ref">BTCheckTrigger</span></a>、<a class="reference internal" href="#document-classes/class_btcheckvar#class-btcheckvar"><span class="std std-ref">BTCheckVar</span></a></p>
<p>BT 条件的基类。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>所有 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 条件的基类。你可以通过继承 <strong>BTCondition</strong> 类来创建自己的条件。</p>
<p>条件(Condition)是 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中的一种任务,它在执行后续任务之前检查特定条件。条件常用于组合任务内部以控制执行流程,用来验证环境状态、检查敌人是否存在,或评估智能体的生命值状态。在 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中使用条件任务可以提高系统效率并避免不必要的动作。不过,它们可能不适合复杂的决策过程,而且条件任务过多会让 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 难以阅读。</p>
<p>条件通常不需要多个 tick 就能完成,会立即返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btconsoleprint"></span><section id="btconsoleprint">
<span id="class-btconsoleprint"></span><h2>BTConsolePrint<a class="headerlink" href="#btconsoleprint" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>向控制台输出文本的 BT 动作任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTConsolePrint 动作会向控制台输出文本并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。它可以包含类似于 GDScript % 运算符的格式化参数占位符。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code></p></td>
<td><p><a class="reference internal" href="#class-btconsoleprint-property-bb-format-parameters"><span class="std std-ref">bb_format_parameters</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray()</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-btconsoleprint-property-text"><span class="std std-ref">text</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btconsoleprint-property-bb-format-parameters"><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code> <strong>bb_format_parameters</strong> = <code class="docutils literal notranslate"><span class="pre">PackedStringArray()</span></code> <a class="reference internal" href="#class-btconsoleprint-property-bb-format-parameters"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_bb_format_parameters</strong>(value: <code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code> <strong>get_bb_format_parameters</strong>()</p></li>
</ul>
<p>格式化参数的值会作为将要打印文本的格式化实参。</p>
<p><strong>注意:</strong>返回的数组是<em>副本</em>,对它的任何修改都不会更新原始属性值。更多细节见 <code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btconsoleprint-property-text"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>text</strong> = <code class="docutils literal notranslate"><span class="pre">""</span></code> <a class="reference internal" href="#class-btconsoleprint-property-text"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_text</strong>(value: <code class="docutils literal notranslate"><span class="pre">String</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_text</strong>()</p></li>
</ul>
<p>要打印的文本,可以包含多个占位符,用于替换为格式化实参。这些占位符遵循与 GDScript % 运算符相同的格式,通常以 ‘%’ 开头并后接格式说明符。例如:%s 表示字符串,%d 表示整数,%f 表示实数。</p>
</section>
</section>
<span id="document-classes/class_btcooldown"></span><section id="btcooldown">
<span id="class-btcooldown"></span><h2>BTCooldown<a class="headerlink" href="#btcooldown" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>只有距上次执行已过去 <a class="reference internal" href="#class-btcooldown-property-duration"><span class="std std-ref">duration</span></a> 时间时,才执行其子任务的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>只有距上次子任务成功执行已过去 <a class="reference internal" href="#class-btcooldown-property-duration"><span class="std std-ref">duration</span></a> 时间时,BTCooldown 才运行其子任务。除非把 <a class="reference internal" href="#class-btcooldown-property-trigger-on-failure"><span class="std std-ref">trigger_on_failure</span></a> 设为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,否则它只考虑成功的执行。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,并触发冷却计时器。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,或者距上次执行尚未过去 <a class="reference internal" href="#class-btcooldown-property-duration"><span class="std std-ref">duration</span></a> 时间,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcooldown-property-cooldown-state-var"><span class="std std-ref">cooldown_state_var</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcooldown-property-duration"><span class="std std-ref">duration</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">10.0</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcooldown-property-process-pause"><span class="std std-ref">process_pause</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcooldown-property-start-cooled"><span class="std std-ref">start_cooled</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btcooldown-property-trigger-on-failure"><span class="std std-ref">trigger_on_failure</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btcooldown-property-cooldown-state-var"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>cooldown_state_var</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btcooldown-property-cooldown-state-var"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_cooldown_state_var</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_cooldown_state_var</strong>()</p></li>
</ul>
<p>用于在 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 中存储冷却状态的布尔变量。如果留空,该变量会被自动生成并赋值。</p>
<p>如果该变量的值被设为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,表示冷却已激活。此特性可用于从树的其他部分检查冷却状态,或在 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 的不同部分之间共享它。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcooldown-property-duration"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>duration</strong> = <code class="docutils literal notranslate"><span class="pre">10.0</span></code> <a class="reference internal" href="#class-btcooldown-property-duration"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_duration</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_duration</strong>()</p></li>
</ul>
<p>允许下一次执行子任务之前需要等待的时间。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcooldown-property-process-pause"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>process_pause</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btcooldown-property-process-pause"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_process_pause</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_process_pause</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,则在 <code class="docutils literal notranslate"><span class="pre">SceneTree</span></code> 暂停时也处理冷却。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcooldown-property-start-cooled"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>start_cooled</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btcooldown-property-start-cooled"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_start_cooled</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_start_cooled</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,则像子任务在第一次 BT tick 之前已执行过一样开始冷却。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btcooldown-property-trigger-on-failure"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>trigger_on_failure</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btcooldown-property-trigger-on-failure"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_trigger_on_failure</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_trigger_on_failure</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,当子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时也会激活冷却。否则,只有子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 时才会触发冷却。</p>
</section>
</section>
<span id="document-classes/class_btdecorator"></span><section id="btdecorator">
<span id="class-btdecorator"></span><h2>BTDecorator<a class="headerlink" href="#btdecorator" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btalwaysfail#class-btalwaysfail"><span class="std std-ref">BTAlwaysFail</span></a>、<a class="reference internal" href="#document-classes/class_btalwayssucceed#class-btalwayssucceed"><span class="std std-ref">BTAlwaysSucceed</span></a>、<a class="reference internal" href="#document-classes/class_btcooldown#class-btcooldown"><span class="std std-ref">BTCooldown</span></a>、<a class="reference internal" href="#document-classes/class_btdelay#class-btdelay"><span class="std std-ref">BTDelay</span></a>、<a class="reference internal" href="#document-classes/class_btforeach#class-btforeach"><span class="std std-ref">BTForEach</span></a>、<a class="reference internal" href="#document-classes/class_btinvert#class-btinvert"><span class="std std-ref">BTInvert</span></a>、<a class="reference internal" href="#document-classes/class_btnewscope#class-btnewscope"><span class="std std-ref">BTNewScope</span></a>、<a class="reference internal" href="#document-classes/class_btprobability#class-btprobability"><span class="std std-ref">BTProbability</span></a>、<a class="reference internal" href="#document-classes/class_btrepeat#class-btrepeat"><span class="std std-ref">BTRepeat</span></a>、<a class="reference internal" href="#document-classes/class_btrepeatuntilfailure#class-btrepeatuntilfailure"><span class="std std-ref">BTRepeatUntilFailure</span></a>、<a class="reference internal" href="#document-classes/class_btrepeatuntilsuccess#class-btrepeatuntilsuccess"><span class="std std-ref">BTRepeatUntilSuccess</span></a>、<a class="reference internal" href="#document-classes/class_btrunlimit#class-btrunlimit"><span class="std std-ref">BTRunLimit</span></a>、<a class="reference internal" href="#document-classes/class_bttimelimit#class-bttimelimit"><span class="std std-ref">BTTimeLimit</span></a></p>
<p>BT 装饰器的基类。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>所有 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 装饰器的基类。你可以通过继承 BTDecorator 类来创建自己的装饰器。</p>
<p>装饰器是 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 中用于改变其子任务行为的一种任务。装饰器只能拥有一个子任务。</p>
<p>装饰器可以为任务的执行添加条件、限制或其他约束。<a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 装饰器的例子包括 <a class="reference internal" href="#document-classes/class_btinvert#class-btinvert"><span class="std std-ref">BTInvert</span></a>、<a class="reference internal" href="#document-classes/class_btrepeat#class-btrepeat"><span class="std std-ref">BTRepeat</span></a> 和 <a class="reference internal" href="#document-classes/class_btcooldown#class-btcooldown"><span class="std std-ref">BTCooldown</span></a>。使用 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 装饰器可以为现有任务添加额外逻辑,从而简化复杂行为的设计与实现。</p>
</section>
</section>
<span id="document-classes/class_btdelay"></span><section id="btdelay">
<span id="class-btdelay"></span><h2>BTDelay<a class="headerlink" href="#btdelay" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>在执行其子任务之前引入延迟的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTDelay 在执行其子任务之前引入 <a class="reference internal" href="#class-btdelay-property-seconds"><span class="std std-ref">seconds</span></a> 的延迟。在延迟期间返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btdelay-property-seconds"><span class="std std-ref">seconds</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1.0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btdelay-property-seconds"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>seconds</strong> = <code class="docutils literal notranslate"><span class="pre">1.0</span></code> <a class="reference internal" href="#class-btdelay-property-seconds"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_seconds</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_seconds</strong>()</p></li>
</ul>
<p>延迟时长(秒)。</p>
</section>
</section>
<span id="document-classes/class_btdynamicselector"></span><section id="btdynamicselector">
<span id="class-btdynamicselector"></span><h2>BTDynamicSelector<a class="headerlink" href="#btdynamicselector" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>每个 tick 都从头执行任务、直到出现第一个 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTDynamicSelector 按顺序从第一个到最后一个执行子任务,直到任一子任务返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。与 <a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a> 不同,它每个 tick 都会从头开始执行任务,重新评估它们的状态。当你希望每个 tick 都重试更高优先级的行为时,它非常有用。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。BTDynamicSelector 会记住最后一个 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的子任务,但与 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 不同,在下一个执行 tick 中它会重新执行之前的任务并重新评估它们的返回状态。如果之前的任一任务没有返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,它会中止所记住的那个 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 任务。</p>
<p>如果所有子任务结果都为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btdynamicsequence"></span><section id="btdynamicsequence">
<span id="class-btdynamicsequence"></span><h2>BTDynamicSequence<a class="headerlink" href="#btdynamicsequence" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>每个 tick 都从头执行任务、只要它们返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 就继续的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTDynamicSequence 按顺序从第一个到最后一个执行子任务,只要它们返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 就继续。与 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 不同,它每个 tick 都会从头开始执行任务,重新评估它们的状态。当你希望在每个 tick 都重新检查某个长时间运行动作之前的条件,并在任一条件结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时中止那个 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 动作时,它非常有用。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。BTDynamicSequence 会记住最后一个 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的子任务,但与 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 不同,在下一个执行 tick 中它会重新执行之前的任务并重新评估它们的返回状态。如果之前的任一任务没有返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,它会中止所记住的那个 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 任务。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果所有子任务结果都为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btevaluateexpression"></span><section id="btevaluateexpression">
<span id="class-btevaluateexpression"></span><h2>BTEvaluateExpression<a class="headerlink" href="#btevaluateexpression" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>在指定的 <code class="docutils literal notranslate"><span class="pre">Node</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 上求值 <code class="docutils literal notranslate"><span class="pre">Expression</span></code> 的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTEvaluateExpression 动作会在指定的 <code class="docutils literal notranslate"><span class="pre">Node</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 实例上求值 <a class="reference internal" href="#class-btevaluateexpression-property-expression-string"><span class="std std-ref">expression_string</span></a>,当 <code class="docutils literal notranslate"><span class="pre">Expression</span></code> 执行成功时返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果该动作在 <code class="docutils literal notranslate"><span class="pre">Expression</span></code> 解析或执行期间遇到问题,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-property-expression-string"><span class="std std-ref">expression_string</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-property-input-include-delta"><span class="std std-ref">input_include_delta</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code></p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-property-input-names"><span class="std std-ref">input_names</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray()</span></code></p></td>
</tr>
<tr class="row-even"><td><p>Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>]</p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-property-input-values"><span class="std std-ref">input_values</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">[]</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-property-node"><span class="std std-ref">node</span></a></p></td>
<td></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-property-result-var"><span class="std std-ref">result_var</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p>Error</p></td>
<td><p><a class="reference internal" href="#class-btevaluateexpression-method-parse"><span class="std std-ref">parse</span></a>()</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btevaluateexpression-property-expression-string"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>expression_string</strong> = <code class="docutils literal notranslate"><span class="pre">""</span></code> <a class="reference internal" href="#class-btevaluateexpression-property-expression-string"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_expression_string</strong>(value: <code class="docutils literal notranslate"><span class="pre">String</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_expression_string</strong>()</p></li>
</ul>
<p>要解析并执行的表达式字符串。</p>
<p><strong>警告:</strong>更新 <a class="reference internal" href="#class-btevaluateexpression-property-expression-string"><span class="std std-ref">expression_string</span></a> 后请调用 <a class="reference internal" href="#class-btevaluateexpression-method-parse"><span class="std std-ref">parse</span></a> 来更新内部的 <code class="docutils literal notranslate"><span class="pre">Expression</span></code>,因为它不会自动更新。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btevaluateexpression-property-input-include-delta"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>input_include_delta</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btevaluateexpression-property-input-include-delta"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_input_include_delta</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_input_delta_included</strong>()</p></li>
</ul>
<p>如果启用,输入变量 <code class="docutils literal notranslate"><span class="pre">delta</span></code> 会被加入 <a class="reference internal" href="#class-btevaluateexpression-property-input-names"><span class="std std-ref">input_names</span></a> 和 <a class="reference internal" href="#class-btevaluateexpression-property-input-values"><span class="std std-ref">input_values</span></a>。</p>
<p><strong>警告:</strong>切换 <a class="reference internal" href="#class-btevaluateexpression-property-input-include-delta"><span class="std std-ref">input_include_delta</span></a> 后请调用 <a class="reference internal" href="#class-btevaluateexpression-method-parse"><span class="std std-ref">parse</span></a> 来更新内部的 <code class="docutils literal notranslate"><span class="pre">Expression</span></code>,因为它不会自动更新。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btevaluateexpression-property-input-names"><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code> <strong>input_names</strong> = <code class="docutils literal notranslate"><span class="pre">PackedStringArray()</span></code> <a class="reference internal" href="#class-btevaluateexpression-property-input-names"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_input_names</strong>(value: <code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code> <strong>get_input_names</strong>()</p></li>
</ul>
<p><a class="reference internal" href="#class-btevaluateexpression-property-expression-string"><span class="std std-ref">expression_string</span></a> 中的变量名列表,用户将通过 <a class="reference internal" href="#class-btevaluateexpression-property-input-values"><span class="std std-ref">input_values</span></a> 为这些变量提供值。</p>
<p><strong>警告:</strong>更新 <a class="reference internal" href="#class-btevaluateexpression-property-input-names"><span class="std std-ref">input_names</span></a> 后请调用 <a class="reference internal" href="#class-btevaluateexpression-method-parse"><span class="std std-ref">parse</span></a> 来更新内部的 <code class="docutils literal notranslate"><span class="pre">Expression</span></code>,因为它不会自动更新。</p>
<p><strong>注意:</strong>返回的数组是<em>副本</em>,对它的任何修改都不会更新原始属性值。更多细节见 <code class="docutils literal notranslate"><span class="pre">PackedStringArray</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btevaluateexpression-property-input-values">Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>] <strong>input_values</strong> = <code class="docutils literal notranslate"><span class="pre">[]</span></code> <a class="reference internal" href="#class-btevaluateexpression-property-input-values"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_input_values</strong>(value: Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>])</p></li>
<li><p>Array[<a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>] <strong>get_input_values</strong>()</p></li>
</ul>
<p><a class="reference internal" href="#class-btevaluateexpression-property-input-names"><span class="std std-ref">input_names</span></a> 中指定变量对应的值列表。这些值通过数组索引与变量一一对应。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btevaluateexpression-property-node"><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>node</strong> <a class="reference internal" href="#class-btevaluateexpression-property-node"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_node_param</strong>(value: <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>get_node_param</strong>()</p></li>
</ul>
<p>指定包含要调用方法的 <code class="docutils literal notranslate"><span class="pre">Node</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Object</span></code> 实例。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btevaluateexpression-property-result-var"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>result_var</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btevaluateexpression-property-result-var"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_result_var</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_result_var</strong>()</p></li>
</ul>
<p>如果不为空,则把方法调用的结果赋给该属性指定的黑板变量。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-btevaluateexpression-method-parse">Error <strong>parse</strong>() <a class="reference internal" href="#class-btevaluateexpression-method-parse"><span class="std std-ref">🔗</span></a></p>
<p>在考虑 <a class="reference internal" href="#class-btevaluateexpression-property-input-include-delta"><span class="std std-ref">input_include_delta</span></a> 和 <a class="reference internal" href="#class-btevaluateexpression-property-input-names"><span class="std std-ref">input_names</span></a> 的前提下调用 Expression.parse,并返回其错误码。</p>
</section>
</section>
<span id="document-classes/class_btfail"></span><section id="btfail">
<span id="class-btfail"></span><h2>BTFail<a class="headerlink" href="#btfail" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>总是返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 的 BT 动作。</p>
</section>
<span id="document-classes/class_btforeach"></span><section id="btforeach">
<span id="class-btforeach"></span><h2>BTForEach<a class="headerlink" href="#btforeach" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>针对 <code class="docutils literal notranslate"><span class="pre">Array</span></code> 的每个元素执行其子任务的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTForEach 针对 <code class="docutils literal notranslate"><span class="pre">Array</span></code> 的每个元素执行其子任务。在每次迭代中,当前元素会被存入指定的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量中。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,或者子任务在非最后一次迭代中结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,则返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果子任务在最后一次迭代中结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btforeach-property-array-var"><span class="std std-ref">array_var</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btforeach-property-save-var"><span class="std std-ref">save_var</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btforeach-property-array-var"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>array_var</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btforeach-property-array-var"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_array_var</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_array_var</strong>()</p></li>
</ul>
<p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 中存放 <code class="docutils literal notranslate"><span class="pre">Array</span></code> 的变量,用于迭代过程。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btforeach-property-save-var"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>save_var</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btforeach-property-save-var"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_save_var</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_save_var</strong>()</p></li>
</ul>
<p>用于存储 <a class="reference internal" href="#class-btforeach-property-array-var"><span class="std std-ref">array_var</span></a> 所引用数组中某个元素的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量。</p>
</section>
</section>
<span id="document-classes/class_btinstance"></span><section id="btinstance">
<span id="class-btinstance"></span><h2>BTInstance<a class="headerlink" href="#btinstance" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p>表示 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源的运行时实例。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>可以使用 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree-method-instantiate"><span class="std std-ref">BehaviorTree.instantiate</span></a> 方法创建。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btinstance-property-monitor-performance"><span class="std std-ref">monitor_performance</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">Node</span></code></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-get-agent"><span class="std std-ref">get_agent</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-get-blackboard"><span class="std std-ref">get_blackboard</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-get-last-status"><span class="std std-ref">get_last_status</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">Node</span></code></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-get-owner-node"><span class="std std-ref">get_owner_node</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-get-root-task"><span class="std std-ref">get_root_task</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-get-source-bt-path"><span class="std std-ref">get_source_bt_path</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-is-instance-valid"><span class="std std-ref">is_instance_valid</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-register-with-debugger"><span class="std std-ref">register_with_debugger</span></a>()</p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-unregister-with-debugger"><span class="std std-ref">unregister_with_debugger</span></a>()</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a></p></td>
<td><p><a class="reference internal" href="#class-btinstance-method-update"><span class="std std-ref">update</span></a>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="signals">
<h3>信号<a class="headerlink" href="#signals" title="Link to this heading"></a></h3>
<p class="classref-signal" id="class-btinstance-signal-freed"><strong>freed</strong>() <a class="reference internal" href="#class-btinstance-signal-freed"><span class="std std-ref">🔗</span></a></p>
<p>当行为树实例被释放时发出。调试器用它来注销实例。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-signal" id="class-btinstance-signal-updated"><strong>updated</strong>(status: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <a class="reference internal" href="#class-btinstance-signal-updated"><span class="std std-ref">🔗</span></a></p>
<p>当行为树实例完成更新时发出。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btinstance-property-monitor-performance"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>monitor_performance</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btinstance-property-monitor-performance"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_monitor_performance</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_monitor_performance</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,会在编辑器的 “Debugger-&gt;Monitors” 中为此实例添加一个性能监视器。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-btinstance-method-get-agent"><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>get_agent</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-get-agent"><span class="std std-ref">🔗</span></a></p>
<p>返回行为树实例的智能体。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-get-blackboard"><a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> <strong>get_blackboard</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-get-blackboard"><span class="std std-ref">🔗</span></a></p>
<p>返回行为树实例的黑板。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-get-last-status"><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>get_last_status</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-get-last-status"><span class="std std-ref">🔗</span></a></p>
<p>返回上一次更新的执行状态。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-get-owner-node"><code class="docutils literal notranslate"><span class="pre">Node</span></code> <strong>get_owner_node</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-get-owner-node"><span class="std std-ref">🔗</span></a></p>
<p>返回拥有此行为树实例的场景 <code class="docutils literal notranslate"><span class="pre">Node</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-get-root-task"><a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>get_root_task</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-get-root-task"><span class="std std-ref">🔗</span></a></p>
<p>返回行为树实例的根任务。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-get-source-bt-path"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_source_bt_path</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-get-source-bt-path"><span class="std std-ref">🔗</span></a></p>
<p>返回用于创建此实例的行为树资源的文件路径。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-is-instance-valid"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>is_instance_valid</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btinstance-method-is-instance-valid"><span class="std std-ref">🔗</span></a></p>
<p>如果行为树实例已正确初始化并可以使用,则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-register-with-debugger"><abbr title="无返回值。">void</abbr> <strong>register_with_debugger</strong>() <a class="reference internal" href="#class-btinstance-method-register-with-debugger"><span class="std std-ref">🔗</span></a></p>
<p>向调试器注册该行为树实例。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-unregister-with-debugger"><abbr title="无返回值。">void</abbr> <strong>unregister_with_debugger</strong>() <a class="reference internal" href="#class-btinstance-method-unregister-with-debugger"><span class="std std-ref">🔗</span></a></p>
<p>从调试器注销该行为树实例。通常不需要这样做,因为实例被释放时调试器会自动注销它。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btinstance-method-update"><a class="reference internal" href="#document-classes/class_bt#enum-bt-status"><span class="std std-ref">Status</span></a> <strong>update</strong>(delta: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-btinstance-method-update"><span class="std std-ref">🔗</span></a></p>
<p>对行为树实例执行一次 tick 并返回其状态。</p>
</section>
</section>
<span id="document-classes/class_btinvert"></span><section id="btinvert">
<span id="class-btinvert"></span><h2>BTInvert<a class="headerlink" href="#btinvert" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>把 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 转换为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>、把 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 转换为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTInvert 把 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 转换为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>、把 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 转换为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btnewscope"></span><section id="btnewscope">
<span id="class-btnewscope"></span><h2>BTNewScope<a class="headerlink" href="#btnewscope" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p><strong>被继承:</strong><a class="reference internal" href="#document-classes/class_btsubtree#class-btsubtree"><span class="std std-ref">BTSubtree</span></a></p>
<p>创建新 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 作用域的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTNewScope 在初始化期间创建一个新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 作用域并向其中填充数据。见 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a>。</p>
<p>返回子任务的执行状态。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a></p></td>
<td><p><a class="reference internal" href="#class-btnewscope-property-blackboard-plan"><span class="std std-ref">blackboard_plan</span></a></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btnewscope-property-blackboard-plan"><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>blackboard_plan</strong> <a class="reference internal" href="#class-btnewscope-property-blackboard-plan"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_blackboard_plan</strong>(value: <a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_blackboardplan#class-blackboardplan"><span class="std std-ref">BlackboardPlan</span></a> <strong>get_blackboard_plan</strong>()</p></li>
</ul>
<p>存储并管理用于构建新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 实例的变量。</p>
</section>
</section>
<span id="document-classes/class_btparallel"></span><section id="btparallel">
<span id="class-btparallel"></span><h2>BTParallel<a class="headerlink" href="#btparallel" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>同时执行所有子任务的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTParallel 同时执行其所有子任务。注意 BTParallel 并不涉及多线程:它在同一个 tick 内按顺序从第一个到最后一个处理每个任务,然后返回结果。如果满足任一中止条件,所有当前处于 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的任务都会被终止,结果将是 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 或 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 之一。<a class="reference internal" href="#class-btparallel-property-num-failures-required"><span class="std std-ref">num_failures_required</span></a> 决定 BTParallel 何时失败,<a class="reference internal" href="#class-btparallel-property-num-successes-required"><span class="std std-ref">num_successes_required</span></a> 决定它何时成功。当两者都满足时,它优先考虑 <a class="reference internal" href="#class-btparallel-property-num-failures-required"><span class="std std-ref">num_failures_required</span></a>。</p>
<p>如果设为 <a class="reference internal" href="#class-btparallel-property-repeat"><span class="std std-ref">repeat</span></a>,每个 tick 都会重新执行所有子任务,无论它们之前的结果是 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 还是 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>当所需数量的子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。当 <a class="reference internal" href="#class-btparallel-property-repeat"><span class="std std-ref">repeat</span></a> 设为 <code class="docutils literal notranslate"><span class="pre">false</span></code> 时,如果没有满足任何条件,且所有子任务的结果都是 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,BTParallel 将返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>当所需数量的子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 时返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果没有任何条件被满足,并且 <a class="reference internal" href="#class-btparallel-property-repeat"><span class="std std-ref">repeat</span></a> 设为 <code class="docutils literal notranslate"><span class="pre">true</span></code> 或某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,则返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-btparallel-property-num-failures-required"><span class="std std-ref">num_failures_required</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-btparallel-property-num-successes-required"><span class="std std-ref">num_successes_required</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btparallel-property-repeat"><span class="std std-ref">repeat</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btparallel-property-num-failures-required"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>num_failures_required</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-btparallel-property-num-failures-required"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_num_failures_required</strong>(value: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_num_failures_required</strong>()</p></li>
</ul>
<p>如果有指定数量的子任务返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,BTParallel 也会返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btparallel-property-num-successes-required"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>num_successes_required</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-btparallel-property-num-successes-required"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_num_successes_required</strong>(value: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_num_successes_required</strong>()</p></li>
</ul>
<p>如果有指定数量的子任务返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,BTParallel 也会返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btparallel-property-repeat"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>repeat</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btparallel-property-repeat"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_repeat</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_repeat</strong>()</p></li>
</ul>
<p>为 <code class="docutils literal notranslate"><span class="pre">true</span></code> 时,子任务会被再次执行,无论它们之前的结果是 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 还是 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>为 <code class="docutils literal notranslate"><span class="pre">false</span></code> 时,如果没有满足任何条件,且所有子任务的结果都是 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,BTParallel 将返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btpauseanimation"></span><section id="btpauseanimation">
<span id="class-btpauseanimation"></span><h2>BTPauseAnimation<a class="headerlink" href="#btpauseanimation" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>暂停指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上动画播放的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTPauseAnimation 动作会暂停指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上的动画播放并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果该动作获取 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点失败,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btpauseanimation-property-animation-player"><span class="std std-ref">animation_player</span></a></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btpauseanimation-property-animation-player"><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>animation_player</strong> <a class="reference internal" href="#class-btpauseanimation-property-animation-player"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_player</strong>(value: <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>get_animation_player</strong>()</p></li>
</ul>
<p>指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点的参数。</p>
</section>
</section>
<span id="document-classes/class_btplayanimation"></span><section id="btplayanimation">
<span id="class-btplayanimation"></span><h2>BTPlayAnimation<a class="headerlink" href="#btplayanimation" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>在指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上播放动画的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTPlayAnimation 动作会在指定的 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上播放动画。如果 <a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">await_completion</span></a> 大于 <code class="docutils literal notranslate"><span class="pre">0</span></code>,该动作会等待动画完成,最长等待时间等于 <a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">await_completion</span></a>。</p>
<p>如果动画播放完毕,或者经过的时间超过 <a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">await_completion</span></a>,则返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。当 <a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">await_completion</span></a> 设为 <code class="docutils literal notranslate"><span class="pre">0</span></code> 时,BTPlayAnimation 不会等待动画结束,而是立即返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果动画仍在播放且经过的时间小于 <a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">await_completion</span></a>,则返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>如果该动作播放所请求的动画失败,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayanimation-property-animation-name"><span class="std std-ref">animation_name</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btplayanimation-property-animation-player"><span class="std std-ref">animation_player</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">await_completion</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0.0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayanimation-property-blend"><span class="std std-ref">blend</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">-1.0</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayanimation-property-from-end"><span class="std std-ref">from_end</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btplayanimation-property-speed"><span class="std std-ref">speed</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1.0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btplayanimation-property-animation-name"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>animation_name</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btplayanimation-property-animation-name"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_name</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_animation_name</strong>()</p></li>
</ul>
<p>动画在 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点中的键名。如果为空,并且 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 之前被暂停过,BTPlayAnimation 会继续播放上一次播放的动画。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayanimation-property-animation-player"><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>animation_player</strong> <a class="reference internal" href="#class-btplayanimation-property-animation-player"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_player</strong>(value: <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>get_animation_player</strong>()</p></li>
</ul>
<p>指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayanimation-property-await-completion"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>await_completion</strong> = <code class="docutils literal notranslate"><span class="pre">0.0</span></code> <a class="reference internal" href="#class-btplayanimation-property-await-completion"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_await_completion</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_await_completion</strong>()</p></li>
</ul>
<p>等待动画完成的最长时长(秒)。如果动画在此时间内没有播放完毕,BTPlayAnimation 会停止等待并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayanimation-property-blend"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>blend</strong> = <code class="docutils literal notranslate"><span class="pre">-1.0</span></code> <a class="reference internal" href="#class-btplayanimation-property-blend"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_blend</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_blend</strong>()</p></li>
</ul>
<p>自定义混合时间(秒)。见 AnimationPlayer.play。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayanimation-property-from-end"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>from_end</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btplayanimation-property-from-end"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_from_end</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_from_end</strong>()</p></li>
</ul>
<p>从末尾开始播放动画。配合负的 <a class="reference internal" href="#class-btplayanimation-property-speed"><span class="std std-ref">speed</span></a> 可反向播放动画。见 AnimationPlayer.play。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btplayanimation-property-speed"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>speed</strong> = <code class="docutils literal notranslate"><span class="pre">1.0</span></code> <a class="reference internal" href="#class-btplayanimation-property-speed"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_speed</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_speed</strong>()</p></li>
</ul>
<p>自定义播放速度缩放比例。见 AnimationPlayer.play。</p>
</section>
</section>
<span id="document-classes/class_btprobability"></span><section id="btprobability">
<span id="class-btprobability"></span><h2>BTProbability<a class="headerlink" href="#btprobability" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>以给定概率执行其子任务的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTProbability 以 <a class="reference internal" href="#class-btprobability-property-run-chance"><span class="std std-ref">run_chance</span></a> 定义的给定概率执行其子任务。</p>
<p>如果子任务被执行,返回其结果;否则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btprobability-property-run-chance"><span class="std std-ref">run_chance</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0.5</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btprobability-property-run-chance"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>run_chance</strong> = <code class="docutils literal notranslate"><span class="pre">0.5</span></code> <a class="reference internal" href="#class-btprobability-property-run-chance"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_run_chance</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_run_chance</strong>()</p></li>
</ul>
<p>定义子任务被执行的可能性的概率。</p>
</section>
</section>
<span id="document-classes/class_btprobabilityselector"></span><section id="btprobabilityselector">
<span id="class-btprobabilityselector"></span><h2>BTProbabilitySelector<a class="headerlink" href="#btprobabilityselector" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>根据所附加的概率选择要执行的子任务的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTProbabilitySelector 根据所附加的概率选择要执行的子任务,通常用于决策。概率分布根据分配给每个子任务的权重计算得出。</p>
<p>当某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 时返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>当某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 时返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>当某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时,BTProbabilitySelector 的行为取决于 <a class="reference internal" href="#class-btprobabilityselector-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a> 的值:</p>
<ul class="simple">
<li><p>如果 <a class="reference internal" href="#class-btprobabilityselector-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a> 为 <code class="docutils literal notranslate"><span class="pre">false</span></code>,当某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时,BTProbabilitySelector 会在剩余子任务上重新归一化概率分布,并选择一个新的子任务来执行。如果所有子任务都失败,该组合任务将返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p></li>
<li><p>如果 <a class="reference internal" href="#class-btprobabilityselector-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,当某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时,BTProbabilitySelector 不会再选择其他子任务执行,而是立即返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p></li>
</ul>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-method-get-probability"><span class="std std-ref">get_probability</span></a>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-method-get-total-weight"><span class="std std-ref">get_total_weight</span></a>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-method-get-weight"><span class="std std-ref">get_weight</span></a>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-method-has-probability"><span class="std std-ref">has_probability</span></a>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-method-set-probability"><span class="std std-ref">set_probability</span></a>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>, probability: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><abbr title="无返回值。">void</abbr></p></td>
<td><p><a class="reference internal" href="#class-btprobabilityselector-method-set-weight"><span class="std std-ref">set_weight</span></a>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>, weight: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btprobabilityselector-property-abort-on-failure"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>abort_on_failure</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btprobabilityselector-property-abort-on-failure"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_abort_on_failure</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_abort_on_failure</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,当某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 时,BTProbabilitySelector 不会再选择其他子任务执行,而是返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-btprobabilityselector-method-get-probability"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_probability</strong>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btprobabilityselector-method-get-probability"><span class="std std-ref">🔗</span></a></p>
<p>返回该子任务被选中的概率。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btprobabilityselector-method-get-total-weight"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_total_weight</strong>() <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btprobabilityselector-method-get-total-weight"><span class="std std-ref">🔗</span></a></p>
<p>返回所有子任务的权重总和。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btprobabilityselector-method-get-weight"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_weight</strong>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btprobabilityselector-method-get-weight"><span class="std std-ref">🔗</span></a></p>
<p>返回该子任务在加权概率选择算法中的权重。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btprobabilityselector-method-has-probability"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>has_probability</strong>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-btprobabilityselector-method-has-probability"><span class="std std-ref">🔗</span></a></p>
<p>返回索引为 <code class="docutils literal notranslate"><span class="pre">child_idx</span></code> 的子任务是否参与加权概率选择算法并分配了概率。对于 <a class="reference internal" href="#document-classes/class_btcomment#class-btcomment"><span class="std std-ref">BTComment</span></a> 任务返回 <code class="docutils literal notranslate"><span class="pre">false</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btprobabilityselector-method-set-probability"><abbr title="无返回值。">void</abbr> <strong>set_probability</strong>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>, probability: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-btprobabilityselector-method-set-probability"><span class="std std-ref">🔗</span></a></p>
<p>根据期望的概率来设置该子任务的权重。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-btprobabilityselector-method-set-weight"><abbr title="无返回值。">void</abbr> <strong>set_weight</strong>(child_idx: <code class="docutils literal notranslate"><span class="pre">int</span></code>, weight: <code class="docutils literal notranslate"><span class="pre">float</span></code>) <a class="reference internal" href="#class-btprobabilityselector-method-set-weight"><span class="std std-ref">🔗</span></a></p>
<p>为加权概率选择算法设置该子任务的权重。</p>
</section>
</section>
<span id="document-classes/class_btrandomselector"></span><section id="btrandomselector">
<span id="class-btrandomselector"></span><h2>BTRandomSelector<a class="headerlink" href="#btrandomselector" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>以随机顺序执行任务、直到出现第一个 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRandomSelector 以随机顺序执行其子任务,直到任一子任务返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,BTRandomSelector 会立即执行另一个子任务,直到其中一个返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,或者全部结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。BTRandomSelector 会记住执行顺序以及最后一个返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的子任务,确保在下一个 tick 从该位置继续。</p>
<p>如果所有子任务结果都为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btrandomsequence"></span><section id="btrandomsequence">
<span id="class-btrandomsequence"></span><h2>BTRandomSequence<a class="headerlink" href="#btrandomsequence" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>以随机顺序执行任务、只要它们返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 就继续的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRandomSequence 以随机顺序执行其子任务,只要它们返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 就继续。如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,BTRandomSequence 会立即执行下一个子任务,直到其中一个返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,或者全部结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。BTRandomSequence 会记住执行顺序以及最后一个返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的子任务,确保在下一个 tick 从该位置继续。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果所有子任务结果都为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btrandomwait"></span><section id="btrandomwait">
<span id="class-btrandomwait"></span><h2>BTRandomWait<a class="headerlink" href="#btrandomwait" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>等待一段随机时长后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRandomWait 动作会等待一段随机时长,然后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。该时长在指定的范围内随机取值,范围由 <a class="reference internal" href="#class-btrandomwait-property-min-duration"><span class="std std-ref">min_duration</span></a> 和 <a class="reference internal" href="#class-btrandomwait-property-max-duration"><span class="std std-ref">max_duration</span></a> 定义。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btrandomwait-property-max-duration"><span class="std std-ref">max_duration</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">2.0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btrandomwait-property-min-duration"><span class="std std-ref">min_duration</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1.0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btrandomwait-property-max-duration"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>max_duration</strong> = <code class="docutils literal notranslate"><span class="pre">2.0</span></code> <a class="reference internal" href="#class-btrandomwait-property-max-duration"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_max_duration</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_max_duration</strong>()</p></li>
</ul>
<p>等待的最长时长。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btrandomwait-property-min-duration"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>min_duration</strong> = <code class="docutils literal notranslate"><span class="pre">1.0</span></code> <a class="reference internal" href="#class-btrandomwait-property-min-duration"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_min_duration</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_min_duration</strong>()</p></li>
</ul>
<p>等待的最短时长。</p>
</section>
</section>
<span id="document-classes/class_btrepeat"></span><section id="btrepeat">
<span id="class-btrepeat"></span><h2>BTRepeat<a class="headerlink" href="#btrepeat" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>把其子任务重复指定 <a class="reference internal" href="#class-btrepeat-property-times"><span class="std std-ref">times</span></a> 次的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRepeat 会按 <a class="reference internal" href="#class-btrepeat-property-times"><span class="std std-ref">times</span></a> 定义的次数迭代其子任务。如果 <a class="reference internal" href="#class-btrepeat-property-forever"><span class="std std-ref">forever</span></a> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,子任务的执行会无限重复。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。如果 <a class="reference internal" href="#class-btrepeat-property-forever"><span class="std std-ref">forever</span></a> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,BTRepeat 总是返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>如果达到指定的成功执行次数,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。如果 <a class="reference internal" href="#class-btrepeat-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a> 为 <code class="docutils literal notranslate"><span class="pre">false</span></code>,子任务返回的 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 状态也被视为一次成功执行。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 且 <a class="reference internal" href="#class-btrepeat-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a> 为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btrepeat-property-abort-on-failure"><span class="std std-ref">abort_on_failure</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btrepeat-property-forever"><span class="std std-ref">forever</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-btrepeat-property-times"><span class="std std-ref">times</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btrepeat-property-abort-on-failure"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>abort_on_failure</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btrepeat-property-abort-on-failure"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_abort_on_failure</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_abort_on_failure</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">false</span></code>,子任务返回的 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 状态也被视为一次成功执行。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btrepeat-property-forever"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>forever</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btrepeat-property-forever"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_forever</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_forever</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,子任务的执行会无限重复,并总是返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btrepeat-property-times"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>times</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-btrepeat-property-times"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_times</strong>(value: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_times</strong>()</p></li>
</ul>
<p>重复执行子任务的次数。</p>
</section>
</section>
<span id="document-classes/class_btrepeatuntilfailure"></span><section id="btrepeatuntilfailure">
<span id="class-btrepeatuntilfailure"></span><h2>BTRepeatUntilFailure<a class="headerlink" href="#btrepeatuntilfailure" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>重复其子任务直到 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code> 的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRepeatUntilFailure 重复其子任务,直到结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 或 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btrepeatuntilsuccess"></span><section id="btrepeatuntilsuccess">
<span id="class-btrepeatuntilsuccess"></span><h2>BTRepeatUntilSuccess<a class="headerlink" href="#btrepeatuntilsuccess" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>重复其子任务直到 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRepeatUntilSuccess 重复其子任务,直到结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 或 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。</p>
<p>如果子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btrunlimit"></span><section id="btrunlimit">
<span id="class-btrunlimit"></span><h2>BTRunLimit<a class="headerlink" href="#btrunlimit" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>限制其子任务执行次数的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTRunLimit 把子任务的执行次数限制在 <a class="reference internal" href="#class-btrunlimit-property-run-limit"><span class="std std-ref">run_limit</span></a> 定义的最大次数以内。</p>
<p>如果执行次数超出限制,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>;否则返回子任务的状态。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a></p></td>
<td><p><a class="reference internal" href="#class-btrunlimit-property-count-policy"><span class="std std-ref">count_policy</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-btrunlimit-property-run-limit"><span class="std std-ref">run_limit</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="enumerations">
<h3>枚举<a class="headerlink" href="#enumerations" title="Link to this heading"></a></h3>
<p class="classref-enumeration" id="enum-btrunlimit-countpolicy">enum <strong>CountPolicy</strong>: <a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-btrunlimit-constant-count-successful"><a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a> <strong>COUNT_SUCCESSFUL</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>只把成功的运行计入限制。</p>
<p class="classref-enumeration-constant" id="class-btrunlimit-constant-count-failed"><a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a> <strong>COUNT_FAILED</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>只把失败的运行计入限制。</p>
<p class="classref-enumeration-constant" id="class-btrunlimit-constant-count-all"><a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a> <strong>COUNT_ALL</strong> = <code class="docutils literal notranslate"><span class="pre">2</span></code></p>
<p>把成功和失败的运行都计入限制。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btrunlimit-property-count-policy"><a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a> <strong>count_policy</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-btrunlimit-property-count-policy"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_count_policy</strong>(value: <a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a>)</p></li>
<li><p><a class="reference internal" href="#enum-btrunlimit-countpolicy"><span class="std std-ref">CountPolicy</span></a> <strong>get_count_policy</strong>()</p></li>
</ul>
<p>哪些运行应计入限制:成功的、失败的,还是全部?</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btrunlimit-property-run-limit"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>run_limit</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-btrunlimit-property-run-limit"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_run_limit</strong>(value: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_run_limit</strong>()</p></li>
</ul>
<p>允许子任务执行的最大次数。</p>
</section>
</section>
<span id="document-classes/class_btselector"></span><section id="btselector">
<span id="class-btselector"></span><h2>BTSelector<a class="headerlink" href="#btselector" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>顺序执行任务、直到出现第一个 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTSelector 按顺序从第一个到最后一个执行子任务,直到任一子任务返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,BTSelector 会立即执行下一个子任务,直到其中一个返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,或者全部返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。BTSelector 与 <a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 是行为树中最常见的两种积木块。本质上,<a class="reference internal" href="#document-classes/class_btsequence#class-btsequence"><span class="std std-ref">BTSequence</span></a> 类似布尔 AND 运算,而 BTSelector 类似布尔 OR 运算。选择器让行为树能够响应环境变化,并在各种后备行为之间触发转换。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。BTSelector 会记住最后一个返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的子任务,确保在下一个执行 tick 从该位置继续。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果所有子任务结果都为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btsequence"></span><section id="btsequence">
<span id="class-btsequence"></span><h2>BTSequence<a class="headerlink" href="#btsequence" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btcomposite#class-btcomposite"><span class="std std-ref">BTComposite</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>顺序执行任务、只要它们返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 就继续的 BT 组合任务。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTSequence 按顺序从第一个到最后一个执行子任务,只要它们返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 就继续。如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,BTSequence 会立即执行下一个子任务,直到其中一个返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,或者全部返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。BTSequence 与 <a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a> 是行为树中最常见的两种积木块。本质上,<a class="reference internal" href="#document-classes/class_btselector#class-btselector"><span class="std std-ref">BTSelector</span></a> 类似布尔 OR 运算,而 BTSequence 类似布尔 AND 运算。序列让行为树能够把一串更简单的任务组合成复杂行为。</p>
<p>如果任一子任务结果为 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code>。BTSequence 会记住最后一个返回 <code class="docutils literal notranslate"><span class="pre">RUNNING</span></code> 的子任务,确保在下一个执行 tick 从该位置继续。</p>
<p>如果所有子任务结果都为 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。</p>
<p>如果某个子任务结果为 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
</section>
<span id="document-classes/class_btsetagentproperty"></span><section id="btsetagentproperty">
<span id="class-btsetagentproperty"></span><h2>BTSetAgentProperty<a class="headerlink" href="#btsetagentproperty" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>为指定的智能体属性赋值的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTSetAgentProperty 把指定的 <a class="reference internal" href="#class-btsetagentproperty-property-value"><span class="std std-ref">value</span></a> 赋给由 <a class="reference internal" href="#class-btsetagentproperty-property-property"><span class="std std-ref">property</span></a> 标识的智能体属性并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。可选地,它可以在赋值之前执行特定的 <a class="reference internal" href="#class-btsetagentproperty-property-operation"><span class="std std-ref">operation</span></a>。</p>
<p>如果设置该属性失败,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a></p></td>
<td><p><a class="reference internal" href="#class-btsetagentproperty-property-operation"><span class="std std-ref">operation</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btsetagentproperty-property-property"><span class="std std-ref">property</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a></p></td>
<td><p><a class="reference internal" href="#class-btsetagentproperty-property-value"><span class="std std-ref">value</span></a></p></td>
<td></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btsetagentproperty-property-operation"><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>operation</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-btsetagentproperty-property-operation"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_operation</strong>(value: <a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>get_operation</strong>()</p></li>
</ul>
<p>指定赋值之前要执行的操作。操作的执行方式如下:</p>
<p><code class="docutils literal notranslate"><span class="pre">property</span> <span class="pre">=</span> <span class="pre">property</span> <span class="pre">OPERATION</span> <span class="pre">value</span></code></p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btsetagentproperty-property-property"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>property</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btsetagentproperty-property-property"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_property</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_property</strong>()</p></li>
</ul>
<p>指定智能体属性名的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btsetagentproperty-property-value"><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>value</strong> <a class="reference internal" href="#class-btsetagentproperty-property-value"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_value</strong>(value: <a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>get_value</strong>()</p></li>
</ul>
<p>指定将要赋给智能体属性的值的参数。</p>
</section>
</section>
<span id="document-classes/class_btsetvar"></span><section id="btsetvar">
<span id="class-btsetvar"></span><h2>BTSetVar<a class="headerlink" href="#btsetvar" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>把 <a class="reference internal" href="#class-btsetvar-property-value"><span class="std std-ref">value</span></a> 赋给 <a class="reference internal" href="#class-btsetvar-property-variable"><span class="std std-ref">variable</span></a>,然后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTSetVar 把 <a class="reference internal" href="#class-btsetvar-property-value"><span class="std std-ref">value</span></a> 赋给 <a class="reference internal" href="#class-btsetvar-property-variable"><span class="std std-ref">variable</span></a>,然后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。可选地,它可以在赋值之前执行特定的 <a class="reference internal" href="#class-btsetvar-property-operation"><span class="std std-ref">operation</span></a>。</p>
<p>如果设置 <a class="reference internal" href="#class-btsetvar-property-variable"><span class="std std-ref">variable</span></a> 失败,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a></p></td>
<td><p><a class="reference internal" href="#class-btsetvar-property-operation"><span class="std std-ref">operation</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">0</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a></p></td>
<td><p><a class="reference internal" href="#class-btsetvar-property-value"><span class="std std-ref">value</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btsetvar-property-variable"><span class="std std-ref">variable</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btsetvar-property-operation"><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>operation</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code> <a class="reference internal" href="#class-btsetvar-property-operation"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_operation</strong>(value: <a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_limboutility#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>get_operation</strong>()</p></li>
</ul>
<p>指定赋值之前要执行的操作。操作的执行方式如下:</p>
<p><code class="docutils literal notranslate"><span class="pre">variable</span> <span class="pre">=</span> <span class="pre">variable</span> <span class="pre">OPERATION</span> <span class="pre">value</span></code></p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btsetvar-property-value"><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>value</strong> <a class="reference internal" href="#class-btsetvar-property-value"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_value</strong>(value: <a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbvariant#class-bbvariant"><span class="std std-ref">BBVariant</span></a> <strong>get_value</strong>()</p></li>
</ul>
<p>指定将要赋给该变量的值的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btsetvar-property-variable"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>variable</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btsetvar-property-variable"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_variable</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_variable</strong>()</p></li>
</ul>
<p>将要被赋值的变量名。</p>
</section>
</section>
<span id="document-classes/class_btstopanimation"></span><section id="btstopanimation">
<span id="class-btstopanimation"></span><h2>BTStopAnimation<a class="headerlink" href="#btstopanimation" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>停止指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上动画播放的 BT 动作。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTStopAnimation 动作会停止指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点上的动画播放并返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code>。如果设置了 <a class="reference internal" href="#class-btstopanimation-property-animation-name"><span class="std std-ref">animation_name</span></a>,则只有当指定动画正在播放时才会停止播放。</p>
<p>如果该动作获取 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点失败,则返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code></p></td>
<td><p><a class="reference internal" href="#class-btstopanimation-property-animation-name"><span class="std std-ref">animation_name</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&amp;""</span></code></p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a></p></td>
<td><p><a class="reference internal" href="#class-btstopanimation-property-animation-player"><span class="std std-ref">animation_player</span></a></p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-btstopanimation-property-keep-state"><span class="std std-ref">keep_state</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">false</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btstopanimation-property-animation-name"><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>animation_name</strong> = <code class="docutils literal notranslate"><span class="pre">&amp;""</span></code> <a class="reference internal" href="#class-btstopanimation-property-animation-name"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_name</strong>(value: <code class="docutils literal notranslate"><span class="pre">StringName</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">StringName</span></code> <strong>get_animation_name</strong>()</p></li>
</ul>
<p>动画在 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点中的键名。如果不为空,则只有当指定动画正在播放时 BTStopAnimation 才会停止播放。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btstopanimation-property-animation-player"><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>animation_player</strong> <a class="reference internal" href="#class-btstopanimation-property-animation-player"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_animation_player</strong>(value: <a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_bbnode#class-bbnode"><span class="std std-ref">BBNode</span></a> <strong>get_animation_player</strong>()</p></li>
</ul>
<p>指定 <code class="docutils literal notranslate"><span class="pre">AnimationPlayer</span></code> 节点的参数。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-property" id="class-btstopanimation-property-keep-state"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>keep_state</strong> = <code class="docutils literal notranslate"><span class="pre">false</span></code> <a class="reference internal" href="#class-btstopanimation-property-keep-state"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_keep_state</strong>(value: <code class="docutils literal notranslate"><span class="pre">bool</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>get_keep_state</strong>()</p></li>
</ul>
<p>如果为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,动画状态不会在视觉上被更新。</p>
</section>
</section>
<span id="document-classes/class_btsubtree"></span><section id="btsubtree">
<span id="class-btsubtree"></span><h2>BTSubtree<a class="headerlink" href="#btsubtree" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btnewscope#class-btnewscope"><span class="std std-ref">BTNewScope</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>在更大的树中实例化并运行子树的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTSubtree 会实例化一个 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>,在初始化期间把它的根任务作为子任务加入,同时创建一个新的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 作用域。</p>
<p>返回子树执行的状态。</p>
<p>子树的黑板变量可以映射到主树黑板计划的变量。请查看检视面板中的映射(mapping)部分。</p>
<p>注意:BTSubTree 被设计为一个更简单的加载器,不支持在运行时更新 <a class="reference internal" href="#class-btsubtree-property-subtree"><span class="std std-ref">subtree</span></a>。自定义的子树装饰器更适合这种需求:</p>
<div class="highlight-gdscript notranslate"><div class="highlight"><pre><span></span><span class="k">extends</span><span class="w"> </span><span class="n">BTDecorator</span>
<span class="c1">## MyCustomBranch</span>
<span class="k">func</span><span class="w"> </span><span class="n">_setup</span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="nb nb-Type">void</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">bt</span><span class="p">:</span><span class="w"> </span><span class="n">BehaviorTree</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">load</span><span class="p">(</span><span class="s2">"res://..."</span><span class="p">)</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">my_branch</span><span class="p">:</span><span class="w"> </span><span class="n">BTTask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bt</span><span class="o">.</span><span class="n">get_root_task</span><span class="p">()</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span>
<span class="w"> </span><span class="n">my_branch</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span><span class="w"> </span><span class="n">blackboard</span><span class="p">)</span>
<span class="w"> </span><span class="n">add_child</span><span class="p">(</span><span class="n">my_branch</span><span class="p">)</span>
<span class="k">func</span><span class="w"> </span><span class="n">_tick</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">Status</span><span class="p">:</span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">child</span><span class="p">:</span><span class="w"> </span><span class="n">BTTask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">get_child</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">child</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span>
</pre></div>
</div>
<p>这样 <a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BehaviorTree</span></a> 就能从黑板中的某个变量或其他位置加载指定的行为树,并在运行时使用那棵新的行为树。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a></p></td>
<td><p><a class="reference internal" href="#class-btsubtree-property-subtree"><span class="std std-ref">subtree</span></a></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btsubtree-property-subtree"><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>subtree</strong> <a class="reference internal" href="#class-btsubtree-property-subtree"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_subtree</strong>(value: <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a>)</p></li>
<li><p><a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> <strong>get_subtree</strong>()</p></li>
</ul>
<p>将被实例化为子树的 <a class="reference internal" href="#document-classes/class_behaviortree#class-behaviortree"><span class="std std-ref">BehaviorTree</span></a> 资源。</p>
</section>
</section>
<span id="document-classes/class_bttimelimit"></span><section id="bttimelimit">
<span id="class-bttimelimit"></span><h2>BTTimeLimit<a class="headerlink" href="#bttimelimit" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btdecorator#class-btdecorator"><span class="std std-ref">BTDecorator</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>为其子任务执行设置时间限制的 BT 装饰器。</p>
<section class="classref-introduction-group" id="description">
<h3>说明<a class="headerlink" href="#description" title="Link to this heading"></a></h3>
<p>BTTimeLimit 为子任务的执行分配有限的时间;如果超过 <a class="reference internal" href="#class-bttimelimit-property-time-limit"><span class="std std-ref">time_limit</span></a>,它会中止子任务并返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>。</p>
<p>如果超过 <a class="reference internal" href="#class-bttimelimit-property-time-limit"><span class="std std-ref">time_limit</span></a>,返回 <code class="docutils literal notranslate"><span class="pre">FAILURE</span></code>;否则返回子任务的状态。</p>
</section>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-bttimelimit-property-time-limit"><span class="std std-ref">time_limit</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">5.0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-bttimelimit-property-time-limit"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>time_limit</strong> = <code class="docutils literal notranslate"><span class="pre">5.0</span></code> <a class="reference internal" href="#class-bttimelimit-property-time-limit"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_time_limit</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_time_limit</strong>()</p></li>
</ul>
<p>分配给子任务执行的时间。</p>
</section>
</section>
<span id="document-classes/class_btwait"></span><section id="btwait">
<span id="class-btwait"></span><h2>BTWait<a class="headerlink" href="#btwait" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>等待指定 <a class="reference internal" href="#class-btwait-property-duration"><span class="std std-ref">duration</span></a> 时间后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 动作。</p>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="#class-btwait-property-duration"><span class="std std-ref">duration</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1.0</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btwait-property-duration"><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>duration</strong> = <code class="docutils literal notranslate"><span class="pre">1.0</span></code> <a class="reference internal" href="#class-btwait-property-duration"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_duration</strong>(value: <code class="docutils literal notranslate"><span class="pre">float</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">float</span></code> <strong>get_duration</strong>()</p></li>
</ul>
<div class="contribute docutils container">
<p>该属性目前还没有描述。欢迎贡献一份描述!</p>
</div>
</section>
</section>
<span id="document-classes/class_btwaitticks"></span><section id="btwaitticks">
<span id="class-btwaitticks"></span><h2>BTWaitTicks<a class="headerlink" href="#btwaitticks" title="Link to this heading"></a></h2>
<p><strong>继承:</strong><a class="reference internal" href="#document-classes/class_btaction#class-btaction"><span class="std std-ref">BTAction</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> <strong>&lt;</strong> <a class="reference internal" href="#document-classes/class_bt#class-bt"><span class="std std-ref">BT</span></a></p>
<p>等待指定数量的 tick 后返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 的 BT 动作。</p>
<section class="classref-reftable-group" id="properties">
<h3>属性<a class="headerlink" href="#properties" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code></p></td>
<td><p><a class="reference internal" href="#class-btwaitticks-property-num-ticks"><span class="std std-ref">num_ticks</span></a></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">1</span></code></p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="property-descriptions">
<h3>属性说明<a class="headerlink" href="#property-descriptions" title="Link to this heading"></a></h3>
<p class="classref-property" id="class-btwaitticks-property-num-ticks"><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>num_ticks</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code> <a class="reference internal" href="#class-btwaitticks-property-num-ticks"><span class="std std-ref">🔗</span></a></p>
<ul class="classref-property-setget simple">
<li><p><abbr title="无返回值。">void</abbr> <strong>set_num_ticks</strong>(value: <code class="docutils literal notranslate"><span class="pre">int</span></code>)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span></code> <strong>get_num_ticks</strong>()</p></li>
</ul>
<p>返回 <code class="docutils literal notranslate"><span class="pre">SUCCESS</span></code> 之前需要等待的 tick 数。</p>
</section>
</section>
<span id="document-classes/class_limboutility"></span><section id="limboutility">
<span id="class-limboutility"></span><h2>LimboUtility<a class="headerlink" href="#limboutility" title="Link to this heading"></a></h2>
<p><strong>继承:</strong></p>
<p>LimboAI 的辅助函数。</p>
<section class="classref-reftable-group" id="methods">
<h3>方法<a class="headerlink" href="#methods" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<tbody>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-decorate-output-var"><span class="std std-ref">decorate_output_var</span></a>(variable: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-decorate-var"><span class="std std-ref">decorate_var</span></a>(variable: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-get-check-operator-string"><span class="std std-ref">get_check_operator_string</span></a>(check: <a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-get-operation-string"><span class="std std-ref">get_operation_string</span></a>(operation: <a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">String</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-get-status-name"><span class="std std-ref">get_status_name</span></a>(status: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">Texture2D</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-get-task-icon"><span class="std std-ref">get_task_icon</span></a>(class_or_script_path: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bool</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-perform-check"><span class="std std-ref">perform_check</span></a>(check: <a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a>, a: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>, b: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>)</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">Variant</span></code></p></td>
<td><p><a class="reference internal" href="#class-limboutility-method-perform-operation"><span class="std std-ref">perform_operation</span></a>(operation: <a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a>, a: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>, b: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>)</p></td>
</tr>
</tbody>
</table>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="enumerations">
<h3>枚举<a class="headerlink" href="#enumerations" title="Link to this heading"></a></h3>
<p class="classref-enumeration" id="enum-limboutility-checktype">enum <strong>CheckType</strong>: <a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-check-equal"><a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>CHECK_EQUAL</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>相等性检查。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-check-less-than"><a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>CHECK_LESS_THAN</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>小于检查。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-check-less-than-or-equal"><a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>CHECK_LESS_THAN_OR_EQUAL</strong> = <code class="docutils literal notranslate"><span class="pre">2</span></code></p>
<p>小于或等于检查。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-check-greater-than"><a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>CHECK_GREATER_THAN</strong> = <code class="docutils literal notranslate"><span class="pre">3</span></code></p>
<p>大于检查。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-check-greater-than-or-equal"><a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>CHECK_GREATER_THAN_OR_EQUAL</strong> = <code class="docutils literal notranslate"><span class="pre">4</span></code></p>
<p>大于或等于检查。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-check-not-equal"><a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> <strong>CHECK_NOT_EQUAL</strong> = <code class="docutils literal notranslate"><span class="pre">5</span></code></p>
<p>不等性检查。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-enumeration" id="enum-limboutility-operation">enum <strong>Operation</strong>: <a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">🔗</span></a></p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-none"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_NONE</strong> = <code class="docutils literal notranslate"><span class="pre">0</span></code></p>
<p>无操作。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-addition"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_ADDITION</strong> = <code class="docutils literal notranslate"><span class="pre">1</span></code></p>
<p>算术加法。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-subtraction"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_SUBTRACTION</strong> = <code class="docutils literal notranslate"><span class="pre">2</span></code></p>
<p>算术减法。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-multiplication"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_MULTIPLICATION</strong> = <code class="docutils literal notranslate"><span class="pre">3</span></code></p>
<p>算术乘法。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-division"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_DIVISION</strong> = <code class="docutils literal notranslate"><span class="pre">4</span></code></p>
<p>算术除法。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-modulo"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_MODULO</strong> = <code class="docutils literal notranslate"><span class="pre">5</span></code></p>
<p>取整数除法的余数。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-power"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_POWER</strong> = <code class="docutils literal notranslate"><span class="pre">6</span></code></p>
<p>把 <code class="docutils literal notranslate"><span class="pre">a</span></code> 自乘 <code class="docutils literal notranslate"><span class="pre">b</span></code> 次。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-bit-shift-left"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_BIT_SHIFT_LEFT</strong> = <code class="docutils literal notranslate"><span class="pre">7</span></code></p>
<p>按位左移。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-bit-shift-right"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_BIT_SHIFT_RIGHT</strong> = <code class="docutils literal notranslate"><span class="pre">8</span></code></p>
<p>按位右移。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-bit-and"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_BIT_AND</strong> = <code class="docutils literal notranslate"><span class="pre">9</span></code></p>
<p>按位与。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-bit-or"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_BIT_OR</strong> = <code class="docutils literal notranslate"><span class="pre">10</span></code></p>
<p>按位或。</p>
<p class="classref-enumeration-constant" id="class-limboutility-constant-operation-bit-xor"><a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> <strong>OPERATION_BIT_XOR</strong> = <code class="docutils literal notranslate"><span class="pre">11</span></code></p>
<p>按位异或。</p>
</section>
<hr class="classref-section-separator docutils"/>
<section class="classref-descriptions-group" id="method-descriptions">
<h3>方法说明<a class="headerlink" href="#method-descriptions" title="Link to this heading"></a></h3>
<p class="classref-method" id="class-limboutility-method-decorate-output-var"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>decorate_output_var</strong>(variable: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limboutility-method-decorate-output-var"><span class="std std-ref">🔗</span></a></p>
<p>与 <a class="reference internal" href="#class-limboutility-method-decorate-var"><span class="std std-ref">decorate_var</span></a> 类似,生成一个经格式化、用于显示的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量名字符串,并额外添加一个符号来表明该变量被用作输出。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-decorate-var"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>decorate_var</strong>(variable: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limboutility-method-decorate-var"><span class="std std-ref">🔗</span></a></p>
<p>生成一个经格式化、适合显示或控制台输出的 <a class="reference internal" href="#document-classes/class_blackboard#class-blackboard"><span class="std std-ref">Blackboard</span></a> 变量名字符串。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-get-check-operator-string"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_check_operator_string</strong>(check: <a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limboutility-method-get-check-operator-string"><span class="std std-ref">🔗</span></a></p>
<p>返回 <a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a> 枚举值对应的运算符字符串。例如,<a class="reference internal" href="#class-limboutility-constant-check-equal"><span class="std std-ref">CHECK_EQUAL</span></a> 返回 “==”。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-get-operation-string"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_operation_string</strong>(operation: <a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limboutility-method-get-operation-string"><span class="std std-ref">🔗</span></a></p>
<p>返回 <a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a> 枚举值的字符串表示。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-get-status-name"><code class="docutils literal notranslate"><span class="pre">String</span></code> <strong>get_status_name</strong>(status: <code class="docutils literal notranslate"><span class="pre">int</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limboutility-method-get-status-name"><span class="std std-ref">🔗</span></a></p>
<p>返回 <a class="reference internal" href="#document-classes/class_bttask#class-bttask"><span class="std std-ref">BTTask</span></a> 状态码的名称。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-get-task-icon"><code class="docutils literal notranslate"><span class="pre">Texture2D</span></code> <strong>get_task_icon</strong>(class_or_script_path: <code class="docutils literal notranslate"><span class="pre">String</span></code>) <abbr title="该方法没有副作用,不会修改实例的任何成员变量。">const</abbr> <a class="reference internal" href="#class-limboutility-method-get-task-icon"><span class="std std-ref">🔗</span></a></p>
<p>根据任务的类名或脚本资源路径,返回与之关联的图标纹理。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-perform-check"><code class="docutils literal notranslate"><span class="pre">bool</span></code> <strong>perform_check</strong>(check: <a class="reference internal" href="#enum-limboutility-checktype"><span class="std std-ref">CheckType</span></a>, a: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>, b: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>) <a class="reference internal" href="#class-limboutility-method-perform-check"><span class="std std-ref">🔗</span></a></p>
<p>对两个值 <code class="docutils literal notranslate"><span class="pre">a</span></code> 和 <code class="docutils literal notranslate"><span class="pre">b</span></code> 执行 <code class="docutils literal notranslate"><span class="pre">check</span></code>,如果检查通过则返回 <code class="docutils literal notranslate"><span class="pre">true</span></code>。</p>
<hr class="classref-item-separator docutils"/>
<p class="classref-method" id="class-limboutility-method-perform-operation"><code class="docutils literal notranslate"><span class="pre">Variant</span></code> <strong>perform_operation</strong>(operation: <a class="reference internal" href="#enum-limboutility-operation"><span class="std std-ref">Operation</span></a>, a: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>, b: <code class="docutils literal notranslate"><span class="pre">Variant</span></code>) <a class="reference internal" href="#class-limboutility-method-perform-operation"><span class="std std-ref">🔗</span></a></p>
<p>对两个值 <code class="docutils literal notranslate"><span class="pre">a</span></code> 和 <code class="docutils literal notranslate"><span class="pre">b</span></code> 执行 <code class="docutils literal notranslate"><span class="pre">operation</span></code>,并返回结果。</p>
</section>
</section>
</div>
</section>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>© 2023 年至今 Serhii Snitsaruk 及 LimboAI 贡献者。</p>
</div>
使用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题(theme)</a>
由 <a href="https://readthedocs.org">Read the Docs</a> 提供。
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>