Unity C# 簡易AI目標式移動NavMeshAgent

 

讓AI自行避開障礙物到達目標座標

 

前言:本篇將利用「Navigation」、「NavMeshAgent」二項Unity的元件,並且進行簡易的AI移動製作。

 

  • 此篇重點語法 * * * * *

→ NavMeshAgent元件.SetDestination (目標座標);

讓此物件朝著目標座標移動,並避開周遭的障礙物。

 

● 使用方式 :

agent.SetDestination(target_obj.transform.position);

target_obj.transform.position: 目標物的世界座標。

 

  • 此篇效果 - 朝目標移動並避開障礙物 * * * * 

 

-  大概了解重點後,接下來進入完整教學   -

   

壹、利用Navigation烘培(bake)出AI所需可移動範圍。

 

一、簡單的建製的場地。

01.png

 

二、選取所有要作為「障礙物」和「地面」的子物件,後開啟Navigation窗格(Window→Navigation)。

02.png

備註:選取「父物件」將無法正常的烘培場地。

 

三、點選「Object」欄位後勾選「Navigation Static」將它們設定為可烘培物件

03.jpg

 

四、點選「Bake」設定你的AI基本數值:

04.jpg

 

1.Agent Radius:AI的體積半徑(不用到很精準,主要只是讓Unity知道你的AI有多胖)。
2.Agent Height:AI的體積高度(設定技巧同上)。
3.Max Slope:允許的最大爬坡角度。
4.Step Height:允許移動的最大高度差(你總不會希望你的AI連爬坡和上樓梯都不會)。

備註:以上為AI基本數值設定,其他數值本次暫且不討論。

 

五、設定完成後點選「Bake」鍵,即可看見你的場地上出現一層藍色的區域,此區域即為你的AI可移動的範圍。這樣Navigation的場地烘培就設定完成了。

05.png

 

貳、利用NavMeshAgent設定AI

 

一、請在AI的可移動範圍的上新增一個「要移動的物件 (紅方塊)」和「目標物件 (黃方塊)」。

06.png

 

 

二、在「要移動的物件 (紅方塊)」上新增NavMeshAgent元件,數值的方面預設即可 (數值解釋的部分,會放在下方的補充處)。

07.png

 

 

三、新增一份C#程式,並將它拖曳至「要移動的物件 (紅方塊)」上方

程式.jpg

 

 

四、開啟程式檔,並且開始撰寫,程式語法很簡單如下:

08.png

 

  • 語法解析:

using UnityEngine.AI;    //使用UnityEngine.AI

public NavMeshAgent agent;    //宣告NavMeshAgent
public GameObject target_obj;    //目標物件

agent = GetComponent<NavMeshAgent> ();        //接收NavMeshAgent

agent.SetDestination (target_obj.transform.position);    //讓紅方塊往目標物的座標移動

 

五、輸入完程式後(記得存檔),將黃方塊物件拖曳到target_obj欄位中。

09.png

 

六、恭喜你已經成功作出簡易的AI移動了!現在你可以撥放看看是否有成功讓物件往目標物移動。若沒有成功可以往上檢查是否有哪裡遺漏了。

 

  • 補充:

NavMeshAgent數值解析:

10.jpg


1.Agent Type:Agent型態
2.Base Offset:Agent元件垂直中心位置。
3.Speed:移動速度。
4.Angular Speed:旋轉速度。
5.Acceleration:最大加速度。
6.Stopping Distance:離目標多少具離前停止。
7.Auto Braking:自動煞車。
8.Radius:體積半徑。
9.Height:體積高度。
10.Quality:避障質量。
11.Priority:避障優先度,值在0-99範圍內,其中較低的數字表示較高的優先級。

(Path Finding部分由於與本次主題較無相關,亦不補充)

 

備註:本篇所使用的Unity版本為5.6.4

----------------------------------------------------------------------------------------------------

●     如果這篇文章有幫助到您,希望您能留言給予我們鼓勵 !  

●     對於文章有任何的建議,非常歡迎留言告訴我們哦 !!!  

arrow
arrow

    tim318407 發表在 痞客邦 留言(2) 人氣()