qq875871130 / INTO_GameAI

Game AI System Study Project

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

简单AI行为样例,基于状态机

Github: Game AI System Study Project (github.com)

概述

本项目AI状态机设计理念基于毕设项目 PowCool VR ,并将其中耦合了角色动画/武器的行为简化(移动、射击、瞄准),使用Odin重构了原有的Editor重写设置,并优化了状态机的Map管理方式,实现了具有闲置、巡逻、追逐、攻击、死亡、休眠状态的简单胶囊体角色的AI行为控制。

场景设定

项目样例场景做了一个3v3的简单AI团体对抗,并布置了一个简易的三路对战地图。两队Ai角色(BlackTeam & WhiteTeam)分别从左下、右上角出发,队员分别从上、中、下路三个路线开始巡逻。二队人马巡逻途中将会遭遇,并开始追逐、攻击,直至一队将另一队人员消灭为止。

此外还引入了一个2人组成的“清道夫”队伍(Scavenger),剔除了死亡状态,引入了预设30秒休眠的初始状态。用于在场景开始的一段时间后开始对场景清场,即全图巡逻、同时消灭两个队伍。

该场景设定仅为全方位展示Ai行为模拟的全过程。

AI行为

在介绍AI行为之前,有必要了解AI角色目前的配置情况:

  1. 一个简单的敌我探测系统,引入了扫描角度、半径,从而模拟了一个扇形扫描区域(可在AiCharacterController中的Gizmos部分进行可视化调试)。其中分为两个角度相同、半径不同的扇形区域:攻击区域(Attack Range)和视野区域(Sight Range),攻击半径<视野半径。
  2. 两个用于状态指示的立方体部件,也用于充当视线扫描(以下使用Eyes)和射击(以下使用Shooter)的位置指示。当AI角色状态切换时,这些部件会通过材质替换来变换颜色。
  3. 简单的健康值系统。
  4. 简单的射击系统。

AI主要模拟闲置(Idle)、巡逻(Patrol)、追逐(Chase)、攻击(Attack)四种行为状态,并按照如图所示条件进行状态转移,此外还引入了死亡和休眠两个额外状态:

State Relationship

闲置状态:Eyes置灰色,按照状态预设的闲置时间进行倒计时,结束后切换为巡逻状态。

巡逻状态:Eyes置绿色,按照预设巡逻点Point和速度进行循环定点移动。

追逐状态:角色发现敌人,位于视线区域内、攻击区域外时追逐,Eyes置红色,并按照预设追逐速度向敌人的实时位置移动。

攻击状态:角色发现敌人并在可攻击范围内开始攻击,Eyes和Shooter置红色,实时朝向敌人方向并发射炮弹造成伤害。

死亡状态:角色血量清空时死亡,Eyes置白,胶囊体置灰,并在预设时间后销毁对象。

休眠状态:可用于角色初始状态,用于为角色计时,预设计时结束后切换到闲置状态,以开始AI行为。

实现思路

  1. 状态机实现:项目的状态机模块分为状态(State抽象类及其派生状态类)、状态管理器(State Manager)和状态图(StateMap),它们的关系如下:

StateMachine Implement

其中,State作为抽象类被各具体状态派生,用于为各派生状态设置特定预设参数,运行时执行的行为操作以及按照现有条件返回下一需要切换的状态。

StateManager维护一个存放状态键和状态对象的字典StateMap,并绑定AiCharacterController,用于为各状态提供角色数据和行为执行的接口,桥接状态间通信、切换和运行。

  1. 敌我探测:主要使用Unity物理系统的CheckSphere,OverlapShere,Raycast,并结合了引入的扇形区角度、半径和LayerMask做了一些区域限制和障碍物剔除。
  2. 战斗系统:主要是射击和健康系统,射击部分将发射器(Shooter)与投射物(Bullet/Projectile)解耦,做了一些简单的多态,结合了计时和预制体实例化让发射器支持投射物、射速设置,投射物支持简单的生命周期,并利用了Unity的新消息系统,将投射物伤害反馈到健康系统上。
  3. 寻路:Unity原生的新Ai Navigation系统,做了一些简单的Surface和Modifier调整。
  4. 可视化调试:场景部分采用原生Gizmos实现Ai探测区域和敌人识别可视化,对巡逻点也做了可视化处理;编辑器部分使用Odin做了一些参数分组,做了一些参数监视,以及在StateManager中实现的批量挂载对象生成。

缺陷与应对

  1. 状态切换逻辑需要硬编码,缺乏灵活性。后续考虑利用Odin做类Unity动画状态机风格的节点式编辑器。
  2. 敌我识别精确性不足,视野判断会被错误的敌人选定影响而失灵。需要优化探测逻辑,完善目标选定优先级和条件限制。
  3. AI行为复杂度不够。时间条件限制,后续会从逃离、请求支援着手,扩展AI团队广播、寻路点选取功能,在此之前可能需要1.部分功能落地。

About

Game AI System Study Project

License:MIT License


Languages

Language:C# 100.0%