本节书摘来自华章出版社《Unity 3D人工智能编程》一 书中的第2章,第2.5节,作者:(美)基奥(Kyaw,A.S.),(美)彼得斯(Peters,C.),(美)斯瑞(Swe,T.N.),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.5 敌方坦克的人工智能
现在来看一下敌方坦克的人工智能的代码。把我们的类称为SimpleFSM,这个类继承自我们的有限状态机抽象类。
SimpleFSM.cs 文件中的代码如下所示:
在这里我们声明了几个新的变量。敌方坦克的人工智能将会有4个不同的状态:巡逻、追逐、攻击和死亡。大体上,我们将实现的有限状态机是第1章中所描述的例子。
敌方坦克人工智能的有限状态机
在初始化方法中,我们建立了敌方人工智能坦克的属性默认值。然后,我们在局部变量中存储了航点的位置。我们通过FindGameObjectsWithTag方法,试着找到这些具有WandarPoint标签的对象,最终得到场景中的这些航点。
在每一帧中都会被调用的update方法如下所示:
我们检查当前状态,然后调用相应的状态方法。一旦发现对象的生命值为0或小于0时,我们就会把坦克状态设为死亡。
2.5.1 巡逻状态
当我们的坦克在巡逻状态时,我们会检查它是否已达到目标点。如果是,它就会寻找下一个要跟随的目标点。FindNextPoint方法主要是从所定义的航点中选择下一个随机目标点。如果它在向当前目标点前进的路上,它会检查与玩家坦克的距离。如果与玩家坦克的距离在一定范围内(在这里是300),它就会更改为追逐状态。代码的其余部分只实现旋转和向前移动坦克。
2.5.2 追逐状态
同样,当坦克处于追逐状态时,它会检查自己与玩家坦克的距离。如果距离足够近,那么它就会切换到攻击状态。如果玩家坦克已经跑得太远了,那么它就会切回巡逻状态。
2.5.3 攻击状态
如果玩家坦克足够接近攻击敌方人工智能坦克,那么敌方坦克就会向玩家坦克旋转炮塔,然后开始射击。如果玩家坦克超出范围,那么它会切回巡逻状态。
2.5.4 死亡状态
如果坦克到达死亡状态,那么我们将会让它爆炸。
这是一个很小但却能够给出一个漂亮爆炸效果的函数。我们只需应用一个ExplosionForce到我们的刚体组件,并增加一些随机的方向即可,其代码如下:
进行伤害
如果我们的坦克被一颗子弹击中,它的生命值属性将会基于子弹对象的伤害值相应地减少。
在Unity中打开SimpleFSM.scene,就可以看到人工智能坦克巡逻、追逐和进攻玩家。我们的玩家坦克不会受到人工智能坦克的伤害,所以它永远不会被摧毁。但是人工智能坦克有生命值,并承担由玩家的子弹造成的损害。所以,一旦它们的生命值属性值变成零,你就会看到它们爆炸。