您的位置:首页 > 大数据 > 人工智能

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

2017-11-19 22:25 423 查看
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组件调整好,罩住需要寻路的部分,不然只有一个脑袋在地上找人。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