2-9 Make Enemies Pathfind To Player
今天要來介紹讓場景中的敵人追蹤主角的方法,首先選擇Window/Navigation開啟Navigation視窗。
然後選取場景中的Terrain物件,本次範例中我的Terrain物件取名為Ground。
接著,在Navigation視窗選擇Bake,再按下『Bake』按鈕。
需要一段時間等待Unity處理,處理完後就會發現場景中顯示一層淡淡的青藍色,這是代表環境中可以行走的範圍。
大家應該會發現,場景中有些部分沒有被列入Navigation的範圍,比如下圖中斜斜向上的那個方塊,假設我們希望那個方塊是一個可以讓角色行走的走道。接下來,我們先點選那個Cube。
選擇後,在Navigation視窗選擇Object,然後勾選Navigation Static選項。再回到Bake中按下『Bake』按鈕。
此時,就會發現場景中的方框也出現在Navigation的範圍內。
上述步驟中我們進行的Navigation範圍都會存檔到一個單一檔案中,大家可以從Project視窗儲存Scene的資料夾中找到名稱為NavMesh的檔案。
OK!若完成Navigation Mesh的建立後,接著我們需要替Enemy增加Pathfind功能。首先,替Enemy新增Nav Mesh Agent物件。
再新增AI Character Control.cs檔,這份Script檔應該是放在Standard Assets內,若當初大家匯入Package時沒有刪掉的話,就能夠正常新增,如沒有檔案再請大家自行匯入嘍。
最後,我們只要在Enemy.cs撰寫程式碼控制,就可以讓敵人追著主角跑了!
接著,在Navigation視窗選擇Bake,再按下『Bake』按鈕。
需要一段時間等待Unity處理,處理完後就會發現場景中顯示一層淡淡的青藍色,這是代表環境中可以行走的範圍。
大家應該會發現,場景中有些部分沒有被列入Navigation的範圍,比如下圖中斜斜向上的那個方塊,假設我們希望那個方塊是一個可以讓角色行走的走道。接下來,我們先點選那個Cube。
選擇後,在Navigation視窗選擇Object,然後勾選Navigation Static選項。再回到Bake中按下『Bake』按鈕。
此時,就會發現場景中的方框也出現在Navigation的範圍內。
上述步驟中我們進行的Navigation範圍都會存檔到一個單一檔案中,大家可以從Project視窗儲存Scene的資料夾中找到名稱為NavMesh的檔案。
OK!若完成Navigation Mesh的建立後,接著我們需要替Enemy增加Pathfind功能。首先,替Enemy新增Nav Mesh Agent物件。
再新增AI Character Control.cs檔,這份Script檔應該是放在Standard Assets內,若當初大家匯入Package時沒有刪掉的話,就能夠正常新增,如沒有檔案再請大家自行匯入嘍。
最後,我們只要在Enemy.cs撰寫程式碼控制,就可以讓敵人追著主角跑了!
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityStandardAssets.Characters.ThirdPerson; public class Enemy : MonoBehaviour { [SerializeField] float maxHealthPoints = 100f; [SerializeField] float attackRadius = 5.0f; float currentHealthPoint = 100f; AICharacterControl aiCharacterControl = null; GameObject player; public float healthAsPercentage{ get{ return currentHealthPoint / maxHealthPoints; } } void Start(){ aiCharacterControl = GetComponent(); player = GameObject.FindGameObjectWithTag ("Player"); } void Update(){ //計算Player跟Enemy的距離 float distanceToPlayer = Vector3.Distance (player.transform.position, transform.position); //若彼此之間的距離小於AttackRadius,就讓Enemy開始追蹤Player if (distanceToPlayer <= attackRadius) { aiCharacterControl.SetTarget (player.transform); } else { aiCharacterControl.SetTarget (transform); } } }
留言
張貼留言