本文构建一个包含智能型敌方角色的迷宫场景。这一类角色能够搜索、追逐玩家,或者在查询到生命值恢复位置后即刻逃遁。会涉及某些AI概念,例如有限状态机(FSM)、导航网格、视线等内容。
游戏中的人工智能
本文主要讨论迷宫环境中第一人称游戏的构建过程,其中,玩家可攻击敌方角色,而敌人也可进行反击。这里,敌方角色网格基于Unity中的动画构造角色,其中包含了行走、跑动以及跳跃动画。该构造角色可搜索环境、寻找玩家,并在适当时候进行追逐或发动攻击。在其受到攻击时,此类角色可逃离现场,并在生命值较小的情况下搜索能量棒。
开始项目
首先,需要创建包含新场景的Unity空白项目,然后导入多个Unity资源包,即从Asset中选择Import Package命令,如图7-3所示。该资源包包含了Character Controller、Skyboxes以及Particles等内容。其中,Character Controller涵盖了构造网格和动画,以及第一人称控制器预制组件。
Skyboxes资源包添加了相机可查看到的天空背景,而Particles资源包则用于创建瞬移设备。
除此之外,向场景中添加第一人称控制器以及迷宫网格(该网格位于本章assets文件夹中的资源文件内),并创建光照效果以及光照贴图均会增加游戏的真实感。对应网格采用Blender这一类3D建模程序加以创建。就自身而言,上述资源数据并非是AI的核心内容,但却可生成一类具体的灰盒测试环境。
烘焙导航网格
创建完毕的敌方角色需要以某种智能方式在关卡中行走,进而可搜寻和追逐玩家,或者寻找能量棒。具体而言,由于行进途中可能存在障碍物,例如墙壁或其他游戏角色,因而AI角色不可以简单的直线形式在路点间行进。相反,AI角色应避开这一类障碍物。对此,可采用导航网格。导航网格是Unity自动生成的不可见网格数据,并近似模拟关卡中可行走的水平平面。也就是说,此类表面通常可视为地面。导航网格可定义为一种数学模型,并包含了全部所需数据,以使AI角色计算、获取某一条路径,并在必要时避开障碍物的阻拦。当生成关卡的导航网格时,可从应用菜单的Window中选择Navigation命令,这将显示Navigation Mesh选项卡,并停驻于Object Inspector中。
关于导航网格的烘焙操作,读者应留意某些细节内容,如图7-5所示。
首先,需要调整Radius项的默认值。简而言之,该项定义了围绕角色脚部的、虚构的圆形,该圆形表示为行走主体对象的近似尺寸。如果半径值过大,导航网格将会处于断裂状态;若该值过小,则网格的生成时间会过长,另外,主体对象在行进过程中可能会穿越墙壁,因此,用户需要对该值反复设置,进而获得最佳效果。针对当前示例,建议使用0.2,如前所述,如果半径值过大,导航网格在狭窄区域将会断裂,进而导致主体对象无法穿越这一缝隙,如图7-6所示。
其次,生成后的导航网格可能会凸起(相对于网格地面) ,对此,可在Advanced分组中将Height Inaccuracy %降至1,如图7-7所示,可防止角色悬停于半空中。需要注意的是,待上述设置项调整完毕后,需要重新烘焙导航网格,以使变化内容生效。
迷宫场景包含了两个独立的区域(左、右区域) ,二者间不存在相应的连接路径。对此,智能主体对象可通过瞬移方式在两部分间自由穿行。
当在导航网格中构建连接,以使AI角色在表面间获取有效路径时,可使用分离网格链接。相应地,可向关卡中添加新的网格,当角色停驻于其上时,可以此作为瞬移设备。在当前示例中,可采用包含粒子系统的标准盒体网格,但这并非必需。随后,可将分离网格组件绑定至网格对象上,如图7-8所示。
对于目标瞬移设备,可重复上述操作。针对各个瞬移设备,可将对象转换赋予分离网格组件的Start设置项中,即所选的瞬移设备作为起始点。随后,在End设置项中,可将目标转换赋予其中。这将在两个瞬移设备间构建连接,并在二者间生成路径。待连接构建完毕后,当打开Navigation面板并在编辑器中处于激活状态时,可看到场景间绘制的连接箭头,如图7-9所示。除此之外,用户还可自动生成分离网格链接。