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组件调整好,罩住需要寻路的部分,不然只有一个脑袋在地上找人。