1. 程式人生 > >我的Unity 3D之旅——第一人稱射擊遊戲(3)

我的Unity 3D之旅——第一人稱射擊遊戲(3)

四、敵人

1. 自動尋路。光有一個主角,我們的第一人稱射擊遊戲肯定是沒法玩的,所以還需要新增敵人。而為了遊戲更具有可玩性,敵人需要能夠追擊主角並攻擊主角。在很多遊戲中,經常需要敵人在複雜的地形環境中追著主角跑。而場景中經常會存在很多障礙物,這就AI要能夠找出到達目標地點的最短路徑,並且要能夠繞開障礙物。這就需要遊戲開發者編寫出一個完善的尋路演算法。然而在複雜的3D場景中,手寫尋路演算法是相當有挑戰性的,畢竟不是每個遊戲開發者都是演算法大師。幸運的是,Unity已經提供了一個非常實用的尋路功能,對於開發者而言,只需要較少的程式碼就可以輕鬆實現複雜的尋路功能。Unity的尋路系統分為兩部分,一是對場景進行設定使其滿足尋路的要求,二是設定尋路者。

2. 選擇場景模型(即level遊戲體),在Inspector視窗單擊Static選項旁的小三角彈出下拉選單,確保選中【Navigation Static】。只有選中Navigation Static的模型才會加入尋路計算。

3. 在選單欄選擇【Window】→【Navigation】開啟Navigation視窗進行設定。

【Object】主要用來定義模型,如果取消選中【Navigation Static】則該模型不會用作尋路計算。

【Bake】主要用來設定尋路條件,Agent Radius和Agent Height指尋路者的半徑和高度(採用了圓柱模型),Max Slope是最大爬坡坡度,Step Height是最大爬梯高度,Drop Height是可以跳落的高度極限,Jump Distance是可以跳躍的距離極限。

【Areas】定義了【Navigation Area】的取值範圍,Unity內建了Walkable、Not Walkable、Jump三種尋路區域,可以自定義更多,最多31種。

4. 設定完成後,選擇Bake對地形進行計算。選擇Clear會清除計算結果。計算出來的尋路資料會被儲存為一個檔案並與當前關卡相關聯,有點類似LightMap。

5. 在Project視窗Assets/Prefabs目錄下找到Zombie.prefab,將其拖入場景。這是一個護士模樣的殭屍模型,它就是尋路者,也就是我們遊戲中的敵人。

6. 在Inspector視窗選擇【Add Component】→【Navigation】→【Nav Mesh Agent】為敵人新增尋路元件。此時可以進一步設定尋路選項。

7. 建立指令碼Enemy.cs,新增如下程式碼:

using UnityEngine;

[AddComponentMenu("MyGame/Enemy")]
public class Enemy : MonoBehaviour
{
    private new Transform transform;
    private Player player; // 主角
    private NavMeshAgent agent; // 尋路元件
    private float moveSpeed = 2.5f; // 移動速度

    /// <summary>
    /// 初始化
    /// </summary>
    void Start()
    {
        transform = GetComponent<Transform>();
        // 獲取主角
        player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
        // 獲取尋路元件
        agent = GetComponent<NavMeshAgent>();
        // 指定尋路器的行走速度
        agent.speed = moveSpeed;
        // 設定尋路目標
        agent.SetDestination(player.transform.position);
    }
}
在Start方法中獲取了NavMeshAgent元件,然後呼叫其SetDestination方法設定主角為其目標點,這樣就可以讓敵人自動追擊主角了。

8. 將指令碼Enemy.cs指定給敵人,運行遊戲,敵人就會自動尋找最短路徑朝主角的位置前進,並會躲開障礙物了。