简介
NavMesh是Unity中的寻路系统,如果开发的是3D游戏,使用它很合适.
里面常用到的几个组件
- Navigation面板:烘培场景的寻路网格
- OffMeshLink
- NavMeshAgent组件:寻路角色
- NavMeshObstacle组件:阻挡物(可动态修改)
- RaycastHit:射线,用于点击操作
Navigation面板
- 打开Window->Navigation面板
- 在场景中选择需要烘培的Mesh物体
- Navigation->Object中,把物体设置为NavigationStatic
- Generate OffMeshLinks选项是设置是否生成和其他物体之间的链接寻路关系(例如跳跃)
-
点击右下角的Bake按钮,就能看到场景中生成的寻路网格.
unity_xl1.png
OffMeshLink
给一个需要烘培物体添加额外通过的链接(如楼梯,门,传送带)
unityxl2.png
BiDirectional:可以往返寻路
如图,红色楼梯区域:角色可以从Start走到End
unityxl3.png
NavMeshAget组件
在一个角色上添加了NavMeshAgent组件之后,角色就可以遵循地图上烘培好的寻路网格进行移动,移动代码在后面使用RaycastHit捕捉鼠标点击的例子.
unityxl4.png
NavMeshObstacle组件
NavMeshObstacle是用来设置阻碍物,当它开启时会在寻路网格上生成一个网孔,以防止移动.
unityxl5.png
一个物体不能同时开启NavMeshAget和NavMeshObstacle,但是可以在运行时实时修改其开关.
RaycastHit
最后使用RaycastHit在场景中拾取移动的坐标,配合NavMesh等组件进行移动
using UnityEngine;
using System.Collections;
public class MovePick : MonoBehaviour {
NavMeshAgent agent;
NavMeshObstacle obstacle;
void Start () {
agent = GetComponent<NavMeshAgent> ();
obstacle = GetComponent<NavMeshObstacle> ();
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;
}
}
}