unity3d 行为树

2015年01月18日 10:35 0 点赞 0 评论 更新于 2025-11-21 14:41

在Unity3D开发中,我们公司内部比较推崇一款行为树插件,尽管市场上存在其他同类竞品。

说句题外话,优秀的插件大多由国外开发者开发,并且他们能够将插件开发作为小工作室或个人的主要收入来源,但目前尚未看到国内开发者有类似的优秀作品。

行为树的概念已经出现多年,其核心是通过各种经典的控制节点和行为节点的组合来实现复杂的AI。在游戏开发中,复杂的AI通常会运用行为树,而简单的AI则可以使用状态机实现。

Behavior Designer插件的节点类型

在Behavior Designer插件中,主要有四种类型的节点,它们都被称为Task:

  1. 组合节点(Composites):包含经典的Sequence、Selector、Parallel等节点。这些节点用于组织和管理子节点的执行逻辑。
  2. 装饰节点(Decorator):其作用是为唯一的子节点额外添加一些功能。例如,让子Task持续运行直到返回特定的运行状态值,或者将Task的返回值取反等。
  3. 行为节点(Actions):行为节点是真正执行具体操作的节点,属于叶节点。Behavior Designer插件自带了不少Action节点,但通常情况下,开发者需要编写自己的Action节点,除非是不懂脚本的美术人员或策划人员,仅希望简单地控制一些物件的属性。
  4. 条件节点(Conditinals):用于判断某个条件是否成立。Behavior Designer遵循职责单一原则,将判断逻辑独立为一个节点。例如,判断某目标是否在视野内,虽然可以在攻击的Action节点中编写该逻辑,但这样会使Action节点的职责不单一,不利于视野判断逻辑的复用。一般情况下,条件节点会出现在Sequence控制节点中,其后紧跟条件成立后需要执行的Action节点。

Behavior Designer的变量共享机制

Behavior Designer对变量共享做了如下处理:

  • 在同一个Behavior Tree(通常一个GameObject对应一个Behavior Tree)的Task之间共享的局部变量,可以直接在编辑器的Variables中添加。
  • 支持在不同Behavior Tree之间共享的全局变量。
  • 支持Task与非Task(游戏系统中的其他脚本)之间进行变量传递,可通过以下代码实现:
    behaviorTree.GetVariableName("MyVariableName");
    behaviorTree.SetVariableName("MyVariableName", value);
    

此外,我查看了Behavior Tree官网的视频,讲解得比较清晰。不过,Sample代码需要一个码才能下载,由于目前使用的是非正式渠道的插件,没有该码,所以无法下载。