一、什么是尋路?
尋路顧名思義就是:角色在到達指定地點的過程中遇到障礙物會自動避開并自行選取最短的路程進行移動。
大多數(shù)的游戲中都會有自動越過障礙物與自動尋路的功能,點擊場景上的一個位置,角色就會自動尋路過去。中間可能會有很多的障礙物,角色會自動繞過障礙物,最終達到終點。
二、使用尋路的方法:
第一種比較傳統(tǒng)的是使用A星尋路插件,它是一種比較傳統(tǒng)的人工智能算法,在Unity還沒有Navigation尋路系統(tǒng)的時候最常被使用的一種方法
第二種就是通過Unity自帶的Navigation尋路系統(tǒng),添加腳本控制角色的自動避讓障礙物和尋路
自動避讓障礙物
一、添加一塊Plane地板和一個膠囊體 Capsule(作為角色Player),給膠囊體添加Character Controller角色控制器 , 在Mesh F的Mesh改為None后會發(fā)現(xiàn),膠囊體變成了一個如鳥籠般的網(wǎng)格狀物體,這便是角色控制器。
image.png
二、添加一塊Cube拉升后變成一面墻體,我們要實現(xiàn)的功能就是點擊對面的地面,膠囊體可以繞過墻到達指定地點
image.png
三、在Window中添加Navigation
image.png
四、給角色添加Nav Mesh Agent
image.png
五、將Plane和Cube的static勾選為兩個Static
image.png
六、給角色(膠囊體)添加腳本控制移動
public class Movenine_Test : MonoBehaviour {
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和面板進行烘焙
image.png
八、給面板的tag更改為Player(因為在角色的腳本中判斷了對象的.name.Equals是否為“Player”)
image.png
現(xiàn)在點擊播放,這時就能實現(xiàn)物體在進行移動到達指定地點的途中遇到障礙物會自動避讓了
3912807-019724bf2ff1694b.gif
自動尋路
在原有的基礎(chǔ)上再復(fù)制一塊Plane面板,將Bake下的Jump Distance和Drop height更改數(shù)值(根據(jù)制作的面板的距離自行更改)進行烘焙
(注意如果不是復(fù)制的Plane面板而是重新創(chuàng)建的話,需要注意新面板的Static、Tag是否為Player和是否勾選Object)
image.png
image.png
3912807-3a57f731dab7a2ae.gif