Unity遊戲開發筆記:獲取主角周圍的怪物
阿新 • • 發佈:2018-12-13
1、獲取距離主角最近的一個怪物
方法一:球形射線檢測,Physics.OverlapSphere
用球形射線檢測主角周圍方圓X米的怪物,如果檢測到怪物,即可返回此怪物,如果沒有檢測到怪物,將檢測範圍(即半徑)擴大,直到檢測到怪物為止。
public Transform OnGetEnemy() { //正在搜尋的半徑 int radius = 1; //一步一步擴大搜索半徑,最大擴大到100 while (radius < 100) { //球形射線檢測,得到半徑radius米範圍內所有的物件 Collider[] cols = Physics.OverlapSphere(transform.position, radius); //判斷檢測到的物件中有沒有Enemy if (cols.Length > 0) for (int i = 0; i < cols.Length; i++) if (cols[i].tag.Equals("Enemy")) return cols[i].transform; //沒有檢測到Enemy,將檢測半徑擴大2米 radius += 2; } return null; }
方法二:比較所有怪物與主角之間的距離
獲取所有怪物,計算每一個怪物與主角之間的距離,進行比較,選擇一個與主角距離最短的怪物。
public Transform OnGetEnemy() { //獲取所有敵人 GameObject[] enemy = GameObject.FindGameObjectsWithTag("Enemy"); float distance_min = 10000; //主角與怪物的最近距離 float distance = 0; //當前怪物與主角的距離 int id = 0; //與主角最近的怪物的編號 //遍歷所有敵人,計算距離並比較 for (int i = 0; i < enemy.Length; i++) { if (enemy[i].activeSelf == true) { distance = Vector3.Distance(transform.position, enemy[i].transform.position); if (distance < distance_min) { //找到一個更近的 distance_min = distance; id = i; } } } return enemy[id].transform; }
2、獲取主角前方60度範圍內,距離小於2米的怪物
用球形射線檢測主角周圍方圓2米的怪物,如果檢測到怪物,再判斷怪物是否在主角正前方60度範圍內,如果【主角正前方向】與【主角怪物連線】的夾角小於30度,即可得知此怪物是所求怪物。
//獲取主角前方60度範圍內,距離小於2的敵人 public void OnGetEnemy(Transform player, int radius, int angle) { //球形射線檢測,得到主角半徑2米範圍內所有的物件 Collider[] cols = Physics.OverlapSphere(player.position, radius); //判斷檢測到的物件中有沒有Enemy if (cols.Length > 0) for (int i = 0; i < cols.Length; i++) //判斷是否是怪物 if (cols[i].tag.Equals("Enemy")) { //判斷敵人是否在主角前方60度範圍內 Vector3 dir = cols[i].transform.position - player.position; if (Vector3.Angle(dir, player.forward) < angle) cols[i].GetComponent<BaseHero>().OnTakeDamage(); } }