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. VS15 Visual Assist X破解

    Visual Assist X是一款非常好的Microsoft Visual Studio插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,Visual Assi ...

  2. 内网IP和外网IP

    1.什么是内网内网就是局域网,比如一个公司的局域网,局域网内每台计算机的IP地址是互异的,但不同局域网内的IP是可以相同的.2.什么是外网外网就是互联网,内网的所有计算机都是连接到一个外网IP,通过外 ...

  3. 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)

    .中断方式获取按键值 单片机: )按键按下 )cup发生中断,跳转到异常向量入口执行 )b 函数 a.保存被中断的现场 b.执行中断处理函数 c.恢复 linux: )trap_init()函数构造异 ...

  4. java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性

    同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...

  5. 路径重写,适用于laravel,yii

    <IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule& ...

  6. 【C#】往异步下载的方法传递自定义完成事件

    封装自定义的异步下载方法时,正常情况下是这样的: /// <summary> /// 异步方法:联网下载文件,保存到本地. /// </summary> /// <par ...

  7. http://blog.csdn.net/ce123_zhouwei/article/details/7364294

    http://blog.csdn.net/ce123_zhouwei/article/details/7364294

  8. error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invoke_main(void)”中被引用

    一,问题描述 MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invo ...

  9. Apache HttpComponents 如何在正常结束前中止一个HTTP请求

    package org.apache.http.examples.client; import org.apache.http.HttpEntity; import org.apache.http.H ...

  10. UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机

    /** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...