Related Posts Plugin for WordPress, Blogger...

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撰寫程式碼控制,就可以讓敵人追著主角跑了!

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);
  }


 }
}



留言