unity NavMesh网格寻路

前言

NavMeshs是Unity自带的一个寻路系统,即一个点到另一个点寻找最短有效路径

如何使用NavMesh?

先直接使用便于理解,然后再介绍参数属性

  1. 直接先给模型添加NavMeshAgent组件,然后自己写一个脚本,通过代码控制它
  2. 场景中烘焙(静态)障碍物 NotWalkable
    Navigation->Obejct ->Navigation Static ->Navigation area->not walkable
  3. 动态障碍物 NavMeshObstacle 组件,直接添加给对象物体使用
  4. Off Mesh Link 组件制作一个起始点,一个跳跃点,让其从两点之间跳跃
  5. 给物体烘焙之前需要设置的Object
    这里写图片描述

参数介绍

使用NavMesh 需要在Obejct勾选静态Navigation,然后在Bake里按Bake按钮才可以烘焙,且每次更新数值都需要Bake一次,且可以同时选择多个个进行设置
查看Bake参数
1. Agent Radius 烘焙半径 ,烘焙不到的半径,
即越小可移动范围越大
2. Agent Height 可以烘焙的最低高度值,设置桥的形式插卡烘焙效果,
即代理x米以下不能经过,
3. Max Slope 可以烘焙的度数,某度数以下烘焙 ,MaxSlope的上限值为60,即只能烘焙60度以下的坡度(可以上坡的斜度)即可以上60度以下的坡度
4. Step Height : 可以直接行走最大高度(自动烘焙障碍物的最大高度,低于该高度,自动忽略高度),这里要注意忽略的高度是从中心点到最高面的。如果正方向型cube在0的时候高度是0.5,在-0.2的时候高度cube是0.3米这时要设置忽略Step Height 要高于0.3 。
即可以忽略x米以下的高度直接踩上去
5. Drop Height: 向下跳落的高度限制
即忽略x米高度,x米以下可以直接跳下去
6. Jump Distance 可以直接跳跃的距离,
在相同的高度下,x米以下可以直接跳(走)过去。

Bake

角色表现出来的寻路功能,事件是Nav Mesh Agent寻路功能
1. Radius :寻路组件的半径
2. Height :寻路组件的高度
3. Speed :组件的速度
4. Angular Speed :旋转速度

代码例子

这里使用NavMeshAgent来做智能寻路,通过鼠标点击获取碰撞点 _hit
然后让物体朝向 _hit.point
最后用 _navMeshAgetn对象.destination = _hit.point 就可以让该脚本的物体智能移向哪个点移动了。
注意只需赋值一下即可。

using UnityEngine;
using System.Collections;

public class MyMouseTest : MonoBehaviour {

    Ray _ray;
    RaycastHit _hit;
    NavMeshAgent _navMeshAgent;

    void Awake(){
        _navMeshAgent = GetComponent<NavMeshAgent> ();
    }
    void Update() {

        if (Input.GetMouseButton(0)) {

            _ray = Camera.main.ScreenPointToRay (Input.mousePosition);

            if (Physics.Raycast (_ray, out _hit)) {
                Debug.Log ("到该目的地" + _hit.point);
                transform.LookAt (_hit.point);
                //transform.Translate (Vector3.forward * 4 * Time.deltaTime,Space.Self);
                _navMeshAgent.destination = _hit.point;
            }
        }

        if (Vector3.Distance (transform.position, _hit.point) < 0.5f) {
            Debug.Log ("到达目的地");        
        } else {
            Debug.Log ("行走中");
        }
    }
}

注意

当发现设置到了,理论上是可行的,但是还是没有效果,可能是因为创建物体,创建成子物体,该物体的默认大小失去了意义,产生bug了,删掉该物体,重新创建物体即可

猜你喜欢

转载自blog.csdn.net/liaoshengg/article/details/81112985