浅析游戏AI行为与设计思想

目录

  • 游戏人工智能简述
  • 游戏AI与其他行业AI的区别
  • 行为AI的主要实现方式
    • 行为树
    • 有限状态机
    • 分层有限状态机
    • 目标导向
  • 行为AI设计思想
    • ECA思想
    • 行为树黑板数据思想
  • 总结

游戏人工智能简述

游戏AI十分常见,从小时候玩的五子棋人机对战再到现在大型游戏中的各种仿真AI,例如追逐战中追着我们不放的怪物、游戏中天空的鸟群以及能够与玩家做出交互的NPC。游戏的AI随着时代不停地在发展,近期随着ChatGPT大语言模型的兴起,游戏的AI有了更加前沿的探索。不过,在目前的游戏中,我们常说的AI还是偏向于工业AI,并非学术上典型的AI。所以本文将详细讨论游戏工业中的AI。

游戏AI与其他行业AI的区别

游戏AI与其他行业所说的AI最主要最核心的区别在于:游戏AI的设计目的是用于服务游戏玩家,通过AI给予玩家尽可能好的游戏体验,而不是以打败玩家为目的。所以在游戏AI设计的时候,需要满足合理性和公平性。比如玩家如果不在怪物的视野内,那怪物不应该攻击玩家,在难度上需合理调配,不能过于简单或困难,不然可能会造成玩家没有成就感。

行为AI的主要实现方式

目前,工业派游戏AI(Industry AI)的实现方式主要分为以下两个大类:

  • 通用AI(Decision Making, Agent based AI)

    • 行为树(Behavior Tree)

    • 目标导向(Goal Oriented Action Planning, GOAP)

    • 有限状态机(Finite State Machine, FSM或HFSM)

  • 非通用AI

    • 转向行为(Steer Behavior)

    • 程序化生成(Procedural Content Generation, PCG)

    • 寻路(Path Finding)

    • 群组(Group)

行为树

行为树(Behavior Tree,BT)可以抽象为树状的数据结构,由一系列的节点组成,这些节点描述了角色在不同情况下应该采取的行动。从根节点开始,每个节点都代表了一个行为或决策,每个节点都能够拥有自己的子节点,并且每个节点都会有一个先决条件。当一个AI行为发生时,会从根部开始进行遍历,检查每一个先决条件,满足条件的节点会继续遍历执行它的子节点。如果一个节点的先决条件不满足,则会立即跳过它的子节点,转而判断它的兄弟节点,直到整棵树遍历完成,再回到根节点进行下一轮遍历。

以塞尔达游戏中的怪物为例,AI模拟如下图所示:

图片1.png

有限状态机

有限状态机(Finite State Machine,FSM)能够将游戏内AI的各类行为抽象为不同的状态,通过事件能将不同的状态进行连接,组成一个状态机。在事件发生时,不同状态之间能够进行相互转换。 有限状态机图示:

图片2.png

有限状态机的优点是对于相对简单的行为和状态转换时非常直观和易于理解。代码能够很方便地进行封装并复用,能够大大降低程序工作量。举个简单的代码例子:

StateMachine.java

class StateMachine
{
  private State stateCurrent;
  public void tick(long delta)
  {
    if(stateCurrent != null) {stateCurrent.tick(delta);}
  }

  public void changeState(State stateNew)
  {
    if(stateCurrent != null) {stateCurrent.exit();}
    stateCurrent = stateNew;
    if(stateCurrent != null) {stateCurrent.enter();}
  }
}

State.java

class State
{
  public void tick(long delta) {}
  public void enter() {}
  public void exit() {}
}

另外地,有限状态机有个经典设计:1P+3E,即:Precondition(先决条件)、Enter(进入的事件)、Execute(执行)、Exit(退出)。比如NPC的开门动作,在开门和关门前有一个先决条件Precondition,条件满足发布一个Enter事件,进门后的相关操作为Execute,最后执行完成后关门Exit。

分层有限状态机

分层有限状态机(Hierarchy-FSM,HFSM)是有限状态机的升级版,能够处理更为复杂的NPC行为逻辑。

图片3.png

分层有限状态机中的每个状态都可以包含多个子状态,而子状态仅能够在当前层中切换,不能在不同层之间切换。

分层有限状态机一般分为以下几种层面:

  • 顶层状态:顶层状态是分层有限状态机的最高层,通常表示对象的主要状态,每个顶层状态可以包含子状态或子状态机。

  • n中间层状态:中间层状态是顶层状态的子状态,用于进一步细化对象的行为。它们可以有自己的子状态或子状态机,从而形成嵌套的结构。

  • 基本状态:基本状态是中间层状态或顶层状态的最低层状态,表示最具体的行为。它们通常是无法进一步分解的状态。

举个例子,当顶层状态是怪物的行为时,中间层状态则可设计为:怪物追击玩家,再分解为基本状态为:怪物移动;怪物攻击。 中间层可以继续拓展,例如怪物巡逻,分解为基本状态为:怪物在营地范围内巡逻;怪物超出营地范围,返回营地。这里同样以塞尔达为例画图:

图片4.png

目标导向

目标导向即以最终目标为导向,将过程分解为多个小目标,并按照路径进行寻路,找出一个最优解。目标导向的方式很符合人类的思维习惯,理解起来十分容易。在合成类游戏中,目标导向的方式十分常见。例如Minecraft我的世界游戏中,一个原木可以合成4个木板,1个木板合成2根木棍,2根木棍加三个木板可以合成1根木镐。在这个过程中,如果需要自动合成,AI会判定玩家背包里是否有上述的物品,如果有就不会进行重复合成,即最终保证一条最短的路径来达成目标。

行为AI设计思想

行为AI是一种和游戏类型无关、和前后端无关、和功能无关的思维模式。

ECA思想

例如上文所述的状态机,基于事件驱动的分层状态机就是一种设计思想,可以抽象为:AiEvent(事件)、IChecker(检查器,也就是决策)、IAction(执行的行为)。它们共同组成一个行为单元(AiCell)。

图片5.png

完整的状态机:

图片6.png

行为树黑板数据思想

黑板(Blackboard)是一种数据集中式的设计模式,一般用于多模块间的数据共享。黑板数据是AiState、AiCell之间用来共享数据的一个数据结构。在行为树中,黑板十分适合作为行为树的辅助模块。每个行为AI组件拥有独立的黑板数据,并将黑板数据分成3个作用域:

  • Global:全局作用域,不会自动删除
  • AiGroup:切换行为AI(状态机)时该作用域销毁
  • AiState:切换行为状态(状态)时销毁

举个例子:在怪物追击玩家的过程中,玩家的数据位于全局作用域中,怪物可以根据这个数据做出是否追击玩家的决策,而追击的过程数据可以位于AiGroup状态机中,状态机切换时,这个作用域的数据也会销毁。最后是行为,行为数据存储在AiState中,会随着切换行为数据而销毁。

总结

游戏AI的最终目的是提升玩家的游戏体验,并不是为了“炫技”或者打败玩家而生,游戏AI设计时应考虑设计成本,不宜过于复杂。并且AI的引入需要合理,保证不会破坏游戏的公平性。最后,随着AIGC时代的到来,游戏的AI的行为可能会逐步趋向智能化,我们不妨大胆地期待。

人工智能游戏服务器
2025 © Yeliheng的技术小站 版权所有