Variables
acceleration
類型:float。
代理的最大加速度。代理并不是精確的按照被navigation system計(jì)算出來的直線片段行走,而是使用路點(diǎn)作為中間目的地。這個(gè)值是代理在向下一個(gè)路點(diǎn)移動(dòng)時(shí)的最大加速的值。(跟現(xiàn)實(shí)世界一樣,代理按照這個(gè)加速度增加自己的速度,直到最大速度)。
angularSpeed
類型:float。
代理的最高旋轉(zhuǎn)速度。這是當(dāng)代理繞著路點(diǎn)定義的"corner"旋轉(zhuǎn)時(shí)的最大速率。真正旋轉(zhuǎn)時(shí)的弧度(circle)也受到代理的速度和最大加速度影響。
areaMask
類型:int
指定哪一個(gè)NavMesh區(qū)域(areas)是可用的。改變areaMask將會(huì)使路徑陳舊。
這是一個(gè)位域。
(這個(gè)值可以在游戲中被修改,立即生效)
autoBraking
類型:bool
代理是否自動(dòng)停止從而避免越過目的地?
如果代理需要在目的點(diǎn)附近著陸(land close),那么他必須及時(shí)停止避免越過或者無限的圍著目標(biāo)區(qū)域按軌道運(yùn)行。如果這個(gè)屬性被設(shè)置為true,當(dāng)代理到達(dá)目的地附近時(shí)就會(huì)自動(dòng)停止。
autoRepath
類型:bool
如果當(dāng)前的路徑變成無效時(shí),代理是否重新獲得一個(gè)路徑?
當(dāng)代理到達(dá)一個(gè)路徑片段的結(jié)尾和路徑陳舊時(shí),一個(gè)新的路徑需要被計(jì)算。
(這個(gè)值還不知道到底有什么效果,在游戲中,當(dāng)areaMask改變,路徑陳舊時(shí),路徑會(huì)被重新計(jì)算,立即發(fā)生)
autoTraverseOffMeshLink
類型:bool
Off-mesh links被用來鏈接不連續(xù)的NavMesh區(qū)域。通常情況下,一個(gè)角色應(yīng)該可以自動(dòng)的通過或穿過一個(gè)環(huán)節(jié)(link),而這時(shí)這個(gè)屬性被設(shè)置為true。然而他也可以被設(shè)置為false當(dāng)需要一些特定的控制的時(shí)候。
avoidancePriority
類型:int
躲避優(yōu)先級(jí)
當(dāng)代理是一個(gè)障礙物時(shí),級(jí)別低的代理被忽視。有效的范圍是從0到99:最終要=0,最不重要=99,默認(rèn)=50
(注意:以下都是基于沒有剛體的情況下
1、如果障礙物是不會(huì)移動(dòng)的,那么請(qǐng)?jiān)赽ake時(shí)候連同地形一起bake,這樣就會(huì)生成較好的navmesh
2、如果障礙物需要移動(dòng),那么請(qǐng)?jiān)谡系K物上添加agent,并設(shè)置其大小,然后設(shè)置avoidancePriority,低優(yōu)先級(jí)的將被高優(yōu)先級(jí)的agent強(qiáng)行推開)
baseOffset
類型:float
相對(duì)于所擁有的游戲?qū)ο蟮拇怪蔽灰啤?/p>
(正值則代理在游戲?qū)ο蟮南路?,?fù)值在上方)
currentOffMeshLinkData
類型:OffMeshLinkData
當(dāng)前的OffMeshLinkData.。(結(jié)構(gòu)體)
如果代理沒有在一個(gè)OffMeshLink上,OffMeshLinkData被標(biāo)記為無效。
desiredVelocity
類型:Vector3
期望速度 只讀。
Destination
類型:Vector3
設(shè)置或者獲得代理的目的點(diǎn),世界坐標(biāo)系。
獲得:
返回設(shè)置給代理的目的點(diǎn)。
?如果一個(gè)目的點(diǎn)被設(shè)置了并且尋路過程還沒結(jié)束,將會(huì)返回一個(gè)有效的,離預(yù)先設(shè)置的位置(position)最近的navmesh位置。
?如果代理沒有路徑或被請(qǐng)求的路徑,返回代理自己的位置。
?如果代理沒有映射到navmesh,返回infinity。
設(shè)置:
請(qǐng)求代理移動(dòng)到離目的點(diǎn)最近的有效的位置。
? 路徑結(jié)果可能是無效的直到幾幀之后。使用pathPending獲取結(jié)果。
? 如果找不到一個(gè)有效的最近的位置,將不會(huì)請(qǐng)求路徑。使用SetDestination并且檢查返回值,如果你需要明確的掌握這些情況。
using UnityEngine;
[RequireComponent(typeof(NavMeshAgent))]
public class FollowTarget : MonoBehaviour
{
public Transform target; Vector3 destination; NavMeshAgent agent;
void Start()
{
// Cache agent component and destination
agent = GetComponent<NavMeshAgent>();
destination = agent.destination;
}
void Update()
{
// Update destination if the target moves one unit
if (Vector3.Distance(destination, target.position) > 1.0f)
{
destination = target.position;
agent.destination = destination;
}
}
}
hasPath
類型:bool
當(dāng)前代理是否有路徑?(只讀)
height
類型:float
代理在障礙物下可以通過的高度。
isOnNavMesh
類型:bool
代理最近一定會(huì)在navmesh上嗎?(只讀)
這個(gè)屬性將被設(shè)置為true,如果代理因?yàn)槟承┰虿荒芙壎ǖ絥avmesh。
(這里文檔說反了,這個(gè)屬性值應(yīng)該是false)
isOnOffMeshLink
類型:bool
代理當(dāng)前的位置在一個(gè)OffMeshLink上嗎?(只讀)
當(dāng)穿過link時(shí)客戶的運(yùn)動(dòng)需要被知道而autoTraverseOffMeshLink是false的時(shí)候這個(gè)值很有用。
isPathStale
類型:bool
當(dāng)前路徑是否陳舊(只讀)
當(dāng)為true,路徑可能不再有效或者最優(yōu)。這個(gè)標(biāo)簽會(huì)被設(shè)置,如果:areaMask有任意的改變,任意一個(gè)OffMeshLink設(shè)為可用或不可用,或者NavMeshAreas的消耗(costs)被改變。
nextOffMeshLinkData
類型:OffMeshLinkData
當(dāng)前路徑的下一個(gè)OffMeshLinkData。
如果當(dāng)前路徑不包含一個(gè)OffMeshLink,OffMeshLinkData被標(biāo)記為無效的
nextPosition
類型:Vector3
獲取或者設(shè)置網(wǎng)格代理的仿真位置(position)。
位置向量使用世界坐標(biāo)系的坐標(biāo)和單位。
nextPosition是與Transform.position相結(jié)合的。在默認(rèn)情況下,當(dāng)腳本函數(shù)Update被調(diào)用的時(shí)候,網(wǎng)格代理的Transform position將會(huì)與內(nèi)部的仿真位置相匹配。這種結(jié)合可以通過設(shè)置updatePosition打開或者關(guān)閉。
當(dāng)updatePosition為true,Transfom.position反映為仿真位置,為false的時(shí)候Transfom.position和網(wǎng)格代理是不同步的并且一般情況下你將會(huì)看到他們兩個(gè)是不同的。當(dāng)updatePosition被設(shè)置回為打開,Transform,position將會(huì)立即移動(dòng)并匹配為nextPosition。
通過設(shè)置nextPosition你可以立即控制內(nèi)部代理位置(position)應(yīng)該在哪。代理會(huì)被移動(dòng)到那個(gè)位置,在navmesh的范圍內(nèi)。只有當(dāng)位置是連續(xù)的更新和計(jì)算的時(shí)候才是有用的。
(從名字來看,下一個(gè)位置,好像應(yīng)該是下一步應(yīng)該走的位置,然而文檔看起來又沒有這么解釋,然而好像又可以這么理解。如果在update中打印nextPosition和代理當(dāng)前的位置,會(huì)發(fā)現(xiàn)他們是一樣的。如果將updatePosition設(shè)為false在打印,會(huì)發(fā)現(xiàn)nextPosition在持續(xù)變化,最終會(huì)非常接近目標(biāo)點(diǎn),而代理卻一動(dòng)不動(dòng),位置保持不變。如果設(shè)置nextPosition代理會(huì)理解移動(dòng)到設(shè)置的位置。)
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
void Start()
{
// Update the transform position explicitly in the OnAnimatorMove callback
GetComponent<NavMeshAgent>().updatePosition = false;
}
void OnAnimatorMove()
{
transform.position = GetComponent<NavMeshAgent>().nextPosition;
}
}
此外他可以被用來立即改變代理的位置——特別是代理的移動(dòng)是通過其他什么來控制的時(shí)候。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public bool agentIsControlledByOther;
void Update()
{
var agent = GetComponent<NavMeshAgent>();
agent.updatePosition = !agentIsControlledByOther;
if (agentIsControlledByOther)
{
GetComponent<NavMeshAgent>().nextPosition = transform.position;
}
}
}
obstacleAvoidanceType
類型:
Path
類型:NavMeshPath
設(shè)置或者獲取當(dāng)前路徑。
對(duì)GUI,調(diào)試,以及其他想要獲得經(jīng)過導(dǎo)航系統(tǒng)計(jì)算的路徑的點(diǎn)的目的,這個(gè)屬性會(huì)非常有用。此外,通常也可以給代理設(shè)置一個(gè)由用戶代碼創(chuàng)建的路徑讓代理去走。例如,當(dāng)為警衛(wèi)設(shè)置巡邏路線的的時(shí)候與其兩點(diǎn)之間不如設(shè)置當(dāng)前路徑。
pathPending
類型:bool
進(jìn)程中的路徑正在被計(jì)算但是還沒轉(zhuǎn)備好?(只讀)
pathStatus
類型:NavMeshPathStatus
當(dāng)前路徑的狀態(tài)(完成,局部或無效)
radius
類型:float
代理的避讓半徑。
這是代理的“私人空間”,當(dāng)代理作為障礙物時(shí),其他代理不能從中穿過。
remainingDistance
類型:float
在當(dāng)前路徑中,代理的位置和目標(biāo)位置的距離(只讀)
如果剩下的距離是未知的那么這個(gè)值是infinity
speed
類型:float
在一條路徑上行走時(shí)的最大移動(dòng)速率。
很典型的,沿路徑行走時(shí),代理需要加速或減速。速率受限于路段的長(zhǎng)度和加速的時(shí)間和剎車(brake),但是速率不會(huì)超過這個(gè)屬性被設(shè)置的值即使在一段又長(zhǎng)又直的路徑上。
steeringTarget
類型:Vector3
獲得路徑上的當(dāng)前轉(zhuǎn)向點(diǎn)。(只讀)
他是沿路的下一個(gè)轉(zhuǎn)角或?qū)ぢ返慕K點(diǎn)。
除非代理在一個(gè)OffMeshLink上移動(dòng),否則在代理和steeringTarget之間是筆直的路徑。
當(dāng)接近一個(gè)OffMeshLink時(shí),他的值是代理將要進(jìn)入link的位置。當(dāng)代理環(huán)游一個(gè)OffMeshLink時(shí),他的值是代理將要離開link的位置。
stoppingDistance
類型:float
當(dāng)距離目標(biāo)位置這個(gè)距離的時(shí)候停止。
幾乎不可能很精確的著陸到目標(biāo)點(diǎn),所以這個(gè)屬性被用來設(shè)置一個(gè)可接受的半徑,在這個(gè)半徑內(nèi)代理會(huì)停止。一個(gè)較大的stoppingDistance可以使代理在路徑末端有更多的策略空間,以避免突然的停止,轉(zhuǎn)彎或其他不正常的AI行為。
updatePosition
類型:bool
獲取或設(shè)置transform position是否與模擬的代理位置同步。默認(rèn)為true。
當(dāng)為true:改變transform position將影響模擬位置,反之亦然。
當(dāng)為false:模擬位置將不再被用于transform position,反之亦然。
如果想通過腳本直接控制transform position,設(shè)置updatePosition為false。
當(dāng)為真,transform將被移動(dòng)到模擬位置。這種情況下,代理將被迫停留在navmesh表面。
updateRotation
類型:bool
代理是否更新方向。
velocity
類型:Vector3
獲取NavMeshAgent組件的當(dāng)前速度,或者手動(dòng)為代理設(shè)置一個(gè)速度。
讀取這個(gè)變量將會(huì)返回基于群體仿真的代理的當(dāng)前速度速度。
設(shè)置這個(gè)變量將會(huì)重寫仿真(simulation),并且命令代理立即使用指定的速度移動(dòng)。當(dāng)代理使用速度來控制時(shí),他的運(yùn)動(dòng)仍然受限于NavMesh。
Setting the velocity directly can be used for implementing player characters which are moving on NavMesh and affecting the rest of the simulated crowd。此外,設(shè)置優(yōu)先級(jí)太高(值越小優(yōu)先級(jí)越高),會(huì)使其他模擬代理更早的避開受控的代理。
當(dāng)手動(dòng)控制代理的時(shí)候我們建議每一幀都設(shè)置速度。如果釋放控制權(quán)給模擬器,設(shè)置速度為0。如果速度被設(shè)置為某個(gè)值,然后停止了更新,模擬器將會(huì)撿起控制權(quán)然后緩慢的減速。
注意讀取速度將會(huì)返回來自模擬器的值。如果你設(shè)置了一個(gè)值,下一幀才會(huì)生效。因?yàn)榉祷氐乃俣葋碜阅M器,他可能跟你設(shè)置的不一樣。
Units/s,世界坐標(biāo)系。
Public Functions
ActivateCurrentOffMeshLink
類型:void ActivateCurrentOffMeshLink(bool activated);
參數(shù):
activated link是否被激活?
使當(dāng)前的off-mesh link可用或者不可用。
這個(gè)函數(shù)激活或撤銷代理當(dāng)前正在等待的off-mesh link。這被用來準(zhǔn)許通過一個(gè)新開發(fā)的游戲世界的區(qū)域或者模擬創(chuàng)造或移除一個(gè)通往一個(gè)區(qū)域的障礙。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void OpenDiscoveredArea(Hashtable areasDiscovered)
{
if (agent.isOnOffMeshLink)
if (areasDiscovered.ContainsKey(agent.currentOffMeshLinkData.offMeshLink.name))
agent.ActivateCurrentOffMeshLink(true);
}
}
CalculatePath
類型:bool CalculatePath(Vector3 targetPosition, NavMeshPath path)
參數(shù):
targetPositon 路徑要求的重點(diǎn)位置。
path 作為結(jié)果的路徑
返回true如果路徑被找到。
計(jì)算一段路徑直到指定的點(diǎn)然后保存路徑結(jié)果。
這個(gè)函數(shù)被用來提前計(jì)劃一段路徑以避免在游戲中當(dāng)需要尋路時(shí)發(fā)生延遲。另外一個(gè)用處是在代理移動(dòng)之前檢查目標(biāo)位置是否可達(dá)。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public Transform target;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>(); NavMeshPath path = new NavMeshPath();
agent.CalculatePath(target.position, path);
if (path.status == NavMeshPathStatus.PathPartial)
{
}
}
}
CompleteOffMeshLink
類型:void CompleteOffMeshLink()
結(jié)束當(dāng)前OffMeshLink上的移動(dòng)。
代理會(huì)移動(dòng)到離當(dāng)前OffMeshLink另一端最近的有效的位置。
如果代理不在一個(gè)OffMeshLink上,CompleteOffMeshLink()沒有任何效果。
當(dāng)autoTraverseOffMeshLink不可用時(shí),代理會(huì)暫停在一個(gè)off-mesh link上直到這個(gè)函數(shù)被調(diào)用。當(dāng)用戶自己控制通過OffMeshLinks時(shí)會(huì)用到它。
using UnityEngine;
using System.Collections;
public enum OffMeshLinkMoveMethod
{
Teleport,
NormalSpeed,
Parabola
}
[RequireComponent(typeof(NavMeshAgent))]
public class AgentLinkMover : MonoBehaviour
{
public OffMeshLinkMoveMethod method = OffMeshLinkMoveMethod.Parabola;
IEnumerator Start()
{
NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.autoTraverseOffMeshLink = false;
while (true)
{
if (agent.isOnOffMeshLink)
{
if (method == OffMeshLinkMoveMethod.NormalSpeed)
yield return StartCoroutine(NormalSpeed(agent));
else if (method == OffMeshLinkMoveMethod.Parabola)
yield return StartCoroutine(Parabola(agent, 2.0f, 0.5f));
agent.CompleteOffMeshLink();
}
yield return null;
}
}
IEnumerator NormalSpeed(NavMeshAgent agent)
{
OffMeshLinkData data = agent.currentOffMeshLinkData; Vector3 endPos = data.endPos Vector3.up* agent.baseOffset;
while (agent.transform.position != endPos)
{
agent.transform.position = Vector3.MoveTowards(agent.transform.position, endPos, agent.speed * Time.deltaTime);
yield return null;
}
}
IEnumerator Parabola(NavMeshAgent agent, float height, float duration)
{
OffMeshLinkData data = agent.currentOffMeshLinkData; Vector3 startPos = agent.transform.position; Vector3 endPos = data.endPos Vector3.up* agent.baseOffset;
float normalizedTime = 0.0f;
while (normalizedTime < 1.0f)
{
float yOffset = height * 4.0f * (normalizedTime - normalizedTime * normalizedTime);
agent.transform.position = Vector3.Lerp(startPos, endPos, normalizedTime) yOffset* Vector3.up;
normalizedTime = Time.deltaTime / duration;
yield return null;
}
}
}
FindClosestEdge
類型:bool FindClosestEdge(out NavMeshHit hit);
參數(shù):
hit 掌握定位結(jié)果的性能。
返回:
True,如果最近的邊緣被找到。
定位最近的navmesh邊緣。
返回的NavMeshHit 包含最近的邊緣上的最近的點(diǎn)的位置和細(xì)節(jié)。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
TakeCover();
}
void TakeCover()
{
NavMeshHit hit;
if (agent.FindClosestEdge(out hit))
agent.SetDestination(hit.position);
}
}
GetAreaCost
類型:float GetAreaCost(int areaIndex)
參數(shù):
areaIndex 區(qū)域索引
返回:
指定的區(qū)域索引當(dāng)前的消耗。
當(dāng)通過特定區(qū)域的時(shí)候獲得消耗以方便路徑計(jì)算。
路徑的消耗就是當(dāng)涉及計(jì)算的時(shí)候的“困難”數(shù)量--最短的路徑未必就是最優(yōu)選如果需要穿過困難地形,比如泥潭、雪地等。在Unity中區(qū)域的不同類型用navmesh areas來表示。注意路徑消耗只適用于選擇路徑,在代理沿路行走時(shí)并不會(huì)自動(dòng)的改變其移動(dòng)速度。確實(shí),路徑消耗能夠指出其他因素,例如危險(xiǎn)或能見度。
Move
類型:void Move(Vector3 offset)
參數(shù):
offset 相對(duì)的移動(dòng)向量。
申請(qǐng)一個(gè)相對(duì)當(dāng)前位置的移動(dòng)。
如果代理有一個(gè)路徑他將被校正。
Raycast
類型:bool Raycast(Vector3 targetPosition, out NavMeshHit hit)
參數(shù):
targetPosition 將要移動(dòng)到的終點(diǎn)
hit 被射線發(fā)現(xiàn)的障礙物的屬性(如果有)
返回:
True如果代理和目標(biāo)位置之間有障礙物,否則false。
在不移動(dòng)代理的前提下,在navmesh中向著目標(biāo)位置追蹤一條筆直的路徑。如果沿路遇到一個(gè)障礙物,那么將返回true并且障礙物的位置信息和其他細(xì)節(jié)將會(huì)保存在hit參數(shù)中。這個(gè)函數(shù)可以用來檢查角色是否一眼就能看到目標(biāo)。這個(gè)函數(shù)和Physics.Raycast非常接近
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public Transform target;
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
NavMeshHit hit;
if (!agent.Raycast(target.position, out hit))
{
}
}
}
ResetPath
類型:void ResetPath()
清除當(dāng)前路徑。
路徑清除之后代理不會(huì)尋找一個(gè)新的路徑直到SetDestination 被調(diào)用。
注意當(dāng)調(diào)用這個(gè)函數(shù)時(shí)代理在OffMeshLink上,則link會(huì)立即被完成。
Resume()
類型:void Resume()
當(dāng)一段暫停之后重新開始沿著當(dāng)前路徑移動(dòng)。
SamplePathPosition
類型:bool SamplePathPosition(int areaMask, float maxDistance, out NavMeshHit hit)
參數(shù):
areaMask 一個(gè)位域標(biāo)志,指定了尋路是哪個(gè)區(qū)域可以通過。
maxDistance 超出這段距離則終止搜索路徑。
hit 保存結(jié)果地理位置的屬性。
返回:
True如果在maxDistance之前結(jié)束,否則false。
沿著當(dāng)前路徑取樣一個(gè)位置。
這個(gè)函數(shù)朝著當(dāng)前路徑向前看一段指定的距離。那個(gè)位置的網(wǎng)格的細(xì)節(jié)將會(huì)返回到一個(gè)NavMeshHit對(duì)象中。這個(gè)函數(shù)可以被用來,例如,在角色即將到達(dá)之前檢查地表類型--一個(gè)角色想要通過有水的地方的時(shí)候可能要舉起槍仰起頭。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public Transform target;
public NavMesh mesh;
private NavMeshAgent agent;
private int waterMask;
void Start()
{
agent = GetComponent<NavMeshAgent>();
waterMask = 1 << NavMesh.GetAreaFromName("Water");
agent.SetDestination(target.position);
}
void Update()
{
NavMeshHit hit;
// Check all areas one length unit ahead.
if (!agent.SamplePathPosition(NavMesh.AllAreas, 1.0F, out hit))
if ((hit.mask & waterMask) != 0)
{
// Water detected along the path...
}
}
}
SetAreaCost
類型:void SetAreaCost(int areaIndex, float areaCost)
參數(shù):
areaIndex 區(qū)域索引
areaCost 指定的區(qū)域的新的消耗
設(shè)置穿過某種類型的區(qū)域時(shí)的消耗。
如果你啟用或廢除代理,那么消耗將會(huì)被重置為默認(rèn)值。
SetDestination
類型:bool SetDestination(Vector3 target)
參數(shù):
target 導(dǎo)航到的目標(biāo)點(diǎn)。
返回:
True如果目標(biāo)地址請(qǐng)求成功,否則false。
設(shè)置或更新目的地,因此可以出發(fā)一個(gè)新路徑的計(jì)算。
注意新路徑可能不會(huì)立即生效直到幾幀之后。當(dāng)路徑計(jì)算完成之后,pathPending將會(huì)是true。如果一段有效的路徑變?yōu)閍vailable 代理將重新開始移動(dòng)。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
private NavMeshAgent agent;
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
RaycastHit hit;
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
agent.SetDestination(hit.point);
}
}
}
SetPath
類型:bool SetPath(NavMeshPath path)
參數(shù):
path 新的尋路路徑
返回:
true如果指定路徑成功
指定一段新路徑給代理。
如果指定路徑成功代理會(huì)重新朝著新目標(biāo)移動(dòng)。如果指定失敗路徑被清空。
Stop
類型:void Stop()
停止代理沿著當(dāng)前路徑移動(dòng)。