行为树从本质上来说,是一颗逻辑树,它把所有的行为逻辑用树形结构串联起来,仔细观察的话,可以发现行为树的核心思想有三个方面:

  • 逻辑分离
  • 逻辑关联
  • 逻辑抽象

听上去很玄乎,其实是很简单的东西,可以先想想我们平时要做一个功能是怎么做的,我们会先定义一个函数,定义好输入和输出,然后在这个函数里写代码来实现功能逻辑,这是第一步,是最直接和简单的方式。后来,当这个功能越来越复杂的时候,这个函数里的代码就会越来越长,变得难以阅读和维护,我们就会把一些逻辑拿出去,变成另一个函数,原先那个函数里就变成了一些简单逻辑和函数的组合,再然后,我们发现有些函数可以变成一些通用函数,我们就会把这些函数集合起来变成一个库,这样其他的函数也可以访问这个函数来获取他的逻辑功能。

这里的整个过程就包含了上面所说的三个方面,把逻辑移出去变成一个新的函数,就是“逻辑分离”,原本函数里的简单逻辑和函数组合就是“逻辑关联”,把函数变成通用库就是“逻辑抽象”。AI是游戏的逻辑大户,充斥着大量的游戏逻辑和算法,所以就特别需要好的架构来维护和管理“逻辑”,要不整个代码就是一团糟,不仅无法维护,而且也很难除错,现有的AI的架构基本都围绕这个展开。

让我用有限状态机(FSM)来举个例子,在FSM中就包含了逻辑的分离和抽象,它有“状态”这个概念,这就是一个逻辑块,它的逻辑块也可以重用,但它对于逻辑的关联做的相对比较薄弱,由状态自己来决定何时跳转,并且跳转比较随意,所以逻辑的关联性比较模糊,这就导致FSM在多状态的情况下很难维护。所以后来有了层次化的有限状态机(HFSM),部分解决了逻辑关联模糊的问题,但FSM的设计原理导致它并没有办法从根本上解决问题。但对于状态和跳转都不是很复杂的功能,FSM是个不错的选择。

让我们再回到行为树,行为树把逻辑分散在节点中,每个节点负责自己的逻辑部分,这些逻辑节点又可以被放在行为树的其他部分,也就是可以被重用。在这个基础上,行为树又抽象了三个逻辑概念,控制逻辑,前提逻辑,行为逻辑,其中行为逻辑用来描述功能,控制逻辑和前提逻辑用来描述逻辑间的关联,对于逻辑关联的抽象是行为树相较于FSM的一个重大突破,它使得逻辑的关联“可视化”了,用过行为树的人都会有这样的感觉,我只要看一下树的结构,我就能知道整个AI行为是如何协作的了,也正是这样的优势使得行为树现在被越来越多的用在了AI逻辑中。

但如果我们再往前思考一步,QQ账号出售可以发现如果仅仅把行为树限制在AI部分,显得有点可惜,就像我前面一直强调,行为树就是逻辑树,是一种对于逻辑的维护和管理的架构。游戏中很多地方都是有逻辑的,有些甚至会非常复杂,这些地方为什么不能用行为树的方式来思考和实现呢?经过实践,我发现这是完完全全可行的,我甚至可以这样说,只要存在复杂的逻辑,就可以用行为树的方式去做,它可以很好的帮助你理清思路,实现漂亮的逻辑代码。由于行为树与AI有了“密切”的绑定,所以甚少接触AI的程序员对行为树基本不是很了解,这也导致行为树并没有得到广泛的应用,甚至都没有作为一个候选方案。

我有幸在现在项目里,做了很多其他的模块,所以我也把行为树的一些思路用到了其他的模块中,发现写起来非常的顺,也很爽快。我举一个我们在项目中碰到的例子,就是任务系统,做过游戏的人都知道,这个系统在逻辑层面是很复杂的,内容繁多,但如果用行为树的方式去思考的话,就会发现这个复杂的问题一下子就简化了。

仔细分析任务系统的话,可以把任务系统分成几个部分,一个是接这个任务条件,然后是任务的完成目标,然后是奖励(这个和下面的讨论关系不大,暂且略过)。我们先可以抽象两个概念,“单个条件”和“单个目标”。单个的条件包含“怎么算是达到条件”的一段逻辑,单个的目标也是一段逻辑,包含了“怎么算是完成”。所以这些都可以做成一个个逻辑单元,就像行为树的前提和行为节点一样。另外根据设计的需求,接任务的条件可能有多个,完成的目标也可以有多个,所以这些单个逻辑之间就存在逻辑关联,所以我们可以借鉴行为树中控制节点的概念,把这些逻辑关联也抽象出来,成为“关联”,比如一个最简单的逻辑关联就是“并且”,这样我们就可以描述这样一个逻辑,要完成目标1,“并且”完成目标2,这里我们就把两个“单个目标逻辑”用“关联”串起来了。

最后,我们就在每个任务中定义了两颗逻辑树(换个通用的名称,其本质和行为树是一样的),一个是接这个任务的条件树,一个是完成这个任务的目标树,这样每个任务都可以用配置文件来配,我们也做了一个工具来帮助设计师来生成和编辑任务,作为程序只要维护那些可以被用到的“条件”,“目标”,“关联”就可以了。

任务系统设计

关于任务系统,我这里就贴几个代码片段(伪代码)再详细说明一下

