开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

蛮牛译馆

关注:514

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 1710|回复: 1

[外文翻译] 游戏AI之行为树(上)

[复制链接]  [移动端链接]
排名
7281
昨日变化
9

4

主题

25

帖子

221

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
37473
好友
3
蛮牛币
496
威望
0
注册时间
2014-8-1
在线时间
86 小时
最后登录
2016-11-7
QQ
发表于 2016-3-16 10:44:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 caedmom 于 2016-3-21 12:32 编辑

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

image001.gif


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

我已经花了海量的时间做试验(有记录的从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


扫描下方二维码关注游戏蛮牛官方微信~每日都有精选干货与你分享呦~
蛮牛微信.jpg
本文由蛮牛译馆倾情奉献,翻译:osblow_ui & boswellyu.除 合作社区 及 合作媒体 外,禁止转载。如有问题请及时联系。


回复

使用道具 举报

2初来乍到
144/150
排名
9382
昨日变化
2

0

主题

24

帖子

144

积分

Rank: 2Rank: 2

UID
114517
好友
1
蛮牛币
232
威望
0
注册时间
2015-7-21
在线时间
52 小时
最后登录
2016-11-30
发表于 2016-3-16 16:33:34 | 显示全部楼层
赞赞赞~~~~~~
[发帖际遇]: Moyiii 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表