UnityC# LOL的移動方式Ray和NavMeshAgent
將Ray(射線)結合NavMeshAgent製作出LOL英雄聯盟的移動方式
前言:
本篇將利用Unity的Ray和NavMeshAgent功能製作出LOL英雄聯盟中玩家移動的方式。角色將會朝著你所點擊於場地上的位置移動,並且避開中途的所有障礙物。
備註:
本篇為「簡易AI目標式移動」的延伸練習,須先了解前篇所介紹公能,還不清楚的朋友可點選下方傳送門
「簡易AI目標式移動」傳送門:https://goo.gl/RDuJfv
- 此篇重點語法 * * * * *
→ ScreenPointToRay (Vector3座標);
說明:ScreenPointToRay為Ray(射線)的方法之一,射線的行程方式為,已銀幕位置(Camera位置)為出發點,朝著遊戲中某一座標為方向延伸所形成的射線,框框內所填的便是目標座標。本篇的目標座標將是已滑鼠所點擊得的位置為射線的方向,以此決定玩家點擊的座標位置。
e.g. Ray ray = cam.ScreenPointToRay(Input.MousePosition);
→ RaycastHit
說明:RaycastHit用於偵測射線的碰撞事件,並將相關的碰撞資訊儲存起來。
e.g. RaycastHit hit;
- 此篇效果 - 朝目標移動並避開障礙物 * * * *
- 大概了解重點後,接下來進入完整教學 -
一、利用NavMeshAgent和Navigation將場地以及「要移動的物件(紅方塊)」建製出來。
備註:由於NavMeshAgent和Navigation以於文章「簡易AI目標式移動」中介紹過,亦本篇不加以介紹。
二、若你是從前一篇作過來的,請先將「黃方塊」以及「紅方塊的程式」刪除掉,若不是則請直接略過此步驟即可。
三、請再「要移動的物件(紅方塊)」上新增一個程式,程式的與法如下:
程式語言:
using UnityEngine.AI; //使用UnityEngine.AI
public NavMeshAgent agent; //宣告NavMeshAgent
public Camera cam; //宣告Camera物件
void Start () {
agent = GetComponent<NavMeshAgent> (); //接收NavMeshAgent
}
void Update () {
if (Input.GetMouseButton (0)) { //判斷是否按下滑鼠左鍵
//宣告一條從Camera到滑鼠點擊位置的Ray(射線)
Ray ray = cam.ScreenPointToRay (Input.mousePosition);
RaycastHit hit; //宣告射線碰撞
if (Physics.Raycast (ray, out hit)) { //判斷射線是否有碰撞到東西
//讓物件朝著射線碰撞到的點進行AI移動
agent.SetDestination (hit.point);
}
}
}
四、將場景中的Camera物件拖曳至cam欄位中。
五、現在「要移動物件(紅方塊)」已經可以移動到你所點擊的位置了,可以撥放看看是否有成功。
六、雖然方塊可以照著你點擊的位置移動,但當你點擊快一點時,你會發現方塊會有些跟不上的感覺,這時你可以對「要移動物件(紅方塊)」的NavMeshAgent進行一些數值上的調整,已下是我設定的數值供大家參考:
參數解析:
- Speed:Agent移動速度。
- Angular Speed:Agent旋轉速度。
- Acceleration:路徑的最大加速度。
七、設定完後就會像是LOL的移動方式就玩成囉!可以撥放看看是否成功。若沒有成功可以往上檢查是否有哪裡遺漏了。
備註:本篇所使用的Unity版本為5.6.4
-------------------------------------------------------------------------------------------------------------------------------------
我們有粉絲專頁囉!!!
如果怕有問題連絡不到我們,歡迎隨時私訊FB粉專哦!!!
https://www.facebook.com/Straying2018/
● 如果這篇文章有幫助到您,希望您能留言給予我們鼓勵 !
● 對於文章有任何的建議,非常歡迎留言告訴我們哦 !!!
● 有任何想知道的功能也歡迎告訴我們,我們會盡快寫成部落格分享給大家!
- By Tim -