正常にボムの動作することを確認できましたら、Bomb スクリプト内の OnClickBomb 内の処理を LINQ を利用して置き換えてみましょう。
LINQ の各機能を活用すると、短縮した命令文ですっきりと書けるようになります。
リファクタリングになりますので、既存の処理を置き換えているだけですので、ゲームの見た目や、処理の結果は同じです。
<置き換える処理>
List<Eto> eraseEtos = new List<Eto>();
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, bombRadius);
foreach (Collider2D collider in colliders)
{
if (collider.TryGetComponent(out Eto eto))
{
eraseEtos.Add(eto);
}
}
↓
<LINQ を利用してリファクタリング>
List<Eto> eraseEtos = Physics2D.OverlapCircleAll(transform.position, bombRadius)
.Select(collider => collider.GetComponent<Eto>())
.Where(eto => eto != null)
.ToList();
LINQ の処理はメソッドチェーンを利用して作成されています。
そのため上記のように、
ピリオドの位置で改行することで、各処理を分解して紐解いていくことが出来ます。
各処理の説明をします。
Physics2D.OverlapCircleAllは、指定した位置(transform.position)を中心として、指定した半径(bombRadius)内のオブジェクトのコライダーを取得します。
OverlapCircleAllメソッドは、指定した位置に重なっているすべてのコライダーを配列として返します。
Selectメソッドは、配列内の各要素に対して指定した処理を実行し、結果の要素を新しいコレクションにマッピング(射影)します。
この場合、
各colliderからGetComponent<Eto>()を呼び出して、Etoコンポーネントを取得します。
GetComponent<Eto>()は、指定したコンポーネント(Eto)がアタッチされているかどうかを確認し、アタッチされている場合はそのコンポーネントを返します。
Whereメソッドは、指定した条件(eto != null)に合致する要素のみをフィルタリングします。
この場合、etoがnullでない要素のみを残します。つまり、
Etoコンポーネントがアタッチされている要素だけが残ります。
つまり、Select メソッドによって GetComponent した際に、万が一 null の情報があった場合にはそれを除外し、要素の安全性を確保しています。
ToListメソッドは、コレクションをListに変換します。
この場合、SelectおよびWhereで得られた要素をList<Eto>に変換します。
以上のような流れにより、最終的に、指定した位置と半径内にあるコライダーを持つオブジェクトの中から、EtoコンポーネントがアタッチされているものだけがeraseEtosリストに追加されます。
リファクタリングする前の処理と同じ内容になります。