运行时集成¶
本页介绍如何在自己的游戏代码中驱动行为树:配置 AI 组件、控制执行,以及向行为树传值。各运行时类型是什么,见核心概念。
配置 AI 组件¶
在要运行行为树的 GameObject 上添加 AI 组件,然后设置:
| 字段 | 作用 |
|---|---|
data |
要运行的 BehaviourTreeData 资产。没有设置时,组件会在 Awake 中禁用自己。 |
controlTarget |
组件调用类节点操作的脚本。在编辑器中,如果行为树资产设置了 targetScript,OnValidate() 会从同一个 GameObject 上自动填入。 |
awakeStart |
对象进入场景时自动启动行为树。 |
autoRestart |
本次运行结束后自动开始下一次运行。 |
在代码中可以通过 AI.Data、AI.ControlTarget 以及公开字段 awakeStart / autoRestart 访问这些值。
生命周期¶
- 组件在
Start()中根据资产创建运行时BehaviourTree。 - 行为树异步初始化。在 Unity 2023.1 及以上版本,大部分工作在后台线程完成,节点初始化前会切回主线程;WebGL 上同步执行。初始化完成前发出的启动请求会被保留,等行为树就绪后执行。
- 行为树运行中且组件未暂停时,
Update、LateUpdate、FixedUpdate会转发给行为树。 - 一次运行结束且自动重启生效时,下一次
FixedUpdate会开始新的运行。 - 组件被销毁时,会结束正在运行的行为树。
用 AI.IsRunning 判断是否正在运行,用 AI.BehaviourTree.IsInitialized 判断初始化是否完成。
在代码中控制执行¶
| 方法 | 效果 |
|---|---|
StartBehaviourTree() |
开始运行,之后是否自动重启取决于 autoRestart 字段。 |
Start(bool autoRestart) |
开始运行,并设置之后是否自动重启。 |
Reload() |
结束当前运行,并根据资产重建行为树。autoRestart 开启时会重新开始。 |
Reload(BehaviourTreeData data) / Reload(data, bool autoRestart) |
换成另一个行为树资产并重建。 |
Pause() / Resume() |
停止或恢复生命周期转发,执行状态会保留。 |
End() |
结束当前运行。如果自动重启生效,下一次 FixedUpdate 会开始新的运行。 |
End(bool autoRestart) |
结束当前运行并设置自动重启。要彻底停止请用 End(false),它还会取消尚未执行的自动启动。 |
Pause() 只是让组件不再把 Unity 回调转发给行为树,不会冻结物理、协程或动画。运行模式下,组件的右键菜单里也有 Start Behaviour Tree、Reload Behaviour Tree、Pause、Resume、End。
using Aethiumian.AI;
using UnityEngine;
public class EnemyAlert : MonoBehaviour
{
[SerializeField] private AI ai;
public void OnPlayerSpotted(Transform player)
{
ai.SetObject("target", player);
ai.SetBool("alerted", true);
}
public void OnCutsceneStarted() => ai.Pause();
public void OnCutsceneEnded() => ai.Resume();
}
向行为树传值¶
变量按名称查找。行为树初始化完成后变量才存在;在此之前查找不到。
SetVariable(name, value)和SetVariable<T>(name, value)设置行为树变量。名称不存在时,泛型版本会输出警告。SetBool、SetInt、SetFloat、SetVector2、SetVector3、SetVector4、SetColor、SetObject是按类型的快捷方法。SetGlobalVariable(name, value)和SetGlobal...系列方法设置所有行为树共享的全局变量。全局变量在Project Settings > Aethiumian AI > AI Settings中声明,保存在Assets/Resources/AI/AISettings.asset。
支持的类型见变量系统。
通过动画事件¶
添加一个调用 AI 组件上 AnimationEvent_SetVariable 的动画事件。事件的字符串参数填变量名;在变量名前加 # 表示全局变量。值取自与变量类型对应的事件参数:
| 变量类型 | 值的来源 |
|---|---|
Int |
int 参数 |
Float |
float 参数 |
Bool |
int 参数(非零为 true) |
UnityObject |
object 参数 |
Vector2 / Vector3 / Vector4 |
字符串参数中 = 后面的文本,例如 aim=(1, 0) |
错误¶
BehaviourTree.IsFaulted 表示初始化失败或运行时出错。原因保存在 InitializationException 或 RuntimeFault 中,原始异常可在 Console 中查看。出错的行为树在重新加载前不会再运行。见故障排查。