使用Unity自带寻路:NavMesh

简介

NavMesh是Unity中的寻路系统,如果开发的是3D游戏,使用它很合适.
里面常用到的几个组件

  1. Navigation面板:烘培场景的寻路网格
  2. OffMeshLink
  3. NavMeshAgent组件:寻路角色
  4. NavMeshObstacle组件:阻挡物(可动态修改)
  5. RaycastHit:射线,用于点击操作

Navigation面板

  • 打开Window->Navigation面板
  • 在场景中选择需要烘培的Mesh物体
  • Navigation->Object中,把物体设置为NavigationStatic
  • Generate OffMeshLinks选项是设置是否生成和其他物体之间的链接寻路关系(例如跳跃)
  • 点击右下角的Bake按钮,就能看到场景中生成的寻路网格.


    使用Unity自带寻路:NavMesh_第1张图片
    unity_xl1.png

OffMeshLink

给一个需要烘培物体添加额外通过的链接(如楼梯,门,传送带)


使用Unity自带寻路:NavMesh_第2张图片
unityxl2.png

BiDirectional:可以往返寻路
如图,红色楼梯区域:角色可以从Start走到End


使用Unity自带寻路:NavMesh_第3张图片
unityxl3.png

NavMeshAget组件

在一个角色上添加了NavMeshAgent组件之后,角色就可以遵循地图上烘培好的寻路网格进行移动,移动代码在后面使用RaycastHit捕捉鼠标点击的例子.


使用Unity自带寻路:NavMesh_第4张图片
unityxl4.png

NavMeshObstacle组件

NavMeshObstacle是用来设置阻碍物,当它开启时会在寻路网格上生成一个网孔,以防止移动.


使用Unity自带寻路:NavMesh_第5张图片
unityxl5.png

一个物体不能同时开启NavMeshAget和NavMeshObstacle,但是可以在运行时实时修改其开关.

RaycastHit

最后使用RaycastHit在场景中拾取移动的坐标,配合NavMesh等组件进行移动

using UnityEngine;
using System.Collections;
public class MovePick : MonoBehaviour {
    NavMeshAgent agent;
    NavMeshObstacle obstacle;

    void Start () {
        agent = GetComponent ();
        obstacle = GetComponent ();
        obstacle.enabled = false;
    }

    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            RaycastHit hit;
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
                agent.enabled = true;
                obstacle.enabled = false;
                agent.SetDestination(hit.point);
            }
        }

        if (agent.enabled && agent.remainingDistance < 1 && agent.remainingDistance > 0.5) {
            agent.Stop(true);
            agent.enabled = false;
            obstacle.enabled = true;
        }
    }
}

你可能感兴趣的:(使用Unity自带寻路:NavMesh)