游戏AI之行为树(上)


游戏AI之行为树(上)
Introduction
简介

因为网上有太多的行为树的教程和手册,当我在决定哪一个适合Zomboid项目时,总是反复遇到相同的问题。我看的很多手册都偏重于具体代码的实现,或者简单地基于通用的节点的工作流,都没有实际的实现案例,就像下面这张图:



因为那些教程对于我理解行为树的核心规则没有用处,我发现我尽管知道行为树是如何操作的,但对于在游戏中应当使用何种节点,或者真正完整的行为树是怎样的,都没有一个实际的概念。

我已经花了海量的时间做试验(有记录的从Zomboid项目就开始了,它是用的Java,使用的是非常优秀的JBT-Java行为树http://sourceforge.net/projects/jbt/),所以我不担心实际的编码实现,而且关于这有大量的教程,基于各种游戏引擎的都有。

可能在我描述的稍微具体点的修饰节点类型中有些实际上是包含于JBT的,而不是通常的行为树的概念,但是我发现它们在PZ行为树完全适用,所以,如果你的行为树框架不支持的话,也很值得考虑实现一下。

我并不是想说我想在行为树上成为专家,然而在开发Zomboid项目的NPC的过程中我发现并不能这样,所以我花心思搞出几样东西,有了它们会让我的第一次尝试更加顺畅,或者至少让我知道用行为树能做到什么。我不会深入阐述具体实现,仅仅给出几个抽象的例子,它们都是我在Zomboid项目中使用的。

Basics
基础

顾名思义,不同于有限状态机或者其它AI系统,行为树就是一棵节点层次分明的树,控制着AI物体的一系列决定。从树延伸出的叶子节点,执行控制AI物体的指令。各种工具节点组成树的分支,来控制AI指令的走向以形成一系列的指令,这样来满足游戏需要。

它可以是一棵很高的树,可以具有完成特定功能的子树,开发者可以创建行为库并把它们适当地连接起来以达到非常真实的AI行为。开发过程是高度可迭代的,你可以先排出一个基础的行为树,然后创建新的分支来处理各种达到目标的可选方案,这些分支按照它们的优先级排列,这样AI在一个特定的行为失败可以回溯到另一个策略,这是行为树巨大优势所在。

Data Driven vs Code Driven
数据驱动 vs 代码驱动

这个区别与这篇手册关联不大,但是应该提一下,行为树可能有很多种方法来实现。一个主要的区别是行为树是否在代码之外被定义的:可能用XML文件或者其它专门的格式,用外部编辑器来修改;也可能是直接在代码中的嵌套的类实例。

JBT用一种比较奇特的方法,混合上述两种方式。你可以用一个编辑器来可视化建立你的行为树,但是实际上是一个导出的命令行工具生成了java代码,在代码中表示你的行为树。

不论如果实现,叶子节点是你实际处理游戏逻辑的地方,用来控制你的角色或者判断角色所处的情景或周围的事物,这些东西你都需要自已在代码里定义,代码可以是你本地的语言或者Lua和Python这样的脚本语言,而行为树会利用它们达到复杂的行为。这些节点都是有实际作用的,有时它们就像标准库一样调用,行为树自己处理内部数据,而不是简单地给角色发送指令。行为树这一点让我很兴奋。

Tree Traversal
树的遍历

行为树的一个核心方面就是,不同于你代码中的方法,某个特定的节点或者分支可以要花好几帧才能完成。行为树的基本实现中,系统每一帧从树的根部开始遍历,检测每一个节点是否被激活,沿途重新检查所有节点,直到到达当前激活的节点让它刷新。

这不是一个高效的方法,尤其当随着开发过程它变得越来越高,扩展得很大的时候。我想说很有必要在你实现的行为树中保存正在处理的节点,这样下次就能直接刷新而不是每一帧都遍历整棵树。应该感谢JBT已经做到了这一点。

Flow
工作流

行为树是由很多类型节点组成的,但是它们都有一些核心的功能,那就是它们都返回三种状态之一。(这依赖于行为树的具体实现,可以有三种以上的状态,但是我还没有实践过这些,它们和主题也没太大关系)有如下三个状态:
Success
Failure
Running

前面的两个,就像它们的名字一样,通知它们的父节点它们的操作是成功或者失败的。第三个表明成功或者失败还不确定,这个节点还会一直运行,下一次整棵树刷新时它仍然会刷新,那时将再次有机会决定它是成功、失败或者继续运行。

这个功能是行为树强大的关键所在,因为这允许一个节点持续几帧进行操作。例如,一个“行走”节点,在它计算路径时和移动角色到目标地点时会提交Running状态。如果因为某种原因寻路失败,或者有障碍阻挡角色到达目的地,这个节点会返回failure给它的父节点。一旦角色到达了目的地,它会返回success,表明Walk命令成功执行了。

这说明这个节点就它本身来说有一个固定不变的协议来表示成功和失败,任何使用它的行为树都可以从它获取到这个结果。这些状态传导和定义整棵行为树的工作流,生成一系列事件和多个不同的执行路径,从而达到想要的AI行为。



原文作者:Chris Simpson
原文链接:http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值