孙广东 2014.6.30

AI。

我们的第一印象可能是机器人,如今主要说在游戏中的应用。

  现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完毕的。比方在RPG游戏中出现的NPC,实际上就是一个AI的载体。它们有着最常规,以及特定情景的推断能力与数据处理能力。推断。也称为分析。

大量的分析,即逻辑。逻辑,即AI.

  最形象的样例应该是游戏中具有攻击能力的怪物,当它们看到玩家时(或者被玩家攻击)的情况下,怪物可能会在指定范围或者指定时间段内尾随玩家并试图反击。

但当玩家离开怪物的视野范围或者超过了怪物的尾随时间。怪物则会自己主动返回原来的地方。而当玩家下次出如今同一个怪物的视野内时,怪物依旧会作出同样的举动。但这并不能代表怪物具有记忆能力,由于它仅仅能依据简单的程序去推断外界发生的特定场景以作出对应的处理。这纯粹是基于数字储存器与状态机的人工智能。假设我们在此基础上再进行优化,让怪物具有记忆能力:再次看到玩家时的怪物将会出现愤慨状态,而且攻击能力变得更强,似乎会更加有趣。由于这接近了人类的情绪特征。

行为树(Behavior Tree)

  依据上面所描写叙述的AI载体的特征,假设一个AI载体承载的知识量过于庞大,那就给维护带来了非常大的困扰。

仅仅是假设我们要实现较为智能的AI载体,庞大的知识库和行为特征是必须的。

  行为树(Behavior Tree)是Next-Gen AI提出的一个原型。

它以图形的形式展现了AI系统的结构。如图(1-1):

以上定义的是普通游戏怪物的基本AI的行为树。

所谓树。即有根节点,有分支节点,有叶节点。

可能大家已经注意到,在图中行为树中具有不同特性的节点。而且这些节点似乎是以一定的规则组装成的一棵树。

行为树节点(Behavior Tree Nodes):

·选择节点(Selector): 顺序运行子节点,仅仅要它的一个子节点返回true。则整个分支返回true,反之返回false,相似程序中的逻辑或(OR)。

·顺序节点(Sequence) :顺序运行子节点。仅仅要它的一个子节点返回false,则整个分支返回false,反之返回true。 相似程序中的逻辑与(AND)。

·条件节点(Condition) : 属于叶子节点(该种节点不同意有不论什么子节点),用于描写叙述一个条件是否成立。
·行为节点(Action) : 属于叶子节点(该种节点不同意有不论什么子节点)。用于描写叙述一个终于运行的动作。一般返回true。

  当中选择节点(Selector)。 顺序节点均属于组合节点。

组合节点是一个分类概念。并不是指一个节点的实例。

  上图行为树中的怪物拥有[攻击玩家]、[巡逻]、[自卫]三种行为,这三种行为并不是指怪物的终于决策,而是特指怪物可能会从这三个行为中出发。

当中[攻击玩家]可能有两种方式。当中一个性质为顺序节点的[常规攻击],它必需要满足三个条件。而另外一个[报复性攻击],不同的地方在于多了一个条件节点[怪物处于发狂状态]。

  理解各种不同节点所表达的意思,你就会非常奇妙地发现思路变得非常清晰。

整棵树的特征以及逻辑走向。必需要的条件都尽然于眼底。传统的文字描写叙述AI的方式非常不低碳。由于大量的文字并不利于团队理解策划的思路,但通过行为树则能够非常明白地表达条件与动作之间的关系。

  假设说行为树是统一团队理解一致性的好方法,那么怎样把这个树实现出来呢?

状态机(State Machine)

  说到状态机的概念,或许非常多程序猿都相当熟悉。就拿上面的行为树来说,仅仅是描写叙述了一个怪物的AI,但当中涉及的状态可谓不少。在传统的设计思路中,玩家进入怪物的视野时。怪物的状态将会立即发生改变而从主动攻击玩家。

  状态(State),指的是对象的某种形态。在当前形态下可能会拥有不同的行为和属性。状态机(State Machine),指控制对象状态的管理器。对象的状态不会无端端改变。它需要在某种条件下才会变换。比方上面定义的行为树中的[巡逻]行为,它就规定了必须是在怪物视野中找不到目标的情况下才会变更的状态。一旦有玩家进入了它的视野,它将立即切换为攻击状态。

总而言之。状态会在某个事件触发之后变更。

不同的状态也有可能决定了对象的不同属性和行为。

