做游戏长知识------基于行为树与状态机的游戏AI(一)
孙广东 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(一)的更多相关文章
- Unity教程之-基于行为树与状态机的游戏AI
AI.我们的第一印象可能是机器人,现在主要说在游戏中的应用.关于AI的相关文章我们在前面也提到过,详细请戳这现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完成的.比 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 课程设计小组报告——基于ARM实验箱的捕鱼游戏的设计与实现
课程设计小组报告--基于ARM实验箱的捕鱼游戏的设计与实现 一.任务简介 1.1 任务内容 捕鱼游戏这个项目是一个娱乐性的游戏开发,该游戏可以给人们带来娱乐的同时还可以给人感官上的享受,所以很受人们的 ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
- 使用行为树(Behavior Tree)实现游戏AI
——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...
- 使用unity3d和tensorflow实现基于姿态估计的体感游戏
使用unity3d和tensorflow实现基于姿态估计的体感游戏 前言 之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young.但是梦想还是要有的,万一实现了呢.趁着p ...
- [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]
题面 传送门 思路 观察一下题目,要求的是修改"距离点$u$的距离一定的点权值",那这个就不能用传统的dfs序类算法+线段树维护,因为涉及到向父亲回溯的问题 看到和树上距离相关的东 ...
- 查找(四)-------基于B树的查找和所谓的B树
关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...
- 【CityHunter】基于LBS的AR体感游戏设计理念
本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...
随机推荐
- Remoting异步回调,向在线用户广播消息
本文目的:向Remoting在线客户端广播消息. 使用的主要技术:异步,回调,广播. 实现过程: 定义远程实例 using System; using System.Collections.Gener ...
- 使用UINavigationController后导致UIScollView尺寸变化
转自:http://www.w3c.com.cn/%E4%BD%BF%E7%94%A8uinavigationcontroller%E5%90%8E%E5%AF%BC%E8%87%B4uiscollv ...
- SourceInsight-查看java中接口对应的实现类
1.双击选中需要查看的接口名称,然后右击选择“Show in Relation Window” 2.然后在右侧会弹出一个Relation的窗口 如果没有列出对应的实现类,可以在接口名上再次右击,依次选 ...
- lua内存管理
本文内容基于版本:Lua 5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入.当然自定义内存管理器必须遵循Lua已定义的一些行为规则 ...
- 启用div作为编辑器 添加contentEditalbe = “true”,如何让在Html中特殊字符不被转义
今天项目中碰到了两个难以解决的问题,一个是ctrl + enter键换行,enter键发送和支持html特殊字符的发送,二人会话和群会话都必须支持,发送短信的模块也必须支持特殊的字符,但是现在碰到的问 ...
- 再访贺利坚(一):IT毕业生去培训机构,这件事很正常(转载)
转载自: 再访贺利坚(一):IT毕业生去培训机构,这件事很正常 导语:与烟台大学计算机学院贺利坚副教授相识,还是在2012年年底,那个时候我在为社区之星专访栏目寻找合适的采访人.在社区运营的推荐下,我 ...
- 我对C++的一些疑问
我对C++的一些疑问,最近使用C++,总感觉有些东西自己没有抓住,也可能是自己基础学的不是很扎实,所以对一些基本的东西理解不够透彻导致的.因为自己在学校也学过C#和java,C#它是一个完全的面向对象 ...
- 【Maven学习】Maven打包生成普通jar包、可运行jar包、包含所有依赖的jar包
http://blog.csdn.net/u013177446/article/details/54134394 ******************************************* ...
- DOS下运行C++程序配置
闲来无事,想想C++是否一样能用dos来,编译运行程序呢,于是上网搜搜结果喜人,详见 http://blog.csdn.net/xiaoqinpeng/article/details/6556843 ...
- eql高可用部署方案
运行环境 服务器两台(后面的所有配置案例都是以10.96.0.64和10.96.0.66为例) 操作系统CentOS release 6.2 必须要有共同的局域网网段 两台服务器都要安装keepali ...