Unity中使物體自動尋路的方法


在做一個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)));

注1:不管哪種方法,都要將這些代碼文件和enemy綁定在一起。

注2:雖然這三種方法都可行,但由於我初學unity,對它們的性能優劣以及差別並不了解,因此這些還有待研究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM