行为树简介

目录

1.定义

2.优点

3.总结:


 

1.定义

行为树的概念会比状态机要复杂些——行为树是一个包含逻辑节点和行为节点的树结构,每次需要找出一个行为的时候,会从树的根节点出发,遍历各个节点,找出第一个和当前数据相符合的行为。

为了弄明白这个概念,我们讲一个英雄的故事:

从前有一个胆小如鼠的英雄,

  1. 他看到哥布林就会跑过去打它;
  2. 他看到半兽人就会逃跑;
  3. 他看不到哥布林也看不到半兽人就会休息;
  4. 他看到哥布林也看到半兽人也会跑。

用行为树表现出来:

 

Root是根节点,每次需要寻找行为的时候都必须从这里开始。

Priority Selector是一个逻辑节点,它的意思是让从左到右遍历自己的子节点,如果子节点的准入条件符合信息的话,就执行该子节点。如果英雄只看到哥布林,那么Orc in sight这个准入条件不符合,Escape不执行;Globlin in sight符合,于是执行Fight;因为Fight在Idle的左边,所以Fight的优先程度更高,于是Idle不执行。在我们的例子中,Idle可以看作是default behavior。

2.优点

从简单的行为树和有限状态机的对比,我们就可以看出,行为树由于引入了逻辑节点,它的转换条件更加少(线更少,更清晰),让拓展AI变得更加容易

行为树还有另外一个优点:行为的重用(reuse)。

例如,Escape有一个跑的行为,而Fight则有跑的行为,和砍怪的行为。请看图:

 

 

Sequence同样是一个逻辑节点,它的意思是从左到右按顺序执行子节点,并且仅仅在一个子节点执行完成后才执行下一个子节点。在例子中,Do Run需要有一个自己判断到达目的地的方法,当该方法返回end的时候,才会执行Do Slash。

Escape和Fight的Do Run行为节点是一样的,只是Fight多了一个Do Slash行为节点而已。所以Do Run是一个可以重用的节点。

在行为树中,我们能够编写好Do Run,Do Slash这些基础的行为节点,和设定一些准入条件,就可以组成千变万化的AI了!

我们希望英雄在逃跑的时候群众发出嘘声,而在攻击的时候出现欢呼声:

 

 

省略了其他部分,只画Escape部分。

 

Parallel是一个逻辑节点,它的意思是让所有子节点同时运行,那它什么时候结束呢,可以使当所有子节点都完成的时候结束,也可以让任一子节点完成时结束,视乎需要来做出选择。

那么在攻击当中会是怎么样实现的呢?大家可以尝试画出来,习惯一下行为树的思维方式。


 

3.总结:

  1. 行为树拥有3种节点:
    1. 根节点 Root
    2. 逻辑节点(可拓展):
      1. Priority Selector
      2. Sequence
      3. Parallel
    3. 行为节点
  2. 行为树在复杂的情况比有限状态机更清晰,更可拓展
  3. 行为树有利于逻辑的重用
  4. 设计得好的行为树可以千变万化!

 转载自:

游戏AI - 行为树Part1:简介

### 创建和使用Unity2D中的行为树 #### 行为树简介 行为树是一种用于规划执行的数学模型,广泛应用于计算机科学、机器人技术和视频游戏等领域。这种结构允许以模块化的方式描述有限任务集之间的转换,特别适合于创建复杂的行为模式而不必深入处理底层逻辑细节[^1]。 #### 准备工作 为了在Unity2D项目中实现行为树,首先需要安装Behavior Designer插件或其他支持行为树功能的资产包。这些工具提供了图形化的编辑界面来设计行为树,并简化了节点间的连接操作。 #### 设计行为树 一旦有了合适的开发环境,就可以开始构建具体的游戏AI逻辑。通常会定义一系列基础的任务作为叶子节点,比如移动到指定位置、攻击敌人或是拾取物品等;接着通过组合器(composites)如序列(sequence),选择(selectors)等高级节点将多个子任务串联起来形成更复杂的决策流程。 #### 编写自定义任务 对于某些特定需求可能不存在现成的任务类型可供选用,则可以通过继承相应类来自行扩展新的行为单元。例如: ```csharp using BehaviorDesigner.Runtime; using UnityEngine; public class MoveToTarget : ActionNode { public Transform targetTransform; // 目标物体的位置 protected override TaskStatus OnUpdate() { if (Vector3.Distance(transform.position, targetTransform.position) < 0.1f){ return TaskStatus.Success; } transform.position = Vector3.MoveTowards( transform.position, targetTransform.position, Time.deltaTime * speed); return TaskStatus.Running; } } ``` 此脚本实现了让角色向目标对象靠近的功能,当两者距离小于一定阈值时返回成功状态,否则继续更新当前位置直到满足条件为止。 #### 集成至场景 最后一步就是把编写好的行为树关联给实际的角色控制器组件上。这一般涉及到设置外部变量参数以及调整内部配置选项使得整个系统能够正常运作并响应外界变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值