先是数据结构定义:

由于Condition和Objective都定义成了树结构,所以我们就可以很方便的组织逻辑,下面是一个具体Condition的例子,Objective也可用同样的方式定义出来。

这样接任务和更新任务就变的很简单。

所以我们只需要定义出单个的逻辑片段,然后游戏设计去拼搭任务逻辑就可以了,和行为树的思路是很像很像的。当然任务系统还有很多细节需要处理,但这样的逻辑结构可以大大的帮助理清思路,实现出漂亮的代码。

Mission Complete!非常简单!

这就是行为树的思维方式带来的好处,我们在游戏的教程系统,技能系统等相对逻辑复杂的系统中都或多或少有用到这样的架构方式,使得单个的逻辑被高度提炼和抽象,逻辑的关系非常清晰,分工也变得更为简单。

用行为树的方式思考:任务系统设计相关推荐

  1. 用行为树的方式思考问题

    这段时间做了很多和AI无关的事情,做了个Flash的3D引擎,用汇编写了些shader,做了很多引擎的工具,脚本,插件,游戏也发布了首个预告片,一年多的工作收获满满,职位从AI Engineer变成了 ...

  2. [转]用行为树的方式思考

    这段时间做了很多和AI无关的事情,做了个Flash的3D引擎,用汇编写了些shader,做了很多引擎的工具,脚本,插件,游戏也发布了首个预告片(点击这里), 一年多的工作收获满满,职位从AI Engi ...

  3. 请画出使用mapreduce对英文句子_「Postgresql架构」用MapReduce的方式思考,但使用SQL...

    对于那些考虑使用Citus的人来说,如果您的用例看起来很合适,我们通常愿意花一些时间与您一起帮助您了解Citus数据库及其可以提供的性能类型.我们通常与我们的一位工程师进行大约两个小时的配对,以完成此 ...

  4. 软件测试理论与经验-第1章(测试员的角色)-第2章(按测试员的方式思考)-阅读笔记

    Lessons Learned in Software Testing  美 Cem kaner.James Bach.Bret Pettichord著 本书的三位作者具有多年的测试经验,知道成功的测 ...

  5. 用React的方式思考

    2019独角兽企业重金招聘Python工程师标准>>> 构建大型.反应迅捷的web app,我首选react.我们在facebook和instagram中都用了它,扩展的不错. 当你 ...

  6. oracle execute immediate执行多条语句_用数据库的方式思考SQL是如何执行的

    私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包. 今天我们就从数据库的角度来思考一下 SQL 是如何被执行的. 关于今天的内容,你会从以下几个方面进行学习: Oracle 中的 SQL ...

  7. 教你如何以对象的方式思考

    <写给大家看的面向对象编程书> 众所周知,在深入某种编程语言或建模语言之前必须先熟悉面向对象思维过程.遗憾的是,许多软件专业人员往往没有花费适当的时间和精力来真正理解面向对象的基本概念,就 ...

  8. LeetCode 572. 另一个树的子树 思考分析

    题目 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 1: 给定 ...

  9. Redis遍历方式思考--字典扩容方式

    全量遍历keys 工作中线上Redis维护,有时候我们需要查询特定前缀的缓存key列表来手动处理数据.可能是修改值,删除key.那么怎么才能快速的从海量的key中查找到对应的前缀匹配项. Redis提 ...

最新文章

  1. 如何在Pandas的DataFrame中的行上进行迭代?
  2. 三角函数在线快速计算机,三角函数计算器
  3. 卡主 登录不上_香港服务器远程不上几大原因
  4. 03-list,set,数据结构,Collections
  5. 实战系列-IDEA中Spring MVC实现接口功能
  6. linux系统下RocketMQ的集群搭建
  7. 13. Window blur() 方法
  8. IBM服务器渠道销售招聘,热招 | IT客户服务渠道销售,我们在IBM等你!
  9. QT--内存错误导致程序崩溃
  10. 列举1000以内的水仙花数,并求出水仙花数的个数
  11. 全球十大智能物流装备龙头企业
  12. php选课删除选课成绩统计,高校选修课平时成绩管理系统
  13. MOOC中国大学自动评分js脚本
  14. java mac转unix_管理Java类路径(UNIX和Mac OS X)
  15. 力扣 643. 子数组最大平均数 I 滑动窗口
  16. 4种最适合零基础入门的编程语言排行榜
  17. METIS 安装过程
  18. 7-17 最长对称子串
  19. (复习次数:1)D - Permutation Transformation——Codeforces Round #702 (Div. 3)
  20. c语言程序设计第三版杜有福,C语言程序设计习题答案 杜有福

热门文章

  1. mysql创建表时遇到的问题_MySQL语言创建表时遇到了问题,请问我错在哪里了?...
  2. linux内核中用来对共享资源进行隔离,简单理解Docker
  3. 常用标准库_C语言标准IO库常用函数
  4. php数组交集 效率,PHP数组交集的优化
  5. 隐藏在计算机网卡怎样删除,如何卸载电脑中隐藏的虚拟网卡设备
  6. 分治法:关于选择算法,找最大,找最小,同时找最大和最小,找第二大
  7. 对The Curse of Dimensionality(维度灾难)的理解
  8. linux 防火墙配置与REJECT导致没有生效问题
  9. 探索ArrayList自动改变size真相
  10. 《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”