在做一個FPS游戲時,需要敵方自動找到玩家方位並向玩家移動,在查找資料(並走了不少坑)后,我試了三個方法,經測試,這三個方法都能實現自動尋路功能。
方法一:使用Mathf.Lerp()方法
代碼很簡單:
//在enemy.cs(即敵方的腳本)中更新如下代碼:
Transmform m_transform; //獲得敵人組件
//在Update()函數中插入如下代碼
m_transform.position =
new Vector3(Mathf.Lerp(m_transform.position.x,m_layer.m_transform.position.x,m_speed * Time.delta)),
0,
Mathf.Lerp(m_transform.position.z,m_layer.m_transform.position.z,m_speed * Time.delta)));
//Mathf.Lerp(float a,float b,float t)函數表示:從點a以速度t移動至點b
這個方法似乎不需要自動尋路組件NavMeshAgent,不過NavMeshAgent用得更多一些,以下的兩個方法都是基於NavMeshAgent的。
設置網格自動尋路的步驟:
1.將要進行Bake(烘焙)的場景設置為static(一定要保證Navigation Static是被勾選的):

2.通過Window -> Navgaition打開Navigation界面進行烘焙:
點擊右下方的Bake(我第一次打開這個的時候一直沒注意到這個Bake選項,還以為是這個選項沒了!!!),等待它烘焙完成。還有另外一種烘焙方式,參見另一篇文章:http://blog.csdn.net/larry233/article/details/52022735
3.烘焙前:
烘焙后:

方法二:
簡單到不知道怎么形容這個方法…
代碼如下:
//先在Start()函數中獲得玩家的組件:
m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
//將自動尋路的目標設置為玩家所在位置
GetComponent<NavMeshAgent>().destination = m_player.m_transform.position;
方法三:使用NavMeshAgent.Move()方法
這個方法是我最初使用的,但是出了很多意想不到的問題,我在正確烘焙場景后解決了這個問題,並使該方法正確執行了。代碼如下:
NavMeshAgent m_agent; //尋路組件
... //省略中間代碼
//在Start()函數中獲得NavMeshAgent組件
void Start(){
...
m_agent = GetComponent<NavMeshAgent>();
}
//將敵方的速度轉化為以s為單位
float speed = m_speed * Time.delta * 0.1f;
m_agent.Move(m_transform.TransformDirection(new Vector3(0,0,speed)));
