Menu
CoddyTech

ターゲットを見つける

Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 8/25。

タワーは、その敵がタワーのrange内にいる限り、最も近い敵を撃ちます。敵を選ぶには、タワーは盤上のすべての敵を把握する必要があります。FindObjectsByType<Enemy>はタワーごとに毎フレームシーン全体を検索するため、代わりに敵自身のリストを保持します。Enemyクラスの静的リストに、各敵がOnEnableで加わり、OnDisableで離れます。Unityは破棄されるオブジェクトに対してOnDisableを呼び出すため、倒された敵もリストから離れます。ゲーム内のアイテムも同じようにできます。

public class Pickup : MonoBehaviour
{
    public static readonly List<Pickup> All = new List<Pickup>();

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }
}

最も近いものを見つけるには、これまでの最良候補を記憶するループを使います。pullRange内にある最も近いアイテムを引き寄せる磁石は、アイテムなし、最良距離を範囲として開始するため、それより遠いアイテムが選ばれることはありません。

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // これまでで最も近いものより近い? それとその距離を保持する
}
Vector3.Distance(a, b)は2点間の距離を返します。範囲内に何もない場合、ループは何も保持せず、答えはnullです。
challenge icon

チャレンジ

中級

各タワーは、射程内で最も近い敵を選びます。

  1. Enemyで、public static readonly List<Enemy> All = new List<Enemy>();を追加し、OnEnableでthisを追加し、OnDisableで削除します。
  2. Towerで、public float range = 4f;とprivate Enemy target;を追加します。
  3. 毎フレーム、Enemy.Allからrange内の最も近い敵(またはnull)を見つけ、新しい対象であれば"Target: " + found.nameをログに出力し、targetに保持します。

「プレイ」を押し、道のそばにタワーを建てます。Consoleに新しい対象がそれぞれ表示されます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

// 後で実装:塔が射程内の敵を見つけ、その敵の方を向いて発砲する。
public class Tower : MonoBehaviour
{
}

Unityゲーム:タワーディフェンスのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド