一.什么是尋路?
尋路顧名思義就是:角色在到達(dá)指定地點(diǎn)的過程中遇到障礙物會(huì)自動(dòng)避開并自行選取最短的路程進(jìn)行移動(dòng)。大多數(shù)的游戲中都會(huì)有自動(dòng)越過障礙物與自動(dòng)尋路的功能,點(diǎn)擊場景上的一個(gè)位置,角色就會(huì)自動(dòng)尋路過去。中間可能會(huì)有很多的障礙物,角色會(huì)自動(dòng)繞過障礙物,最終達(dá)到終點(diǎn)。
二.使用尋路的方法:
第一種比較傳統(tǒng)的是使用A星尋路插件,它是一種比較傳統(tǒng)的人工智能算法,在Unity還沒有Navigation尋路系統(tǒng)的時(shí)候最常被使用的一種方法第二種就是通過Unity自帶的Navigation尋路系統(tǒng),添加腳本控制角色的自動(dòng)避讓障礙物和尋路
自動(dòng)避讓障礙物
一. 添加一塊Plane地板和一個(gè)膠囊體 Capsule(作為角色Player),給膠囊體添加Character Controller角色控制器 , 在Mesh F的Mesh改為None后會(huì)發(fā)現(xiàn),膠囊體變成了一個(gè)如鳥籠般的網(wǎng)格狀物體,這便是角色控制器
二.添加一塊Cube拉升后變成一面墻體,我們要實(shí)現(xiàn)的功能就是點(diǎn)擊對(duì)面的地面,膠囊體可以繞過墻到達(dá)指定地點(diǎn)
三.在Window中添加Navigation
四.給角色添加Nav Mesh Agent
五.將Plane和Cube的static勾選為兩個(gè)Static
六.給角色(膠囊體)添加腳本控制移動(dòng)
private NavMeshAgent agent;
void Start () {
agent = transform.GetComponent<NavMeshAgent>();
}
void Update () {
if (Input.GetMouseButtonDown(0)) {
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(r, out hit)) {
if (!hit.collider.name.Equals("Player")) {
Vector3 p = hit.point; agent.SetDestination(p);
}
}
}
}
}
七.給Cube和面板進(jìn)行烘焙
八.給面板的tag更改為Player(因?yàn)樵诮巧哪_本中判斷了對(duì)象的.name.Equals是否為“Player”)
現(xiàn)在點(diǎn)擊播放,這時(shí)就能實(shí)現(xiàn)物體在進(jìn)行移動(dòng)到達(dá)指定地點(diǎn)的途中遇到障礙物會(huì)自動(dòng)避讓了
自動(dòng)尋路
在原有的基礎(chǔ)上再復(fù)制一塊Plane面板,將Bake下的Jump Distance和Drop height更改數(shù)值(根據(jù)制作的面板的距離自行更改)進(jìn)行烘焙(注意如果不是復(fù)制的Plane面板而是重新創(chuàng)建的話,需要注意新面板的Static、Tag是否為Player和是否勾選Object)