Unity教程之-基于行为树与状态机的游戏AI
AI。我们的第一印象可能是机器人,现在主要说在游戏中的应用。关于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插件等
原文地址:http://www.unity.5helpyou.com/3359.html
Unity教程之-基于行为树与状态机的游戏AI的更多相关文章
- 做游戏长知识------基于行为树与状态机的游戏AI(一)
孙广东 2014.6.30 AI. 我们的第一印象可能是机器人,如今主要说在游戏中的应用. 现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完毕的.比方在RPG游戏中 ...
- 使用行为树(Behavior Tree)实现游戏AI
——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...
- 游戏AI之决策结构—有限状态机/行为树(2)
目录 有限状态机 行为树 控制节点 条件节点 行为节点 装饰节点 总结 额外/细节/优化 游戏AI的决策部分是比较重要的部分,游戏程序的老前辈们留下了两种经过考验的用于AI决策的结构: 有限状态机 行 ...
- Unity 用ml-agents机器学习造个游戏AI吧(1)(Windows环境配置)
前言:以前觉得机器学习要应用于游戏AI,还远得很. 最近看到一些资料后,突发兴致试着玩了玩Unity机器学习,才发觉机器学习占领游戏AI的可能性和趋势. Unity训练可爱柯基犬Puppo 机器学习训 ...
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 查找(四)-------基于B树的查找和所谓的B树
关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写 首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来 ...
- 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...
随机推荐
- Aurora 8B/10B、PCIe 2.0、SRIO 2.0三种协议比较
在高性能雷达信号处理机研制中,高速串行总线正逐步取代并行总线.业界广泛使用的Xilinx公司Virtex-6系列FPGA支持多种高速串行通信协议,本文针对其中较为常用的Aurora 8B/10B和PC ...
- 【Android】9.3 自定义列表视图的外观
分类:C#.Android.VS2015: 创建日期:2016-02-18 一.简介 自定义的列表视图通常用Resources/Layout文件夹下的axml文件中的资源来声明,适配器则通过Id去加载 ...
- Qt creator 编译错误:无法解析的外部符号(命令)
问题来自于:仅仅是在creator 中加入了一个新的DIalog类,并在main(),中实例化并show.就出现例如以下的错误: main.obj:-1: error: LNK2019: 无法解析的外 ...
- centos 7 sshd 重启 停止 启动
# systemctl stop sshd.service #restart stop start
- python3和2的区别
1.print函数 python2中的print语句,被python3中的print()函数取代.print 'hello world'运行结果: python2中同时输出多个对象时,会创建一个元组, ...
- ny520 最大素因子 筛选法求素数
最大素因子时间限制:1000 ms | 内存限制:65535 KB难度:2 描述 GreyAnts最近正在学习数论中的素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序 ...
- . net 源代码调试
对于 .net framework 中的代码,光拿 Reflector 看是不够过瘾的,如果能够调试进去就好了! 其实,微软是提供了一套 sourcecode 的下载的: http://referen ...
- 小程序之自定义组件 ---- 列表goodsList
教程请查看小程序开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/ 自定义组件:自定义组 ...
- deepin linux手工更新系统
sudo apt-get updatesudo apt-get dist-upgrade -y 可以使用阿里云的镜像
- JavaScript高级 面向对象(10)--onload与jq中ready的区别
说明(2017.4.2): 1. 在body中放一个img标签,src链接一张图片,那么页面会先读取html的document文档,然后再读取外部资源(这里没加onload其实就是从上往下顺序读取). ...