如下图,摆了4个cube当作墙,然后摆一个球,当作游戏的主角,鼠标点哪走哪,但关键是不会出现穿墙的情况。

unity navigation动态寻路 unity3d自动寻路_寻路

具体做法如下:

一、场景布置

1、如下图所示,没什么好说的。

unity navigation动态寻路 unity3d自动寻路_Unity3D_02

2、之后先将这个场景保存为Navmesh,然后如下图打开自动寻路设置界面。

unity navigation动态寻路 unity3d自动寻路_Navigation_03

如下图所示,在Navigation界面,对所有代表墙的Cube和地板Plane都勾上Navigation Static。表示这些都是寻路的阻碍物。

都设置好再点击Bake。烘培之后就会出现如下图的淡蓝色的,可移动的区域。这是Unity3D自己能计算出来的。

unity navigation动态寻路 unity3d自动寻路_Unity3D_04

3、给球加上Nav Mesh Agent这个组件,表示它是一个被导航体。里面的半径、速度等,Unity3D给你上这个组件的时候,基本会给你计算好的,如果你是自己导入的3D模型估计需要将半径改到和你的3D模型基本匹配的程度。

unity navigation动态寻路 unity3d自动寻路_寻路_05

4、之后再给Plane上一个plane标签,用于碰撞检测。因为Unity3D中,鼠标点击Plane,需要是在鼠标点击

unity navigation动态寻路 unity3d自动寻路_Navigation_06

二、脚本设置

给球sphere赋予如下的Navigation.cs:

using UnityEngine;
using System.Collections;

public class Navigation : MonoBehaviour
{
    private NavMeshAgent navMeshAgent;
    void Start()
    {
        navMeshAgent = gameObject.GetComponent<NavMeshAgent>();//初始化navMeshAgent
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))//鼠标左键点下  
        {
            Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);//住摄像机向鼠标位置发射射线 
            RaycastHit mHit;
            if (Physics.Raycast(mRay, out mHit))//射线检验 
            {
                if (mHit.collider.gameObject.tag == "plane")
                {
                    navMeshAgent.SetDestination(mHit.point);//mHit.point就是射线和plane的相交点,实为碰撞点
                }
            }
        }
    }
}