應用場景:類似於LOL中,鼠標點擊地圖上的某一點,然後人物就會自動的走過去。
準備場景:一個Plane,作爲地面;一個Cube,作爲障礙物;一個膠囊體,作爲人物。
打開導航選項卡:
Mac:Window——AI——Navigation
Windows:Window——Navigation
選擇Plane,然後打開Navigation選項卡,
Navigation Area裏面的選項表示當前選擇的區域是可行走的還是不可行走的還是跳躍的。我們將Plane選擇爲可行走的:Walkable。
然後進入Bake頁面:
點擊Bake之後,會發現Plane變了樣子:
此時我們就已經完成了Plane的網格導航。
然後我們如法炮製,選擇Cube,然後將Cube的Navigation Area選擇成不可行走的,之後再Bake一下,這樣就設置Cube成了一個障礙體。
接着,我們需要給Capsule加一個組件:Nav Mesh Agent,這個組件就是網格導航尋路組件
此時我們給膠囊體Capsule掛一個腳本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class navmesh : MonoBehaviour
{
// 頂一個網格導航器,然後在面板裏面直接將Capsule直接拖過來
public NavMeshAgent agent;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.GetMouseButtonDown(0))
{
// 這是3D拾取的過程,將屏幕點擊的點轉化爲一個三維空間的座標
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// 如果有點擊到地面的時候,就將Capsule設置到點擊的點對應的三維空間的位置
if(Physics.Raycast(ray, out hit))
{
Debug.Log(hit.collider.gameObject.name);
this.agent.SetDestination(hit.point);
}
}
}
}
但是以上是一個比較簡單的實現,還有一種自定義的導航尋路,就像下面這種
導航網格我已經烘焙出來了,我想從A點控制人物走到B點,但是此時是沒有辦法走過去的,因爲兩點之間是空的,所以我們現在就需要一個特殊組件:off Mesh Link
其實爲了滿足複雜的地形而提供的特殊組件,開發人員可以自行設計所需路線,該路線會併入到導航網絡中;一併參與尋路計算;
Off Mesh Link含義:
Start: 定義路線的起始位置信息;
End 自定義路線的目標位置信息;
Cost Override: 自定義路線的成本覆蓋;
Bi directional 自定義路線是否允許雙線穿越;
Activated: 是否激活改路線;
使用方法:
創建一個空的組件,我們起名爲:offmeshlink,然後給這個對象添加一個組件:Off Mesh Link
我們可以看到,這個組件裏面有兩個點需要我們去設置,一個是Start一個是End,這兩個點就是我們設置的自定義路線的起點和終點,我們繼續創建兩個空的遊戲對象,在剛在的offmeshlink下面
然後我們將這兩個點移動到,A點和B點,然後從Navigation選項卡里面觀察這個兩個點
點上必須有兩個圓圈的樣子出現,這才表示,你的點在這個地面上,才能用這個自定義路線,自定義路線設置好之後,導航網格烘焙的時候,就會自動加上這個自定義路線,然後運行遊戲,就可以實現從A點到B點了。