Unity使用导航 生成网格之后,用NavMeshAgent控制AI追逐玩家,因为玩家控制的角色处于网格范围之内,在AI移动的过程中玩家可以无视碰撞穿过AI。
这个问题有很多解决方法,比如禁用掉NavMeshAgent的控制,只提供运动的方向和速度,改用脚本控制AI的移动。也可一用插件动态烘培网格。但是就是想偷懒嘛,所以用了个简单的方法解决的此问题。
因为发现拥有NavMeshAgent的游戏物体是会互相计算碰撞的,所以在玩家身上添加个NavMeshAgent就能解决此问题:
以下代码是AI的寻路方法,在距离玩家3米的时候停下来攻击,大于3米时追逐。另外要判断一下AI是否在OffMeshLink的状态,总不能让AI在空中突然停住吧~~
private void Move()
{
Target = GameObject.Find("Player").transform.position;
if ((transform.position - target).magnitude <= 3 && !nav.isOnOffMeshLink)
{
if (!nav.isStopped)
nav.isStopped = true;
Attack();
}
else
{
if (nav.isStopped)
nav.isStopped = false;
nav.SetDestination(target);
}
}
以下代码是玩家的脚本,我做的是FPS游戏,玩家移动有自己的脚本控制,所以在游戏开始时需要禁用NavMeshAgent的更新:
NavMeshAgent nav;
private void Start ()
{
nav = GetComponent<NavMeshAgent>();
nav.updatePosition = false;
nav.updateRotation = false;
}
目前不知道这样做有没有什么问题,如有更好的办法,还请各位大佬指点。