zoukankan      html  css  js  c++  java
  • 做游戏长知识------基于行为树与状态机的游戏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

    
    
  • 相关阅读:
    [PHP] PHP 7.4.4错误修复版本的更改日志
    [Linux] 协程是不是我想的这样
    [前端] 代码中执行绑定元素的指定事件trigger方法
    [PHP] 中英双语网站的设计思路
    [网络] 使用wireshark抓包数据
    [MySQL] 有没有解决幻读问题
    [PHP] PDO 提供了三种不同的错误处理模式
    [Linux] 使用vmstat查看系统的负载情况
    [MySQL] innoDB引擎的主键与聚簇索引
    [PHP] 检测文件是否有病毒的实现逻辑
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7324560.html
Copyright © 2011-2022 走看看