iis網(wǎng)站重定向設(shè)置百度寧波營(yíng)銷中心
目錄
1 尋路和導(dǎo)航對(duì)移動(dòng)的不同
1.1 基礎(chǔ)的移動(dòng)功能
1.1.1 基礎(chǔ)移動(dòng)
1.1.2 智能導(dǎo)航尋路
1.1.3 智能導(dǎo)航尋路還可以
2 如何實(shí)現(xiàn)這個(gè)效果?
2.1 通過地圖網(wǎng)格的形式
2.1.1 警告信息 the static value has been deprecated的對(duì)應(yīng)搜索
2.1.3 bake按鈕的位置
2.2.1 unity 2022之前
2.2.1 unity 2022之后
2.3 如果遇到 window / 下面沒有AI菜單的情況,解決辦法
3 地圖測(cè)試導(dǎo)航尋路準(zhǔn)備
3.1 做一些障礙物 和 樓梯等
4 生成地圖網(wǎng)格
4.3 可以設(shè)置 多種不同體型的 agent 數(shù)據(jù)
5 題外話:總結(jié)關(guān)于一個(gè)gameObject在游戲里有多個(gè)形象
6 用腳本實(shí)現(xiàn)移動(dòng)時(shí)導(dǎo)航效果
6.1 具體內(nèi)容
6.1.1 獲得點(diǎn)擊位置
6.1.2實(shí)現(xiàn)導(dǎo)航移動(dòng)
6.2 腳本內(nèi)容
6.3 報(bào)錯(cuò)處理
6.4 測(cè)試效果 OK
1 尋路和導(dǎo)航對(duì)移動(dòng)的不同
1.1 基礎(chǔ)的移動(dòng)功能
實(shí)測(cè)有很多差別
1.1.1 基礎(chǔ)移動(dòng)
- 基礎(chǔ)的移動(dòng)可以朝向點(diǎn)選的地方移動(dòng)
- 比如可以跳下去等等
1.1.2 智能導(dǎo)航尋路
- 但是導(dǎo)航可以讓角色移動(dòng)的同時(shí),避開障礙物,也就是 智能移動(dòng)/尋路
- 而且 NaviMesh 上顯示非藍(lán)色的區(qū)域,角色移動(dòng)時(shí)根本不會(huì)往哪走
1.1.3 智能導(dǎo)航尋路還可以
- 判斷路徑,哪些地方是否可通過
- 可以繞著障礙物走
- 可以實(shí)現(xiàn)路徑的不同區(qū)域的過路成本
2 如何實(shí)現(xiàn)這個(gè)效果?
2.1 通過地圖網(wǎng)格的形式
- unity 2023版本以前,點(diǎn)擊右上角的 navigation static 可以
- unity 2023版本以后,這個(gè)功能已經(jīng)被棄用, the static value has been deprecated
2.1.1 警告信息 the static value has been deprecated的對(duì)應(yīng)搜索
- the static value has been deprecated
這個(gè)警告信息是Unity中的一個(gè)已棄用的警告信息,它意味著你正在使用已經(jīng)棄用的功能。這個(gè)信息是由于 Unity 2023 已經(jīng)不再使用(Deprecated)?
GameObjectUtility.FindOrCreateNavMeshSurface
?API來處理生成Navmesh。這個(gè)警告信息只是告訴你正在使用過時(shí)的 API,但不影響你使用 Navigation 功能。如果你想使用Navigation功能但是不想看到這個(gè)報(bào)錯(cuò)信息,你可以通過在代碼中使用新的API來解決這個(gè)問題,具體步驟如下:
1.首先,打開“Window > AI > Navigation”面板,并創(chuàng)建一個(gè)新的 NavMesh Surface 組件。
2.然后,將該組件添加到場(chǎng)景中的一個(gè)GameObject對(duì)象上。
3.在代碼中,使用以下代碼片段,獲取對(duì) NavMeshSurface 組件的引用:
NavMeshSurface navMeshSurface = GetComponent<NavMeshSurface>();
4.使用該組件的新 API,即:
navMeshSurface.BuildNavMesh();
這樣就可以解決該警告信息,并正確地使用 Navigation 功能。
需要注意的是,由于該API已經(jīng)棄用了,因此無法保證該解決方案在未來版本的 Unity 中是否會(huì)繼續(xù)有效。因此,如果你想保持你的代碼是最新的,建議使用最新的文檔和API。
2.1.2 新的navigation bake功能
在Unity 2022版本中,導(dǎo)航系統(tǒng)的Bake按鈕位置發(fā)生了變化,不再直接顯示在菜單中,而是通過添加組件的形式進(jìn)行烘焙。?
在Unity 2022版本中,導(dǎo)航系統(tǒng)的Bake按鈕位置發(fā)生了變化。原來的Bake按鈕被替換為在組件上進(jìn)行烘焙。具體操作如下:
- ?選擇場(chǎng)景中的靜態(tài)物體?:首先,確定場(chǎng)景中的靜態(tài)物體(在整個(gè)游戲運(yùn)行過程中不會(huì)發(fā)生Transform變化的物體),并將其設(shè)置為靜態(tài)物體(勾選static前面的復(fù)選框)。
- ?添加NavMeshAgent組件?:給需要導(dǎo)航移動(dòng)的物體添加Navmesh Agent組件。
- ?組件上烘焙?:在組件上通過添加NavMesh組件來實(shí)現(xiàn)烘焙功能。具體步驟如下:
- 打開Unity編輯器,進(jìn)入Window菜單,選擇AI?->?Navigation。
- 在Navigation界面中,選擇Agent Type并設(shè)置相關(guān)參數(shù)。
- 添加NavMesh組件到需要烘焙的物體上,通過組件參數(shù)進(jìn)行烘焙設(shè)置?12。
通過以上步驟,可以在Unity 2022版本中實(shí)現(xiàn)導(dǎo)航系統(tǒng)的烘焙功能,而無需直接使用Bake按鈕。這種變化旨在提高工作效率并簡(jiǎn)化導(dǎo)航系統(tǒng)的使用?13。
新版本的導(dǎo)航系統(tǒng)中沒有"Bake"按鈕,這是因?yàn)閁nity在2022.1版本中對(duì)導(dǎo)航系統(tǒng)進(jìn)行了改進(jìn)。在新版本中,導(dǎo)航系統(tǒng)的烘焙過程是自動(dòng)進(jìn)行的,無需手動(dòng)觸發(fā)。當(dāng)您對(duì)場(chǎng)景進(jìn)行更改或添加導(dǎo)航代理時(shí),Unity會(huì)自動(dòng)檢測(cè)并更新導(dǎo)航數(shù)據(jù)。因此,您無需手動(dòng)進(jìn)行烘焙操作,導(dǎo)航系統(tǒng)會(huì)自動(dòng)處理。這樣可以提高工作效率并簡(jiǎn)化導(dǎo)航系統(tǒng)的使用。如果您在使用新版本的Unity時(shí)遇到了導(dǎo)航相關(guān)的問題,請(qǐng)?zhí)峁└嘣敿?xì)信息,以便我們能夠更好地幫助您解決問題。
2.1.3 bake按鈕的位置
2.2 總結(jié) unity2022后版本如何實(shí)現(xiàn)Navmesh 的地圖 bake烘焙
2.2.1 unity 2022之前
- 選擇要烘焙的gameObject 右上角 靜態(tài)static,然后 Navigation static
- 然后,在windows下打開AI,打開Navigation , 里面有 Navigation agent 和 bake按鈕
2.2.1 unity 2022之后
- 玩家角色身上,添加 NavMeshAgent 的component
- 游戲場(chǎng)景里只需要1個(gè)物體,比如我這的wall,選擇一個(gè)NavMeshSurface.包含bake按鈕,也在這兒
- 在windows下打開AI,打開Navigation ,里面只有?Navigation agent 、
- 按前面的bake按鈕
2.3 如果遇到 window / 下面沒有AI菜單的情況,解決辦法
- 如果遇到 window / 下面沒有AI菜單的情況, 是安裝unity時(shí)沒安裝這個(gè)功能包。我就遇到了這個(gè)問題
- 需要先打開 package manager ,然后,在unity的包下搜索 navigation
- 然后安裝下就有了
3 地圖測(cè)試導(dǎo)航尋路準(zhǔn)備
3.1 做一些障礙物 和 樓梯等
- 讓地圖有些區(qū)域不能直接通過,比如加墻阻隔
- 需要通過樓梯,斜坡才能通過
4 生成地圖網(wǎng)格
4.1 地圖上1個(gè)物體添加新的component : nav mesh surface
- 錯(cuò)誤:每個(gè)需要參與尋路的 gameObject 都增加一個(gè)新component : nav mesh agent
- 正確,只需要在場(chǎng)景內(nèi)的一個(gè)gameObject 新建增加一個(gè)新component : nav mesh surface即可。 實(shí)測(cè)不需要每個(gè)物體上都添加
- 然后有bake按鈕,點(diǎn)擊,全部進(jìn)行了bake
4.2 navigation? Agent設(shè)置
- 其中 agents 就是指 尋路的主體,依據(jù)這個(gè)做的尋路是否可以通過
- 也就是說,尋路導(dǎo)航,是為主角player (大小,身高)量身定做的。而其他單位,比如怪物,NPC等不會(huì)受到這些尋路的影響。
4.3 可以設(shè)置 多種不同體型的 agent 數(shù)據(jù)
- 多種不同體型的 agent 數(shù)據(jù),相當(dāng)于多個(gè)模板
- 具體的不同的游戲內(nèi)角色,可以選擇屬于哪個(gè)模板agent
然后不同的導(dǎo)航物體,可以選擇屬于哪一類
4.4?navigation? Agent的詳細(xì)設(shè)置
angent的形狀,是一個(gè)圓柱形的,和 unity編輯器里的一樣
而不是看起來的形狀
5 題外話:總結(jié)關(guān)于一個(gè)gameObject在游戲里有多個(gè)形象
同樣1個(gè)gameObject
- mesh render 決定的外觀看起來什么樣,比如外觀的形狀
- collider決定的碰撞時(shí),此物體的樣子,比如也也時(shí)膠囊
- angent的形狀 決定navigation 尋路導(dǎo)航的這個(gè)物體的樣子,比如圓柱形
6 用腳本實(shí)現(xiàn)移動(dòng)時(shí)導(dǎo)航效果
6.1 具體內(nèi)容
6.1.1 獲得點(diǎn)擊位置
- 點(diǎn)擊目標(biāo)點(diǎn),獲得點(diǎn)擊點(diǎn),仍然使用之前的,攝像機(jī)射線 ray
? ? ? ? ? ? Ray ray1=Camera.main.ScreenPointToRay(Input.mousePosition);
? ? ? ? ? ? RaycastHit hit;
? ? ? ? ? ? if(Physics.Raycast(ray1,out hit))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //點(diǎn)擊位置
? ? ? ? ? ? ? ? Vector3 point1=hit.point;
6.1.2實(shí)現(xiàn)導(dǎo)航移動(dòng)
- //獲取導(dǎo)航代理人
- agent1=GetComponent<NavMeshAgent>();
- agent1.SetDestination(point1);
6.2 腳本內(nèi)容
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;public class TestNavMeshAgent : MonoBehaviour
{private NavMeshAgent agent1;// Start is called before the first frame updatevoid Start(){//獲取導(dǎo)航代理人agent1=GetComponent<NavMeshAgent>();}// Update is called once per framevoid Update(){//如果點(diǎn)擊鼠標(biāo)左鍵 if (Input.GetMouseButtonDown(0)){Ray ray1=Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray1,out hit)){//點(diǎn)擊位置Vector3 point1=hit.point;//agent1.SetDestination(point1);}}}
}
6.3 報(bào)錯(cuò)處理
- 測(cè)試時(shí),遇到這個(gè),我沒更新,點(diǎn)了X
6.4 測(cè)試效果 OK
- 可以實(shí)現(xiàn)智能尋路效果
- 和按鍵移動(dòng)的差別,按鍵移動(dòng)可以從墻上跳下到對(duì)面去
- 但是點(diǎn)擊移動(dòng),攝像機(jī)射線這種方法,角色在墻上也無法移動(dòng)到對(duì)面