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

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



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

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

有限状态机

      有限状态机是指有限个状态以及在这些状态之间转移和动作的数学模型,现在以一个游戏场景为例,假定电脑操作的Object(此处以坦克为例)会有以下行为。
  1. 坦克会在场景中巡逻
  2. 若坦克发现敌人。则靠近敌人并向敌人射击。
  3. 若hp(生命值)降低到一定程度,则设法逃跑。

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
     基于上述的两层状态机,就可以实现简单的敌人AI了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值