Next-Gen AI的行为树绝对是个好东西。相信经过上面的介绍大家也对行为树的特性略知一二。有觉悟的读者可能已经意识到。既然有了行为树,那是不是意味着能够做一款辅助工具去把这棵树生成出来,然后套入一个固定的AI框架。再把游戏逻辑的雏形自己主动生成?这是全然能够的。假设在行为树的基础上再增加脚本的机制,那么游戏AI的实现将会更加灵活、清晰。

Unity中现有的AssetStore中的行为树插件有:     Behavior Designer 、     AI Behavior、     Behaviour Machine Pro

状态机插件有:     Playmaker(应用了状态机的插件)、非常多的AI插件等

參考资料

  《AI游戏引擎程序设计》(AI Game Engine Programming) - (美)Brian Schwab




做游戏长知识------基于行为树与状态机的游戏AI(一)的更多相关文章

  1. Unity教程之-基于行为树与状态机的游戏AI

    AI.我们的第一印象可能是机器人,现在主要说在游戏中的应用.关于AI的相关文章我们在前面也提到过,详细请戳这现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完成的.比 ...

  2. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  3. 课程设计小组报告——基于ARM实验箱的捕鱼游戏的设计与实现

    课程设计小组报告--基于ARM实验箱的捕鱼游戏的设计与实现 一.任务简介 1.1 任务内容 捕鱼游戏这个项目是一个娱乐性的游戏开发,该游戏可以给人们带来娱乐的同时还可以给人感官上的享受,所以很受人们的 ...

  4. 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架

    高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...

  5. 使用行为树(Behavior Tree)实现游戏AI

    ——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...

  6. 使用unity3d和tensorflow实现基于姿态估计的体感游戏

    使用unity3d和tensorflow实现基于姿态估计的体感游戏 前言 之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young.但是梦想还是要有的,万一实现了呢.趁着p ...

  7. [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]

    题面 传送门 思路 观察一下题目,要求的是修改"距离点$u$的距离一定的点权值",那这个就不能用传统的dfs序类算法+线段树维护,因为涉及到向父亲回溯的问题 看到和树上距离相关的东 ...

  8. 查找(四)-------基于B树的查找和所谓的B树

    关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...

  9. 【CityHunter】基于LBS的AR体感游戏设计理念

    本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...

随机推荐

  1. [Jobdu] 题目1369:字符串的排列

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...

  2. Vim下的插件管理工具pathogen简介

    1.pathogen简介:    通常情况下安装vim插件是将所有的插件和相关的doc文件都安装在一个文件夹中,如$VIM/vim74/plugin目录下,文档在$VIM/vim74/doc目录下,但 ...

  3. How to Acquire or Improve Debugging Skills

    http://blogs.msdn.com/b/debuggingtoolbox/archive/2007/06/08/recommended-books-how-to-acquire-or-impr ...

  4. python学习之__new__()

    这里我从str类的__new__()方法来说明. str的__new__(cls,*args)必须传入一个参数cls,他是str的子类(注意不是实例). __new__()的返回值是该子类的实例,表现 ...

  5. VS2012插件推荐

    其实Metro的感觉有了,但是这两种配色都不太喜欢..白色太扎眼,黑色太瞎眼……有木有灰色的啊喂(有没有其他主题?看后面↓) 黑色主题绝对是熬夜码农必备……但是十分不适合在白天使用. 下面来分享几个好 ...

  6. linux命令(24):/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc

    /etc/profile./etc/bashrc.~/.bash_profile.~/.bashrc很容易混淆,他们之间有什么区别?它们的作用到底是什么? /etc/profile: 用来设置系统环境 ...

  7. centos 手动编译 fcitx 各种问题大全

    yum install ncurses-devel   tinyxml-devel sqlite-devel wget http://downloads.sourceforge.net/project ...

  8. Spark: Best practice for retrieving big data from RDD to local machine

    've got big RDD(1gb) in yarn cluster. On local machine, which use this cluster I have only 512 mb. I ...

  9. 通过SiteMapDataSource动态获取SiteMap文件进行权限设置

    最近做一个用ASP.NET做一个小项目,用户不是很多,功能不算太复杂,但是做到权限控制的时候有点犯难,这么一个小系统如果全部做一个大的复杂的权限控制觉得成本不划算,打算用Treeview ,根据不同的 ...

  10. vim同时打开多个文件进行编辑

    在A文件中用:tabedit B 就打开了B文件,然后用gt来切换进入A 或B文件中: 如果打开多个,就用 1gt ,2gt来切换至不同的文件:返回上一个文件用gT