Unity简单AI敌人

在很多游戏中都会看到,当人物进入怪物的仇恨区域时,怪物就会自动寻路到人物处进行攻击;当人物离开区域时,怪物便会停下或者继续巡逻。这就是AI的功能。最近了解到一种制作简单AI的方式,分享一下。

首先,会用到这个组件 NavMesh Agent


NavMesh Agent

Base Offset :碰撞圆柱相对于变换轴心点的偏移量
Speed:最大移动速度
Angular Speed:角速度,即转向的速度
Acceleration:最大加速度
Stopping Distance:停止距离,即距离物体多远停止
Auto Braking:自动减速,启用此选项时,当人物将要到达目的地时将会减速。
Radius:半径
Height:高度
Quality : 躲避的水平,一般我们选默认的High Quality就行了
Priority :躲避优先级

将此组件添加到相应的怪物身上,在场景中创建一个平面,将平面设置为Navigation Static然后打开Navigation进行烘焙(如果没有Navigation可以在Window里面找到)


Navigation

接下来便可以在怪物的身上添加脚本了,首先定义个枚举类型,将需要的动作都存入其中,并将初始状态设置为idle

 
    public enum EnemyState
    {
        idle,
        run,
        attack,
        death
    }
 public EnemyState CurrentState = EnemyState.idle;

在start中初始化参数,获取怪物身上的动画组件,寻路组件,以及要追击的玩家

void Start()
    {
        _animator = GetComponent();
        agent = GetComponent();
        Player = GameObject.FindWithTag("Player").transform;
    }

我们要时刻判断玩家是否在怪物的仇恨区域内,所以状态转换写在在Update中

我们根据距离来判断,所以第一步要获取怪物与玩家之间的距离

float distance = Vector3.Distance(Player.position, transform.position);
  • 如果怪物和玩家的距离大于10,则怪物停留在原地或者继续巡逻
  • 如果距离在2到10之间,则怪物将会追击玩家
  • 如果距离小于2,则怪物便攻击玩家
    用switch语句来进行状态切换
 switch (CurrentState)
        {
            case EnemyState.idle:
                if (distance > 2 && distance <= 10)
                {
                    CurrentState = EnemyState.run;
                }
                if (distance < 2 )
                {
                    CurrentState = EnemyState.attack;
                }
                _animator.Play("Idle");
                agent.isStopped = true;
                break;
            case EnemyState.run:
                if (distance > 10)
                {
                    CurrentState = EnemyState.idle;
                }
                if (distance < 2 )
                {
                    CurrentState = EnemyState.attack;
                }
                _animator.Play("Run");
                agent.isStopped = false;
                agent.SetDestination(Player.position);
                break;
                ......

这两段代码通俗易懂,仅仅是当怪物处于何种状态是便播放相应的动画,在这个阶段中,如果怪物与玩家的距离发生了变化,则就会立刻改变怪物当前的状态。

运行测试
AI.gif

你可能感兴趣的:(Unity简单AI敌人)