Variables
acceleration
類型:float敲茄。
代理的最大加速度。代理并不是精確的按照被navigation system計算出來的直線片段行走副签,而是使用路點作為中間目的地遥椿。這個值是代理在向下一個路點移動時的最大加速的值基矮。(跟現(xiàn)實世界一樣,代理按照這個加速度增加自己的速度修壕,直到最大速度)愈捅。
angularSpeed
類型:float。
代理的最高旋轉速度慈鸠。這是當代理繞著路點定義的"corner"旋轉時的最大速率蓝谨。真正旋轉時的弧度(circle)也受到代理的速度和最大加速度影響。
areaMask
類型:int
指定哪一個NavMesh區(qū)域(areas)是可用的青团。改變areaMask將會使路徑陳舊譬巫。
這是一個位域。
(這個值可以在游戲中被修改督笆,立即生效)
autoBraking
類型:bool
代理是否自動停止從而避免越過目的地芦昔?
如果代理需要在目的點附近著陸(land close),那么他必須及時停止避免越過或者無限的圍著目標區(qū)域按軌道運行娃肿。如果這個屬性被設置為true咕缎,當代理到達目的地附近時就會自動停止。
autoRepath
類型:bool
如果當前的路徑變成無效時料扰,代理是否重新獲得一個路徑凭豪?
當代理到達一個路徑片段的結尾和路徑陳舊時,一個新的路徑需要被計算晒杈。
(這個值還不知道到底有什么效果嫂伞,在游戲中,當areaMask改變拯钻,路徑陳舊時帖努,路徑會被重新計算,立即發(fā)生)
autoTraverseOffMeshLink
類型:bool
Off-mesh links被用來鏈接不連續(xù)的NavMesh區(qū)域粪般。通常情況下拼余,一個角色應該可以自動的通過或穿過一個環(huán)節(jié)(link),而這時這個屬性被設置為true亩歹。然而他也可以被設置為false當需要一些特定的控制的時候姿搜。
avoidancePriority
類型:int
躲避優(yōu)先級
當代理是一個障礙物時,級別低的代理被忽視捆憎。有效的范圍是從0到99:最終要=0舅柜,最不重要=99,默認=50
(注意:以下都是基于沒有剛體的情況下
1躲惰、如果障礙物是不會移動的致份,那么請在bake時候連同地形一起bake,這樣就會生成較好的navmesh
2、如果障礙物需要移動础拨,那么請在障礙物上添加agent,并設置其大小氮块,然后設置avoidancePriority绍载,低優(yōu)先級的將被高優(yōu)先級的agent強行推開)
baseOffset
類型:float
相對于所擁有的游戲對象的垂直位移。
(正值則代理在游戲對象的下方滔蝉,負值在上方)
currentOffMeshLinkData
類型:OffMeshLinkData
當前的OffMeshLinkData.击儡。(結構體)
如果代理沒有在一個OffMeshLink上,OffMeshLinkData被標記為無效蝠引。
desiredVelocity
類型:Vector3
期望速度 只讀阳谍。
Destination
類型:Vector3
設置或者獲得代理的目的點,世界坐標系螃概。
獲得:
返回設置給代理的目的點矫夯。
?如果一個目的點被設置了并且尋路過程還沒結束,將會返回一個有效的吊洼,離預先設置的位置(position)最近的navmesh位置训貌。
?如果代理沒有路徑或被請求的路徑,返回代理自己的位置冒窍。
?如果代理沒有映射到navmesh递沪,返回infinity。
設置:
請求代理移動到離目的點最近的有效的位置综液。
? 路徑結果可能是無效的直到幾幀之后款慨。使用pathPending獲取結果。
? 如果找不到一個有效的最近的位置意乓,將不會請求路徑樱调。使用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
當前代理是否有路徑?(只讀)
height
類型:float
代理在障礙物下可以通過的高度圣猎。
isOnNavMesh
類型:bool
代理最近一定會在navmesh上嗎士葫?(只讀)
這個屬性將被設置為true,如果代理因為某些原因不能綁定到navmesh送悔。
(這里文檔說反了慢显,這個屬性值應該是false)
isOnOffMeshLink
類型:bool
代理當前的位置在一個OffMeshLink上嗎?(只讀)
當穿過link時客戶的運動需要被知道而autoTraverseOffMeshLink是false的時候這個值很有用欠啤。
isPathStale
類型:bool
當前路徑是否陳舊(只讀)
當為true荚藻,路徑可能不再有效或者最優(yōu)。這個標簽會被設置洁段,如果:areaMask有任意的改變应狱,任意一個OffMeshLink設為可用或不可用,或者NavMeshAreas的消耗(costs)被改變祠丝。
nextOffMeshLinkData
類型:OffMeshLinkData
當前路徑的下一個OffMeshLinkData疾呻。
如果當前路徑不包含一個OffMeshLink除嘹,OffMeshLinkData被標記為無效的
nextPosition
類型:Vector3
獲取或者設置網(wǎng)格代理的仿真位置(position)。
位置向量使用世界坐標系的坐標和單位岸蜗。
nextPosition是與Transform.position相結合的尉咕。在默認情況下,當腳本函數(shù)Update被調用的時候璃岳,網(wǎng)格代理的Transform position將會與內部的仿真位置相匹配年缎。這種結合可以通過設置updatePosition打開或者關閉。
當updatePosition為true矾睦,Transfom.position反映為仿真位置晦款,為false的時候Transfom.position和網(wǎng)格代理是不同步的并且一般情況下你將會看到他們兩個是不同的。當updatePosition被設置回為打開枚冗,Transform,position將會立即移動并匹配為nextPosition缓溅。
通過設置nextPosition你可以立即控制內部代理位置(position)應該在哪。代理會被移動到那個位置赁温,在navmesh的范圍內坛怪。只有當位置是連續(xù)的更新和計算的時候才是有用的。
(從名字來看股囊,下一個位置袜匿,好像應該是下一步應該走的位置,然而文檔看起來又沒有這么解釋稚疹,然而好像又可以這么理解居灯。如果在update中打印nextPosition和代理當前的位置,會發(fā)現(xiàn)他們是一樣的内狗。如果將updatePosition設為false在打印怪嫌,會發(fā)現(xiàn)nextPosition在持續(xù)變化,最終會非常接近目標點柳沙,而代理卻一動不動岩灭,位置保持不變。如果設置nextPosition代理會理解移動到設置的位置赂鲤。)
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;
}
}
此外他可以被用來立即改變代理的位置——特別是代理的移動是通過其他什么來控制的時候噪径。
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
設置或者獲取當前路徑。
對GUI数初,調試找爱,以及其他想要獲得經(jīng)過導航系統(tǒng)計算的路徑的點的目的,這個屬性會非常有用泡孩。此外车摄,通常也可以給代理設置一個由用戶代碼創(chuàng)建的路徑讓代理去走。例如,當為警衛(wèi)設置巡邏路線的的時候與其兩點之間不如設置當前路徑练般。
pathPending
類型:bool
進程中的路徑正在被計算但是還沒轉備好?(只讀)
pathStatus
類型:NavMeshPathStatus
當前路徑的狀態(tài)(完成矗漾,局部或無效)
radius
類型:float
代理的避讓半徑。
這是代理的“私人空間”薄料,當代理作為障礙物時敞贡,其他代理不能從中穿過。
remainingDistance
類型:float
在當前路徑中摄职,代理的位置和目標位置的距離(只讀)
如果剩下的距離是未知的那么這個值是infinity
speed
類型:float
在一條路徑上行走時的最大移動速率誊役。
很典型的,沿路徑行走時谷市,代理需要加速或減速蛔垢。速率受限于路段的長度和加速的時間和剎車(brake),但是速率不會超過這個屬性被設置的值即使在一段又長又直的路徑上迫悠。
steeringTarget
類型:Vector3
獲得路徑上的當前轉向點鹏漆。(只讀)
他是沿路的下一個轉角或尋路的終點。
除非代理在一個OffMeshLink上移動创泄,否則在代理和steeringTarget之間是筆直的路徑艺玲。
當接近一個OffMeshLink時,他的值是代理將要進入link的位置鞠抑。當代理環(huán)游一個OffMeshLink時饭聚,他的值是代理將要離開link的位置。
stoppingDistance
類型:float
當距離目標位置這個距離的時候停止搁拙。
幾乎不可能很精確的著陸到目標點秒梳,所以這個屬性被用來設置一個可接受的半徑,在這個半徑內代理會停止箕速。一個較大的stoppingDistance可以使代理在路徑末端有更多的策略空間酪碘,以避免突然的停止,轉彎或其他不正常的AI行為弧满。
updatePosition
類型:bool
獲取或設置transform position是否與模擬的代理位置同步婆跑。默認為true此熬。
當為true:改變transform position將影響模擬位置庭呜,反之亦然。
當為false:模擬位置將不再被用于transform position犀忱,反之亦然募谎。
如果想通過腳本直接控制transform position,設置updatePosition為false阴汇。
當為真数冬,transform將被移動到模擬位置。這種情況下,代理將被迫停留在navmesh表面拐纱。
updateRotation
類型:bool
代理是否更新方向铜异。
velocity
類型:Vector3
獲取NavMeshAgent組件的當前速度,或者手動為代理設置一個速度秸架。
讀取這個變量將會返回基于群體仿真的代理的當前速度速度揍庄。
設置這個變量將會重寫仿真(simulation),并且命令代理立即使用指定的速度移動东抹。當代理使用速度來控制時蚂子,他的運動仍然受限于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缭黔。此外食茎,設置優(yōu)先級太高(值越小優(yōu)先級越高),會使其他模擬代理更早的避開受控的代理馏谨。
當手動控制代理的時候我們建議每一幀都設置速度别渔。如果釋放控制權給模擬器,設置速度為0惧互。如果速度被設置為某個值钠糊,然后停止了更新,模擬器將會撿起控制權然后緩慢的減速壹哺。
注意讀取速度將會返回來自模擬器的值抄伍。如果你設置了一個值,下一幀才會生效管宵。因為返回的速度來自模擬器截珍,他可能跟你設置的不一樣。
Units/s箩朴,世界坐標系完残。
Public Functions
ActivateCurrentOffMeshLink
類型:void ActivateCurrentOffMeshLink(bool activated);
參數(shù):
activated link是否被激活咖城?
使當前的off-mesh link可用或者不可用。
這個函數(shù)激活或撤銷代理當前正在等待的off-mesh link。這被用來準許通過一個新開發(fā)的游戲世界的區(qū)域或者模擬創(chuàng)造或移除一個通往一個區(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 路徑要求的重點位置。
path 作為結果的路徑
返回true如果路徑被找到芝硬。
計算一段路徑直到指定的點然后保存路徑結果对碌。
這個函數(shù)被用來提前計劃一段路徑以避免在游戲中當需要尋路時發(fā)生延遲。另外一個用處是在代理移動之前檢查目標位置是否可達滥壕。
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()
結束當前OffMeshLink上的移動纸颜。
代理會移動到離當前OffMeshLink另一端最近的有效的位置。
如果代理不在一個OffMeshLink上绎橘,CompleteOffMeshLink()沒有任何效果胁孙。
當autoTraverseOffMeshLink不可用時,代理會暫停在一個off-mesh link上直到這個函數(shù)被調用。當用戶自己控制通過OffMeshLinks時會用到它涮较。
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 掌握定位結果的性能稠鼻。
返回:
True,如果最近的邊緣被找到。
定位最近的navmesh邊緣狂票。
返回的NavMeshHit 包含最近的邊緣上的最近的點的位置和細節(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ū)域索引當前的消耗。
當通過特定區(qū)域的時候獲得消耗以方便路徑計算苫亦。
路徑的消耗就是當涉及計算的時候的“困難”數(shù)量--最短的路徑未必就是最優(yōu)選如果需要穿過困難地形毛肋,比如泥潭、雪地等屋剑。在Unity中區(qū)域的不同類型用navmesh areas來表示润匙。注意路徑消耗只適用于選擇路徑,在代理沿路行走時并不會自動的改變其移動速度唉匾。確實孕讳,路徑消耗能夠指出其他因素,例如危險或能見度巍膘。
Move
類型:void Move(Vector3 offset)
參數(shù):
offset 相對的移動向量厂财。
申請一個相對當前位置的移動。
如果代理有一個路徑他將被校正峡懈。
Raycast
類型:bool Raycast(Vector3 targetPosition, out NavMeshHit hit)
參數(shù):
targetPosition 將要移動到的終點
hit 被射線發(fā)現(xiàn)的障礙物的屬性(如果有)
返回:
True如果代理和目標位置之間有障礙物璃饱,否則false。
在不移動代理的前提下肪康,在navmesh中向著目標位置追蹤一條筆直的路徑荚恶。如果沿路遇到一個障礙物,那么將返回true并且障礙物的位置信息和其他細節(jié)將會保存在hit參數(shù)中磷支。這個函數(shù)可以用來檢查角色是否一眼就能看到目標谒撼。這個函數(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()
清除當前路徑。
路徑清除之后代理不會尋找一個新的路徑直到SetDestination 被調用雾狈。
注意當調用這個函數(shù)時代理在OffMeshLink上廓潜,則link會立即被完成。
Resume()
類型:void Resume()
當一段暫停之后重新開始沿著當前路徑移動善榛。
SamplePathPosition
類型:bool SamplePathPosition(int areaMask, float maxDistance, out NavMeshHit hit)
參數(shù):
areaMask 一個位域標志辩蛋,指定了尋路是哪個區(qū)域可以通過。
maxDistance 超出這段距離則終止搜索路徑锭弊。
hit 保存結果地理位置的屬性堪澎。
返回:
True如果在maxDistance之前結束擂错,否則false味滞。
沿著當前路徑取樣一個位置。
這個函數(shù)朝著當前路徑向前看一段指定的距離。那個位置的網(wǎng)格的細節(jié)將會返回到一個NavMeshHit對象中剑鞍。這個函數(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ū)域的新的消耗
設置穿過某種類型的區(qū)域時的消耗便脊。
如果你啟用或廢除代理,那么消耗將會被重置為默認值光戈。
SetDestination
類型:bool SetDestination(Vector3 target)
參數(shù):
target 導航到的目標點哪痰。
返回:
True如果目標地址請求成功,否則false久妆。
設置或更新目的地晌杰,因此可以出發(fā)一個新路徑的計算。
注意新路徑可能不會立即生效直到幾幀之后筷弦。當路徑計算完成之后肋演,pathPending將會是true。如果一段有效的路徑變?yōu)閍vailable 代理將重新開始移動烂琴。
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如果指定路徑成功
指定一段新路徑給代理爹殊。
如果指定路徑成功代理會重新朝著新目標移動。如果指定失敗路徑被清空奸绷。
Stop
類型:void Stop()
停止代理沿著當前路徑移動梗夸。