tps(第三人称射击游戏) 3.敌人&简单AI

NavMeshAgent m_agent;
m_agent = gameObject.GetComponent<NavMeshAgent>();

首先初始化一个NavMeshAgent组件

void FindTarget()
 {
        m_agent.SetDestination(m_player.my_transform.position);

        float speed = m_moveSpeed * Time.deltaTime;
        m_agent.Move(m_transform.TransformDirection(new Vector3(0, 0, speed)));

  }

让敌人寻找角色的位置并移动

if(!m_anim.isPlaying)
     FindTarget();
if (Vector3.Distance(m_transform.position, m_player.my_transform.position)<=atkdis)
{

    m_agent.SetDestination(m_transform.position);
    Atk();
}

如果敌人的攻击动画不在播放即在走路就寻找角色,如果角色的位置在攻击距离之内,就停止寻路(把寻路目标设为自己),并攻击;

void Atk()
    {
        m_anim.Play("zombie_atk");

        Invoke("AtkJudge", 1f);
        Invoke("StopAtk", 2f);

    }

调用攻击函数,播放攻击动画,并延时1s对还在敌人攻击范围内的角色造成伤害, 攻击动画持续2s后停止。

void AtkJudge()
    {
        if (IsInArea())
        {
            m_player.SendMessage("ApplyDamage", 10);
            m_player.transform.position += m_transform.forward * atkback_dis;
        }
    }

如果角色在攻击范围内就收到伤害,sendmessage给角色控制的脚本中的ApplyDamage 函数
并且击退主角。

void StopAtk()
    { 
        m_anim.Stop();      
        FindTarget();
    }

停止攻击后,停止播放动画,并重新寻找角色的位置。

 bool IsInArea()
    {
        float angle = Vector3.Angle(m_transform.forward,m_player.transform.position-m_transform.position);
        if (Vector3.Distance(m_transform.position, m_player.my_transform.position) <= damagedis&&angle<=60)
        {
            return true;
        }
        else
            return false;

    }

判断角色是否在攻击范围内,angle为角色与敌人的角度,只要角度与距离均满足,角色就在攻击范围中。

注意:NavMeshAgent只有地形被烘培过才能使用(window-》navigation-》bake)bake后地面呈蓝色

而且需要把NavMeshAgent组件调整好,罩住需要寻路的部分,不然只有一个脑袋在地上找人。

猜你喜欢

转载自blog.csdn.net/qq_38105943/article/details/78577846
今日推荐