(Unity)配列・List・Dictionaryの活用(画面上の複数の敵のうち、距離の近い3体を攻撃する)

(サンプルスクリプト)

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

(実行結果)