这两天可把我愁死,明明是一个很简单的问题,没有去了解基础实质,只想着快点做完果然很耽误事,也是把解决办法分享出来,办法很low欢迎交流。
哪个物体需要寻路就在哪个物体上加一个Nav Mesh Agent组件,主要介绍一下steering下的参数,一个是寻路速度,最大的加速度,角速度,以及制动距离。这几个参数可以让你的寻路更加的圆滑,推荐大家自己去调的时候用一下。
使用前需要对场景先进行烘焙
在“Window”-“Navigation”,打开“Navigation”窗口
选中你选则不允许通过的地方,例如我场景中的栏杆等,在选上你可以通过的地方,,在“Navigation”里选中“Bake”面板进行烘焙
如果不做跳跃的话,Generate offMeshLinks是不用勾选的。
然后就是代码部分了(代码写在你需要寻路的物体上)
private NavMeshAgent man;
public Transform target;
首先要定义一个NavMeshAgent的变量出来,还有一个目标点的变量。
man = gameObject.GetComponent<NavMeshAgent>();
在start函数中为这个变量赋值,
IEnumerator AINavMesh()
{
while (true)
{
if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) > 5f)
{
man.SetDestination(target.position);
transform.GetComponent<Animation>().Play("run");//播放角色行走动画
//启用血条脚本
gameObject.GetComponent<npc>().enabled = true;
mage.gameObject.GetComponent<jianke>().enabled = true;
//() transform.LookAt(mage.transform);没意义
yield return StartCoroutine(AIFollowHero());
}
}
}
IEnumerator AIFollowHero()
{
while (true)
{
/* if (mage != null)
{
transform.LookAt(mage.transform);
transform.GetComponent<Animation>().Play("run");//播放角色跑动画
Vector3 dir = mage.transform.position - transform.position;
transform.Translate(dir.normalized * Time.deltaTime * speed * 0.8f, Space.World);
}
*/
transform.GetComponent<Animation>().Play("run");
if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) <= 1.5f)
{
// transform.LookAt(mage.transform);
man.isStopped = true;
transform.GetComponent<Animation>().Play("attack");
qiang.GetComponent<MeshCollider>().enabled = true;
i = 1;
yield return new WaitForSeconds(2f);
}
else if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) > 1.5f)
{
//transform.LookAt(mage.transform);
// transform.GetComponent<Animation>().Play("run");//播放角色跑动画
man.isStopped=false;
man.SetDestination(target.position);
}
transform.LookAt(mage.transform);
yield return new WaitForEndOfFrame();
}
}
直接说第二个协程,这里其实是一个距离判断,到了主角身边时要停止寻路,不然会一直撞上主角,因为它其实一直想走到主角脚下踩得位置,从而很违和,当主角远离它时,要把停止关闭,并重新设置主角当前位置为目标点,不然小兵不会刷新目标位置。
这里的man.isStopped是某个版本之后更改的API,之前应该是man.Stop();关闭,man.Resume();开启。当然,还存在着很多例如清除当前路径等等函数,这个对应自己需求去查API即可,网上还有很多教程,寻路的时候还可以实现MOBA游戏那样三路小兵各自走不同路线等等方案。