- 📢博客主頁:https://blog.csdn.net/zhangay1998
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 呆呆敲代碼的小Y 原創,首發于 CSDN🙉
- 📢未來很長,值得我們全力奔赴更美好的生活?
目錄
- 📢前言
- ??Unity Navigation 導航系統
- 🧡Navigation 導航系統概述
- 💛導航網格(NavMesh)
- 💚導航角色(NavMeshAgent)
- 🚩NavMeshAgent屬性面板介紹
- 🚩常用屬性和方法
- 💘分層路面導航(Nav Mesh Area)
- 🚩Areas簡介
- 🚩Areas屬性面板
- 🚩Areas實際應用
- 💙分離路面導航(OffMeshLink)
- 🚩自動設定off mesh links
- 🚩手動設定off mesh links
- 💜動態路障(Nav Mesh Obstacle)
- 🚩NavMeshObstacle 組件介紹
- 🚩NavMeshObstacle 面板屬性
- 💬總結
📢前言
- 最近收到小伙伴的留言,說
基礎學習
的專欄寫的挺不錯的,適合新入門的學習, - 那我寫這個Unity基礎知識的專欄,就能感受到付出的心血沒有白費呀!
- 也希望自己寫的東西能給更多的小伙伴帶來更好的知識
學習體驗
~ - 之前寫過幾篇
Unity基礎學習
的文章,但是有些地方還沒有寫,后面有時間就慢慢補齊! - 所以這篇文章就對
Unity中的導航系統
進行一個詳細學習說明,感興趣的小伙伴一起往下看吧!
??Unity Navigation 導航系統
導航系統
,顧名思義,就是游戲中的一個尋路功能
現實世界中的導航則是輸入一個起點和一個終點,我們的導航軟體就會規劃出一個合適的行進路線,
導航系統會幫我們選出最快捷最方便的那條路,然后我們順著路線行走就可以到達目的地了!
虛擬世界中亦是如此,
比如許多游戲中,領取一個任務,然后有一個自動尋路
,點擊之后我們的角色就是自己動起來向著目的地進發,那小伙伴們有沒有想過這個自動尋路
是怎樣實作的呢~
還有就是在場景中,滑鼠點擊某個位置
,我們的角色就會慢悠悠的向著我們點擊的位置移動過去,直到目標位置才停下來!比如英雄聯盟,諸如此類
這就是最普通的一個導航
思路,導航
在大多數游戲中都會用到
包括我之前寫過的那一篇復刻皇室戰爭的小游戲中就用到了導航系統!
因為上次是實戰文章,所以對這個導航并沒有過多的描述,只是簡單的介紹了下游戲中是如何操作的,
Unity
中常用的導航系統
無非就是Navigation
和A*尋路
,那本篇文章就開始正式介紹一下Navigation
!
🧡Navigation 導航系統概述
描述:一個角色在特定環境下自動到達指定目標
Unity 3D Navigation(導航)
是用于實作動態物體自動尋路的一種技術,它將游戲場景中復雜的結構關系簡化為帶有一定資訊的網格,并在這些網格的基礎上通過一系列相應的計算來實作自動尋路,
是Unity自帶的一個尋路系統
,我們可以利用他完成非常多的導航
功能,
我們只需要對角色和場景進行一個簡單的設定就可以完成一個簡單的實體
下面一起看看Navigation
中的詳細結構吧!
💛導航網格(NavMesh)
想要使用Navigation
進行導航
第一步,將場景中的從頭至尾不會發生位置變化
的物體設定成靜態場景
這個很簡單,選中想要設定的物體,然后在Inspector
屬性面板上設定一下Static
就好了
如下圖
第二步,網格烘焙
打開選單欄,Windows - > AI ->Navigation
不同版本的可能Navigation
的位置有所差異,找到后點擊一下就好啦
點完之后,在面板上會出現一個Navigation
,打開Bake
視窗如下所示:
Bake
界面有幾個屬性可以配置
- Agent Radius (??半徑)
- Agent Height (???度)
- Max Slope (??可以爬的最?坡度)
- Step Height (??可以上的臺階?度)
沒有什么要求的時候,默認屬性就好,然后單擊面板右下角的Bake
進行烘焙
烘焙完成后就可以看到如下圖所示的烘焙完成的導航網格
啦,還有會出現一個和場景同名的檔案夾,保存導航網格烘焙的資料
,
其中這個藍色的網格部分
就是烘焙完成后,我們的導航可以進行移動
的區域
未變藍的區域就代表不能在該地區移動
那這個時候就有小伙伴進行提問了,明明場景都是一樣設定的,為什么有的變藍了,有的沒變藍呢!
這就是我們剛才設定的那個Bake
造成的,因為默認的屬性角色半徑可能過大,所以場景中的邊緣時導航無法到達的!所以就為渲染成藍色可導航區域
所以看下面我把半徑
設定為0.1
之后,基本上就都可以到達啦!
然后簡單設定一個場景,讓這個小膠囊體待會走的時候會動動腦子
💚導航角色(NavMeshAgent)
場景布置完了,導航網格設定好了,下一步就是給需要進行導航的物體添加上NavMeshAgent組件
🚩NavMeshAgent屬性面板介紹
一起來看看NavMeshAgent
的屬性面板
介紹一下該組件的屬性面板
AgentSize(角色大小)
- Radius(半徑)
- Height(?度)
- Base Offset(偏移量)
導航??與?格;中?點的偏移量
Steering(導航程序)
- Speed(導航程序中
- ??的最?速度)
- AngularSpeed(?速度)
- Acceleration(加速度)
- Stoping Distance(停?距離)
當前??距離?標多遠時停下 - Auto Breakting(?動減速)
當??快達到?標時?動減速
Obstacle Avoidance(躲避障礙物)
- Quality(導航質量)
- Priority(優先級)
Path Finding(尋路設定)
- Auto Traverse Off Mesh Link
?動跨越分離路? - Auto Repath
?動重新規劃路徑 - Area Mask
分層剔除(設定??可以?哪些層)
🚩常用屬性和方法
下面是導航角色常用的一些屬性
和方法
介紹
知道了NavMeshAgent
的面板屬性和常用屬性和方法之后
我們來寫一個腳本,簡單的執行一下導航,看一看到底是個啥效果呢!
創建一個NavigationTest
腳本,代碼如下
Tip:使用NavMeshAgent
組件要先匯入UnityEngine.AI
命名空間,要不然會報錯的哦!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;//匯入命名空間
public class NavigationTest : MonoBehaviour
{
private NavMeshAgent navMeshAgent;
private void Start()
{
navMeshAgent = gameObject.GetComponent<NavMeshAgent>();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Transform parent = hit.collider.transform.parent;
if (parent != null )
{
navMeshAgent.SetDestination(hit.point);
}
}
}
}
}
腳本內容很簡單,就是拿到這個NavMeshAgent
組件之后
- 在
Update
中進行判斷,當點擊滑鼠左鍵
的時候 開啟射線檢測
,記錄下當前滑鼠點擊的物體
- 然后利用
SetDestination
方法,將滑鼠點擊的位置設定成導航的目的地
這樣就會出現,我們滑鼠點擊一個位置,只要導航能到的地方就會按照導航自動計算出的最短路徑進行自動尋路
了!
將這個腳本
掛到這個膠囊體上就好了,下面是演示效果:
Tip:如果膠囊體上不去這個臺階,那就是說明Bake
的Step Height
(??可以上的臺階?度)數值太小,適當改一下即可
這里還有一個小知識
,就是我們在尋路的時候,我們尋路的角色在Scene
場景中會出現三個紅藍黑箭頭
,如下圖所示
- 紅?箭頭 :代表 指向(階段性?標)
- 藍?箭頭 :代表 期望速度
- ??箭頭 :代表 瞬時速度
💘分層路面導航(Nav Mesh Area)
🚩Areas簡介
分層路面導航
是什么意思呢?
在現實世界中進行導航
的時候,可能會出現幾條不同的路線
有的可能是走高速公路,有的則是跑下道,就是不上高速,走一些鄉間土路之類的路徑
因為走不同的路線付出的代價
是不一樣的,跑高速很快又省時間,但是要交高速費用
跑下道呢,不用交高速費,但是可能有很多紅燈耽誤時間,而且有時候路還不好走!
那Unity的這個分層路面導航
呢,就是模擬現實世界中的不同的地形
場景!
簡單來說可以比喻成不同的地形,比如高速公路、鄉間土路、河流和沙漠等等!
🚩Areas屬性面板
先來看一下屬性面板
切換至Navigation
面板的Areas
前三個是Unity內置的三種地形:Wakeable可行走
,NotWakeable不可行走
,Jump跳躍
User1 - User31
這一塊都是我們可以進行設定的
比如上圖,是我自己設定了兩個:River(河流)
和Desert(沙漠)
設定完了之后,選中場景中的一個游戲物件,我這里選擇的是左邊的一條路,設定成了Desert沙漠,右邊的設定成了River河流
然后回到Bake
,重新烘焙
一下,就會發現場景中的導航網格變顏色了,不再是藍色
而是我們設定的顏色,我們在Area面板
設定的兩個地形分別是粉紅色
和小綠色
,所以導航網格
變成了對應的顏色
如下圖
🚩Areas實際應用
設定完了之后,我們重新運行場景會發現并沒有什么作用,導航該咋咋滴,沒有受到影響
再回到Area
界面,會發現右面每一個User
后面對應一個可以輸入的Cost數值
,不同Unity版本可能沒有這個Cost標記
這個數值的含義可以理解為:行走該地形所要付出的“代價”
什么意思呢,比如我們把River河流
后邊的數值改成10
,我們場景中右邊那條路設定地形的為河流,導航網格是粉紅色
下面運行程式看一下效果
我們明明從右邊過過去會更近
,但是我們的導航還是從左邊繞遠路
過去,這就是因為我們給右邊的路徑設定的代價很高
!
所以導航會進行取舍
,寧愿走遠路也不會走這條代價更高的路
一般使用這個限制導航角色路徑
的時候會用到
💙分離路面導航(OffMeshLink)
說完了這個分層路面導航
,再來說一下這個分離路面導航
分層
挺好理解,就是設定不同的路,需要付出不同的代價,那分離
又是什么呢?
-
在
現實世界
中,有時候地形之間會有溝壑
,比如一條不寬的小河,并沒有橋在上面 -
那我們怎么過去呢,輕松一跳就過去了,但是如果這條河很寬,那我們就過不去了,需要一座橋才能過去
-
還有就是一個高臺,假設有一米高,那我們還是可以很輕松的一躍而下,那如果換成10米高的呢,想想還是算了叭~
-
那在
虛擬世界
中也是同理,我們設定普通的導航網格,如果遇到溝壑和高臺,那是過不去的,必須要一個橋梁才能繞過去 -
那這個
分離路面導航
就可以成為我們的一座橋梁
這個off mesh links
橋梁有兩種設定方法,一種是自動設定
,一種是手動設定
,下面來詳細說一下
🚩自動設定off mesh links
還是打開Navigation
的Bake
面板
- Jump Distance :代表可以跳躍溝壑的最大距離
- Drop Height :代表可以跳躍高臺最大高度
設定完了之后,要選中場景中的靜態物體,在Object
面板勾選這個Generate OffMeshLinks
,再重新烘焙
即可
默認一般都是勾選的,我這里故意給左邊的平臺沒有勾選這個地方,所以就只能從右邊跳過去,左邊不能觸發跳躍
看一下效果,因為左邊的沒有勾選Object
面板中的Generate OffMeshLinks
,所以左邊不能跳躍,右邊可以!
🚩手動設定off mesh links
這個自動的操作比較簡單,只需要設定一下合適的跳躍高度和長度就可以進行分離導航了
那接下來看一下手動怎樣設定吧!
我們需要創建兩個空物件
,添加上off mesh link組件
,分別用來控制跳躍的起點
和終點
如下圖所示
off mesh link組件面板屬性
- Cost Override:路徑估值,和之前的Area一樣
- Bi Directional:控制跳躍是單向的還是雙向的
- Activated:控制Link是否激活
- Auto Update Position:自動更新位置,當移動開始結束點的時候,自動更新
設定完之后看一下效果圖,在我們設定的起點
和終點
位置就可以隨意跳躍了
并且設定了路徑估值
以后,這一條路線也是化為導航路線中,優先挑選最佳路徑進行導航
!
💜動態路障(Nav Mesh Obstacle)
🚩NavMeshObstacle 組件介紹
Nav Mesh Obstacle
:導航網格障礙物
-
在設定
導航系統
時,我們一般都是將場景中不會發生位置變化的物體設定成靜態
-
如果出現障礙物的話,一般也是設定成
靜態
,參與Navigation的導航烘焙
,這樣我們角色導航時不會與靜態物體發生碰撞
-
但是如果我們的障礙物不是靜態的,是
動態
的時候,比如我們是通過代碼實體化出的一個物體,并沒有參與導航烘焙
-
那這個時候就需要
Nav Mesh Obstalce
組件來提供這個功能了!
🚩NavMeshObstacle 面板屬性
- Shape:選擇障礙的幾何形狀
- Carve:如果勾選,會重新渲染網格.勾選上該屬性后,會出現如下三個可以控制的引數
- Move Threshold:[移動閾值]
大于該值的移動,才認為是真正發生了移動, - Time To Stationary:[時間靜止]
每間隔多長時間,檢查一次該障礙物的位置,如果發生了移動則動態的更新導航
網格的資料 - Carve Only Stationary:[僅雕刻靜止物體]
勾選后,則按上面的時間間隔,固定的檢查位置,固定時長更新網格資料;
如果不勾選,則是每幀都會檢查位置,如果發生位移,立刻更新網格資料,
簡單測驗一下Carve是否勾選
的效果
Carve未勾選時:堅持等路障消除,
-
就像個憨憨一樣,明知道前面有障礙物,還是在這傻等這障礙物消除,有別的路都不走
-
是不是像極了你追尋愛情時候的樣子!
Carve勾選時:選擇另謀出路 -
既然知道前面的是障礙物,那就要另謀出路,就算右邊那條路的代價很高,那我們也需要前行不是
-
比起傻等的憨憨可是要強多了,天涯何處無芳草,何必單戀一條路!
💬總結
- 本篇文章對Unity中的
Navigation導航系統
做了一個全面決議
, - 包括
導航網格
、導航角色
、分層路面導航
、分離路面導航
和動態路障
幾部分,還是比較容易理解的! - 將
Navigation
相關的地方應該是都寫出來了,并搭配簡單的實體
和效果展示
,如果有未說明的地方也可以評論區
告訴我哦!
Tips
- 還是要在這里說一下,寫博客的
初衷
是為了自己記錄一些知識內容,也可以分享給需要的人看- 雖然現在
知識付費
已經很常見了,但還是想保持一個知識開源
的精神- 就像這篇
導航
文章,寫完之后對我個人而言并沒有很大的用處,但是對于需要這塊知識的人可能就會有所幫助- 我希望有需求的人看完之后能夠真正學會,那這篇博客的
價值
就體現出來了- 但是一味地付出得不到識訓自然很難有堅持下去的
動力
,所以我也是開了一個專門寫Unity制作的小游戲
付費專欄- 有需求的人自然
訂閱
就好啦,一頓飯錢識訓的可不只是幾篇文章,更多的識訓知識- 每當有人告訴我文章寫得很好,而且主動把我的文章推給更多人看的時候,就是寫文章最大的
欣慰
了吧!- 還是希望自己能保持
寫博客的初心
,我個人的付費文章和專欄是不會設定很多的,所以大家看完文章點個三連
就是對我最大的支持啦!
- 🎄如果感覺文章看完了不過癮,可以來我的其他 專欄 看一下哦~
- 🎄比如以下幾個專欄:Unity基礎知識學習專欄、Unity游戲制作專欄、Unity實戰類專案 和 演算法學習專欄
- 🎄可以學習更多的關于Unity引擎的相關內容哦!直接點擊下面顏色就可以跳轉啦!
🚀 優質專欄分享 🚀 |
🎄 Unity基礎知識學習專欄 🎄 ?? Unity游戲制作專欄 ?? 🍇 Unity實戰類專案 🍇 💦 小Y學演算法 💦
🚀 優質專欄分享 🚀 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295503.html
標籤:其他
上一篇:Java撰寫猜數、猜拳小游戲(結合檔案IO流實作用戶資訊動態永久存盤)
下一篇:#C語言 #手把手學會三子棋