做游戏长知识------基于行为树与状态机的游戏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体感游戏设计理念
本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...
随机推荐
- unity3D角色代码控制问题
///////////////2015/07/06//////// ///////////////by xbw////////////// //////////////环境 unity4.6.1// ...
- mac重装系统
通过 macOS 恢复功能启动macOS 恢复功能会根据您在电脑启动时按下的组合键来安装不同版本的 macOS.在按电源按钮打开 Mac 后,立即按住以下组合键之一.然后在看到 Apple 标志或旋转 ...
- 前端 JS,localStorage/sessionStorage、cookie 及 url 等实现前台数据共享、传输
需求是这样的:需要统计用户公司某款产品用户的回馈情况,美工给的设计多个psd,每个页面里面都有一个选择题,让用户选择自己的答案,最后经过几次选择之后在最后一个页面统一提交到后台!所以这里引出的技术需求 ...
- HDU 4565 So Easy!(公式化简+矩阵)
转载:http://www.klogk.com/posts/hdu4565/ 这里写的非常好,看看就知道了啊. 题意很easy.a,b,n都是正整数.求 Sn=⌈(a+b√)n⌉%m,(a−1)2&l ...
- mini filter driver sql server
https://blogs.msdn.microsoft.com/sql_pfe_blog/2013/04/23/identifying-the-cause-of-sql-server-io-bott ...
- ny8 一种排序 sort
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...
- 《SPARK/TACHYON:基于内存的分布式存储系统》-史鸣飞(英特尔亚太研发有限公司大数据软件部工程师)
史鸣飞:大家好,我是叫史鸣飞,来自英特尔公司,接下来我向大家介绍一下Tachyon.我事先想了解一下大家有没有听说过Tachyon,或者是对Tachyon有没有一些了解?对Spark呢? 首先做一个介 ...
- gulp——myself配置
var gulp = require('gulp'), uglify = require('gulp-uglify'), concat = require('gulp-concat'); var pu ...
- hadoop输出lzo文件并添加索引
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); ...
- C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...