NavMesh技术相关问题及解决方案

1.动态生成NavMeshAgent可能无法吸附到NavMesh上

默认关闭NavMeshAgent,启用重力和碰撞盒,在FixedUpdate中打射线判定是否接触到地面,如果接触到地面就取消重力,并启用NavMeshAgent,NavMeshAgent在启用时isStopped会重置为false,需要手动变为true

   
private void FixedUpdate()
    {
        // 射线判断是否落地,关闭重力
        if (selfRigid.useGravity)
        {
            if (Physics.Raycast(transform.position, Vector3.down, 1, 1 << LayerIndex.floorLayer))
            {
                selfRigid.useGravity = false;
                navMeshAgent.enabled = true;
                navMeshAgent.isStopped = true;
            }
        }
    }

2.在一个物体周围随机位置放置NavMeshAgent

private Vector3 RandomMomPosition(Transform target, float range)
    {
        for (int i = 0; i < 100; i++)
        {
            float x = Random.Range(0.8f, 0.9f);
            Vector3 randomPoint = target.transform.position + new Vector3((Random.Range(0, 1.0f) > 0.5f ? 1.0f : -1.0f) * x, 
                0, (Random.Range(0, 1.0f) > 0.5f ? 1.0f : -1.0f) * Mathf.Sqrt(1 - x * x)) * range;
            NavMeshHit hit;
            // 判断随机点周围x范围内是否有在NavMesh上的点,若没有则范围false
            if (NavMesh.SamplePosition(randomPoint, out hit, 1.0f, NavMesh.AllAreas))
            {
                return hit.position;
            }
        }
}

3.摄像机跟随会出现抖动

解法1:

使用LateUpdate更新摄像机的位置,因为NavMeshAgent位置的更新是在LateUpdate中的

解法2:

使用navMeshAgent.nextPosition在FixedUpdate中更新人物位置并且在FixedUpdate中更新摄像机位置

4.将NavMeshAgent的位置赋值时会出现不对的效果,Agent并不在赋值点出现

解法:
先关闭NavMeshAgent,更新完位置后,停止几帧再启用

navMeshAgent.enabled = false;
transform.position = GameObject.Find("BirthPlace").transform.position;

// 使用协程停止2帧执行
Util.DelayExecuteWithFrame(2, () =>
{
    navMeshAgent.enabled = true;
    // 启用后将isStopped设置为true
    navMeshAgent.isStopped = true;
});

猜你喜欢

转载自blog.csdn.net/HelloCSDN666/article/details/124675438