簡(jiǎn)介
NavMesh是Unity中的尋路系統(tǒng),如果開發(fā)的是3D游戲,使用它很合適.
里面常用到的幾個(gè)組件
- Navigation面板:烘培場(chǎng)景的尋路網(wǎng)格
- OffMeshLink
- NavMeshAgent組件:尋路角色
- NavMeshObstacle組件:阻擋物(可動(dòng)態(tài)修改)
- RaycastHit:射線,用于點(diǎn)擊操作
Navigation面板
- 打開Window->Navigation面板
- 在場(chǎng)景中選擇需要烘培的Mesh物體
- Navigation->Object中,把物體設(shè)置為NavigationStatic
- Generate OffMeshLinks選項(xiàng)是設(shè)置是否生成和其他物體之間的鏈接尋路關(guān)系(例如跳躍)
-
點(diǎn)擊右下角的Bake按鈕,就能看到場(chǎng)景中生成的尋路網(wǎng)格.
unity_xl1.png
OffMeshLink
給一個(gè)需要烘培物體添加額外通過的鏈接(如樓梯,門,傳送帶)

unityxl2.png
BiDirectional:可以往返尋路
如圖,紅色樓梯區(qū)域:角色可以從Start走到End

unityxl3.png
NavMeshAget組件
在一個(gè)角色上添加了NavMeshAgent組件之后,角色就可以遵循地圖上烘培好的尋路網(wǎng)格進(jìn)行移動(dòng),移動(dòng)代碼在后面使用RaycastHit捕捉鼠標(biāo)點(diǎn)擊的例子.

unityxl4.png
NavMeshObstacle組件
NavMeshObstacle是用來設(shè)置阻礙物,當(dāng)它開啟時(shí)會(huì)在尋路網(wǎng)格上生成一個(gè)網(wǎng)孔,以防止移動(dòng).

unityxl5.png
一個(gè)物體不能同時(shí)開啟NavMeshAget和NavMeshObstacle,但是可以在運(yùn)行時(shí)實(shí)時(shí)修改其開關(guān).
RaycastHit
最后使用RaycastHit在場(chǎng)景中拾取移動(dòng)的坐標(biāo),配合NavMesh等組件進(jìn)行移動(dòng)
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;
}
}
}
