前言:
本章讲解了敌人AI的基础编写方法、结构设计以及导航组件的使用,这里打算根据我自己的需求来对AI功能进行修改和简化。
有限状态机人工智能:
在简单敌人AI中,将敌人的状态分为几个主要模式,普通巡逻、发现敌人后的攻击模式等,简单的状态可以通过ifelse语句来实现,复杂的情况则需要考虑设计模式。
现在暂时对敌人AI添加普通巡逻状态和发现玩家后的攻击状态
普通巡逻状态:
敌人在一定范围内随机移动。首先获取初始位置,随机在初始位置周围设置一个点,敌人走向设置的点,当敌人走到了设置的点后重新随机另一个点,敌人继续移动循环。
攻击状态:
当玩家进入敌人攻击范围时,停止随机移动,并且向玩家发射子弹。设计和编写此状态包含了查找物体以及创建预制体的内容。
寻路:
手动编写寻路方法:
定义路径点:可以用列表或者数组存储多个路径点,让敌人根据路径点进行移动。
设置移动方法:跟之前的随机移动类似,将随机的目标点改成路径点即可。
注:使用transform.childCount可以获得子物体数量
使用GetChild(index)可以按序号获取子物体(这个序号与层级界面中的排序有关)
使用NavMesh自动寻路:
文中也是简单介绍了一下,现在版本更新之后也不知道更改了多少方法,所以简单尝试一下暂时不用到项目里。
行为决策:
主要是定义敌人AI中状态如何转变,比如:
当玩家进入敌人周围一定范围时转变为攻击状态,玩家离开一定时间后恢复待机状态等,简单的行为转换使用ifelse语句即可实现,复杂的行为决策有专门的行为树插件提供解决方案,使用行为树能够构建诸如Boss战之类的敌人AI。
战场系统(单例模式游戏管理器)
文中通过单例模式的脚本来实现游戏的规则,这里就将这部分内容简化为单例模式的应用。
每个游戏都应该有一个GameManager,用于控制游戏的基本内容。
设置单例:
以及使用DontDestoryOnload来让游戏管理器在场景变更时不被销毁,保证场景里存在并且只有一个游戏管理器。
用简单的方法使用单例模式:
注册玩家,让其他脚本能够方便的获取玩家对象。
显示关卡时间、获取关卡内敌人数量、出生点等全局信息
判断玩家状态,确认失败或者胜利条件等。
总结:
文中以构建一个完整的大战场坦克游戏为模板进行开发,由于开发水平限制和时间限制,打算以其他简单休闲游戏模式来代替,因此上面的部分已完成内容可能会被更改,敌人AI等内容也会被简化。