var sortedEnemies = GameData.instance.enemiesList.OrderBy(enemy => Vector2.Distance(transform.position, enemy.transform.position));
この部分では、enemiesList と呼ばれるリスト内の敵キャラクターを、プレイヤーの位置からの距離が近い順に並べ替えています。
GameData.instance.enemiesList は GameData クラスから取得した敵キャラクターのリストです。
.OrderBy(enemy => Vector2.Distance(transform.position, enemy.transform.position)) のうち、
OrderBy メソッドは、指定された条件に従って要素を並べ替えるためのLINQメソッドです。
この場合、enemy という各敵キャラクターに対して、Vector2.Distance(transform.position, enemy.transform.position) を行います。
enemy の位置からプレイヤーの位置までの距離を計算して、その距離が小さい順に並べ替えています。
これにより、一番近い敵が最初に来るようにソートされた sortedEnemies という新しい List が完成します。
参考サイト
MicroSoft
Enumerable.OrderBy メソッド
target = sortedEnemies.FirstOrDefault(enemy => !GameData.instance.targetList.Contains(enemy));
この部分では、sortedEnemies リスト内から最も近い未選択の敵(target)を見つけています。
sortedEnemies は一番近い敵が要素の最初に来るようにソートされた敵キャラクターのリストです。
.FirstOrDefault(enemy => !GameData.instance.targetList.Contains(enemy)) のうち FirstOrDefault メソッドは、
指定された条件に合致する最初の要素を返すLINQメソッドです。
ここでは、enemy という各敵キャラクターに対して、その敵がまだ選択されていない(targetList に含まれていない)場合、その敵を target に設定します。
targetList に含まれていないかどうかは、Contains メソッドを利用して判定しています。
以上のことから、この処理の目的は、プレイヤーから最も近い未選択の敵を見つけて target に設定することです。
参考サイト
MicroSoft
Enumerable.FirstOrDefault メソッド
上記の処理により、プレイヤーに近い敵から順番に対象先の List に入ります。
// ターゲットをリストに追加
GameData.instance.targetList.Add(target);
そのため、2つ目の弾を発射した場合、最初の対象ではなく、次に近い敵を対象として取ります。
もしも、複数の弾を最も近い敵に向けてだけ発射したい場合には、この List に入れる処理をなくすことで実現できます。