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的更多相关文章

  1. 做游戏长知识------基于行为树与状态机的游戏AI(一)

    孙广东 2014.6.30 AI. 我们的第一印象可能是机器人,如今主要说在游戏中的应用. 现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完毕的.比方在RPG游戏中 ...

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

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

  3. 游戏AI之决策结构—有限状态机/行为树(2)

    目录 有限状态机 行为树 控制节点 条件节点 行为节点 装饰节点 总结 额外/细节/优化 游戏AI的决策部分是比较重要的部分,游戏程序的老前辈们留下了两种经过考验的用于AI决策的结构: 有限状态机 行 ...

  4. Unity 用ml-agents机器学习造个游戏AI吧(1)(Windows环境配置)

    前言:以前觉得机器学习要应用于游戏AI,还远得很. 最近看到一些资料后,突发兴致试着玩了玩Unity机器学习,才发觉机器学习占领游戏AI的可能性和趋势. Unity训练可爱柯基犬Puppo 机器学习训 ...

  5. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  6. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

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

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

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

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

  9. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

随机推荐

  1. [100]linux输入输出重定向

    一目了然版本: &号含义: 参考 参考:非常经典,值得一看,我是在linux爱好者公众号里发现的. 下面是我自己的一些总结. linux的命令数据流 在Linux下,当一个用户进程被创建的时候 ...

  2. redis基础之python连接redis(五)

    前言 前面介绍了在数据库命令行直接操作redis,现在学习使用python的redis包来操作redis,本人安装的是redis==2.10.6: 系列文章 redis安装和配置 redis命令行操作 ...

  3. Tomcat Jboss Glassfish 三种常见web容器比较

    一.缘由: 新公司平台是纯Java架构,有用到Java Web(JSP).Java 业务(EJB).Nginx..Websphere MQ.Mysql这样.大家知道java是跑在容器里的, 这里的业务 ...

  4. rabbitmq 基本信息

    两个或多个系统间需要通过定时任务来同步数据,异构系弘的不同进程间想互调用 通讯的问题,可以用rabbitmq解决.rabbitmq擅长解决多系统 异构系统音的数据交换,也可以用于系统间服务的相互调用R ...

  5. 日期时间函数(1)-time()&gmtime()&strftime()&localtime()

    ◆time() 取得当前时间.此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数.如果参数t为非空指针的话, 此函数也会将返回值存到t指针所指的内存. 成功则返回秒数 ...

  6. AI落地企业业务的一些问题

    这两年大家都在喊未来已来,软件企业不管有没有算法工程师都竖起了AI的大旗,传统企业不管现在OA现状如何都想在数据转型.智能制造.机器智能方面尝尝鲜,感觉好像和前两年的互联网+风潮有点像,最近半年我在某 ...

  7. android Button背景高度被拉伸问题--解决方案

    接入第三方SDK后,发现SDK提供的弹窗里,有两个按钮的高度呈被拉伸状态. 而,第三方提供的demo内,这两个按钮均呈正常状态. 对于第一次接触Android的菜鸟来说,这个问题颇为难解.第三方在尝试 ...

  8. java比较字符串相等

    java中String是对象类型,不能使用"=="比较.正确的用法如下: if(A.equals(B)){ //相等 }

  9. c++犯过的错

    1.可访问性(是否可用).可见性(作用域内是否存在) 2.volatile(嵌入式用的多) const 3.友元函数可以访问类的私有函数 目的 工厂方法 全局运算符 如 >> <&l ...

  10. Linux 设备模型之 (kobject、kset 和 Subsystem)(二)

    问题描写叙述:前文我们知道了/sys是包括内核和驱动的实施信息的,用户能够通过 /sys 这个接口.用户通过这个接口能够一览内核设备的全貌.本文将从Linux内核的角度来看一看这个设备模型是怎样构建的 ...