Unity学习简易单人FPS开发——AI实现(部分)

关于Crieria项目AI的实现

步骤一:敌方AI的生成与触发

    关于敌方目标的生成采用随机布局与触发点生成——在每一次玩家初始化(读档,开始游戏,死亡)时,规定数量的AI单位自动刷新在固定区域的随机位置上;特定巡逻单位在固定位置刷新并赋予巡逻位点与侦测半径。固定AI主要起环境的作用,巡逻AI在充当环境体的同时兼具触发器开关。这是初始化随机布局的形式

     关于触发AI生成的机制,大体分为两种:剧情触发,条件触发。剧情触发因素由Controller控制,在一定触发条件下Controller中的相关bool值改变,bool值作用于其场景内的AI出现点进行AI生成,在剧情走向结束后或初始化后bool值归位AI停止生成。也可以在controller中加入AI种类变化的选项来进行多样化的生成机制;条件触发种类较多,一般用于衔接剧情与游戏时间推展方向使用。多用于地形遭遇战,环境遭遇战,特殊情况遭遇战。触发点为碰撞触发或者是条件触发 :狭窄地形触发器会产生数个AI触发后Destory;区域触发进入触发持续产生AI离开区域后触发结束并Destory;巡逻探测到后条件触发持续产生AI,触发巡逻被消灭后触发结束。

Unity具体实列(Unity炸了之后补)。

步骤二:自动寻路设置与敌对AI交互机制

Unity NavMesh的设定,Unity自带有自动寻路的组件而且功能齐全:(以下为官方文档中对导航系统的描述)

 

导航系统允许您创建可以导航游戏世界的角色。它让你的角色能够理解他们需要走楼梯才能到达二楼,或跳过一条沟。Unity NavMesh
系统由以下部分组成:

  • NavMesh(导航网格的简称)是一种数据结构,它描述了游戏世界的可行走表面,并允许在游戏世界中找到从一个可步行位置到另一个可步行位置的路径。数据结构是从您的关卡几何体自动构建或烘焙的。
  • NavMesh Agent 组件
     GameObject 帮助您创建在朝着目标前进时避开彼此的角色。代理商使用NavMesh了解游戏世界,他们知道如何避免彼此以及移动障碍。
  • Off-Mesh Link组件允许您合并使用可行走表面无法表示的导航快捷方式。例如,跳过沟渠或围栏,或在走过它之前打开门,可以全部描述为离网链接。
  • NavMeshAgent组件允许您描述代理在导航世界时应避免的移动障碍。由物理系统控制的枪管或箱子是障碍物的一个很好的例子。虽然障碍物正在移动,但是特工尽力避免它,但是一旦障碍物变得静止,它将在导航网中雕刻一个洞,以便代理人可以改变他们的路径以绕过它,或者如果固定的障碍物阻挡了路径方式,代理可以找到不同的路线。

导航主要由边界,障碍,网络和锚点组成以实现对AI的导航作用。其设置主要考虑场景建模与玩家的预设定路线有关,AI在前往玩家位置时的不同路径与适当的AI掩体,同时考虑其出生点的位置与到玩家的路径。

状态切换与动画的源码:(未优化

public class EnemyControler : MonoBehaviour
{   
    /// 
    /// 敌方移动速度
    /// 
    public float MoveSpeed = 3.0f;
    /// 
    /// 状态变量(int)
    /// 
    public int StateNum;
    /// 
    /// 开火冷却
    /// 
    public int ShootTimes=3;
    /// 
    /// 走动距离变量
    /// 
    public float WalkRange = 20f;
    /// 
    /// 跑动距离变量
    /// 
    public float RushRange = 30f;
    /// 
    /// 开火距离变量
    /// 
    public float ShootRange = 10f;
    /// 
    /// 确定Player目标
    /// 
    public  GameObject Player;
    /// 
    /// 储存Player与Enemy的位置信息
    /// 
    private Vector3 transPlayer;
    private Vector3 transEnemy;
    /// 
    /// 当前距离
    /// 
    public float Range;
    bool isAlive;//判断Player是否存货
    public Animator idem;
   

    void Start()
    {
        StateNum = 1;//初始化StateNum

 
        

    }
    
    void FixedUpdate()
    {
        //isAlive = Player.GetComponent().isplayeralive;       //确认Player存活
        WalkRange = RushRange - ShootRange;
        transEnemy = transform.position;
        transPlayer = Player.transform.position;
        Range = Vector3.Distance(transPlayer, transEnemy);      //测距
      //  if (isalive)
      //   {
            if (Range > ShootRange && Range <= RushRange)       //状态切换
            {
                StateNum = 3;
            idem.SetInteger("State", 3);
            }
            if (Range > RushRange)
            {
       
                StateNum = 4;
            idem.SetInteger("State", 4);
            idem.SetBool("isrunning",true);

            }
            if (Range <= ShootRange)
            {
                StateNum = 5;
                idem.SetInteger("State", 5);

        }

        //  }
        // else
        // {
        // StateNum = 1;
        // }
       
            }
    void EnemyWalk()
    {

    }
    void EnemyRun()
    {

    }
    void EnemyCross()
    {

    }

    void EnemyFire()
    {
     
        for(int i = 0; i < ShootTimes - 1; i++)
        {
            EnemyShoot();
        }
    }
    void Eliminate()
    {

    }
    void EnemyShoot()
    {

    }
 
    private void OnCollisionEnter(Collision collision)
    {
        
    }

}

你可能感兴趣的:(Unity学习简易单人FPS开发——AI实现(部分))