孙广东 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. 基于FPGA的异步FIFO验证

    现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 .对异步FIFO验证的平台如图1所示 ...

  2. Apache2.2配置小结.

    lamp 1.编译安装 2,日志轮循 3,优化 4,排错 4,1 vhost :NameServer 4,2 403:虚拟主机,给目录在主配置文件里添加配置 4.3 首页文件 初始化安装完成后,如果不 ...

  3. Avoid strong reference cycles

    转自:http://masteringios.com/blog/2014/03/06/avoid-strong-reference-cycles/ With the introduction of A ...

  4. 简单的图形学(二)——材质与反射

    在上一篇[游戏框架系列]简单的图形学(一)文章中,我们讲述了光线追踪的一个最简单的操作--依每个像素延伸出一条追踪光线,光线打到球上(产生交点),就算出这条线的长度,作为最终的灰度,打不到球上,就显示 ...

  5. 0058 Spring MVC如何向视图传值--Model--ModelMap--ModelAndView--@ModelAttribute

    MVC,模型.视图.控制器,请求来了,控制器负责找到Controller进行一通计算,计算的结果放到模型里,再找视图把结果呈现出来. 请求里一般都包含了一些参数,前面说了,Spring MVC有很多种 ...

  6. MySQL的使用笔记

    @Reference Manual (以下简称REF-M) 在官网,选择MySQL Server,选择Documentation,就可以下载了,建议下载PDF 注意版本要对应 很重要,需要的时候就go ...

  7. Android开发日记(四)

    在服务器端数据库新建一个表ad 在DataInfo.edxm模型中点击从数据库更新模型,发布. 就新建了一个实体ad 然后新建cs文件 using System; using System.Colle ...

  8. 我的mac的其他满了,发现是一个叫core的文件

    6Q12KFX%PDARS7B{B__OZVW.jpg (97.93 KB, 下载次数: 0) 下载附件  保存到相册 2014-7-3 15:40 上传   如图,电脑虽然买了半年但是基本没怎么用, ...

  9. C++中static_cast, dynamic_cast使用方法

    前言 Android的Framework层源代码中有非常多强制类型转换函数的调用.写惯了C代码的人一般都习惯以下这样的强制转换方式: double a = 89; int b = (int)a; 可是 ...

  10. Qt Quick的国际化和本地化

    国际化您的应用程序 以下部分描述了国际化QML源代码的各个方面.如果您对应用程序中的所有用户界面组件都遵循这些指南,则可以针对不同语言和本地文化约定(例如日期和数字的格式化方式)本地化应用程序的各个方 ...