Unity3D中基于有限状态机的人工智能

  • 基于有限状态机的人工智能
  • 有限状态机
  • 分层有限状态机




        若游戏中不仅有玩家控制的Object,也有电脑控制的Object(通过电脑控制场景中物体的自由运动),此时便涉及到人工智能。人工智能常用的算法有很多,包括有限状态机、模糊逻辑、决策树、专家系统、神经网络和遗传等,更涉及到大数据和机器学习等领域。游戏中的人工智能设计遵循着一定的规律。


基于有限状态机的人工智能

有限状态机


      有限状态机是指有限个状态以及在这些状态之间转移和动作的数学模型,现在以一个游戏场景为例,假定电脑操作的Object(此处以坦克为例)会有以下行为。

  1. 坦克会在场景中巡逻
  2. 若坦克发现敌人。则靠近敌人并向敌人射击。
  3. 若hp(生命值)降低到一定程度,则设法逃跑。

       根据上述行为,可以设计如图所示的状态装转换图。坦克有逻辑、进攻和逃跑三种状态,在逻辑状态下,如果发现了敌人(敌人出现在坦克的视角范围内)则会变成进攻状态;在进攻状态下,如果丢失了目标(目标被摧毁或离开视角范围)则会回到巡逻状态;交战过程中,如果坦克的hp(生命值)小于指定值,则逃跑,直到远离目标继续巡逻。

unity 机器人仿真使用什么关节 unity3d机器人_状态机



        如果不考虑设计模式,状态机可以简单地用ifelse语句来实现。有限状态机的特点是输出(转换的状态)只由当前状态和输入(满足的条件)来确定,有着明显的逻辑关系,代码结构如下:

void Update()
    {
        target = 搜寻目标();
        if (坦克状态 == 巡逻)
        {
            if (target != null)
                坦克状态 = 进攻;
            else
                处理巡逻状态();
        }
        else if (坦克状态 == 进攻)
        {
            if (target == null)
                坦克状态 = 巡逻;
            else if (tank.hp < 30) 坦克状态 = 逃跑;
            else 处理进攻状态();
        }
        else if(坦克状态 == 逃跑)
        {
            if (target == null || 远离(target))
                坦克状态 = 巡逻;
            else
                处理逃跑状态();
        }
    }

分层有限状态机

     上述状态机定义了坦克巡逻、进攻和逃跑三项策略,并规定了切换策略的条件。然而状态机并没有告诉坦克在各种状态下应该做什么事情,比如:巡逻状态下怎样走到指定的位置,进攻状态下又该怎样靠近敌人,炮塔如何瞄准对手等,这便涉及了第二层状态机。以进攻以进攻状态为例,坦克要处理移动和开炮两件事情。

  1. 移动到敌人面前
  2. 炮塔对准敌人并适时开炮。
    单看“移动”这一项,至少会涉及“未到达目的地”和“到达目的地”两种状态。若坦克处于“未到达”状态,它将继续前进,直到靠近目的地切换为“到达目的地”状态为止。“开炮”一项也至少会涉及“未对准”和“对准”两种状态,如果坦克处于“未对准”状态,炮塔将朝着敌人方向旋转,直到对准敌人切换为“对准状态”为止;若为“对准状态”,它将不断发射炮弹。当敌人的位置发生变化时,坦克将再次切换为“未对准状态”。下图展示了进攻状态下的第二层状态机。

unity 机器人仿真使用什么关节 unity3d机器人_人工智能_02

     如同进攻状态,巡逻和逃跑也对应着“炮塔状态机”和“移动状态机”两种情形(见下图)。每一层状态机相互独立,负责自己的功能。例如,当坦克处于进攻状态时,“处理进攻状态的方法”只需要告知“移动状态机”目的地的坐标即可,至于怎样移动到目的地则由“移动状态机”全权负责。

unity 机器人仿真使用什么关节 unity3d机器人_人工智能_03


     基于上述的两层状态机,就可以实现简单的敌人AI了。