(サンプルスクリプト)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 辞書のソートを使うために必要(ポイント)
using System.Linq;
public class Shot3lookAt : MonoBehaviour
{
// 配列
private GameObject[] enemies;
public GameObject[] turret;
// リスト
private List<GameObject> targetList = new List<GameObject>();
// 辞書
private Dictionary<GameObject, float> enemyDis = new Dictionary<GameObject, float>();
void Start()
{
StartCoroutine(TargetSet());
}
// コルーチンを使って、3秒毎に処理を行う。
private IEnumerator TargetSet()
{
while(true)
{
yield return new WaitForSeconds(3f);
// 画面上に存在する敵を配列で取得
enemies = GameObject.FindGameObjectsWithTag("Enemy");
foreach (GameObject e in enemies)
{
// 各敵との距離を計算
float dis = Vector3.Distance(transform.position, e.transform.position);
// ★辞書を使って、「敵」と「その敵までの距離」を「セットで把握」する(ポイント)
enemyDis.Add(e, dis);
}
// 距離(value)を基準に辞書をソート・・・>距離の近い順に並べる
foreach (var n in enemyDis.OrderBy(x => x.Value))
{
print(n.Key + ":" + n.Value);
// 近い順に並べた「敵」をリストで管理
targetList.Add(n.Key);
}
foreach (var t in targetList)
{
print(t.name);
}
// 近い敵、上位3つを、ターゲットに設定する。
for (int i = 0; i < turret.Length; i++)
{
turret[i].transform.LookAt(targetList[i].transform);
}
// 2秒後にリストと辞書をリセット(初期化)する(重要ポイント)
yield return new WaitForSeconds(2f);
targetList = new List();
enemyDis = new Dictionary<GameObject, float>();
}
}
}
(実行結果)