Menu
CoddyTech

ターゲットを見つける

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

タワーは、その敵がタワーの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を追加します。各敵はOnEnableで自身を追加し、OnDisableで自身を削除します。
  2. Towerにpublic float range(ArrowTowerプレハブでは4.5に設定)とprivate Enemy targetを追加します。
  3. 毎フレーム、Enemy.Allの中からタワーに最も近い敵をtargetに設定します。ただし、その敵がrange内にいる場合に限ります。範囲内に敵がいない場合、targetはnullです。

タワーはまだターゲットに対して何もしません。次のレッスンでは、ターゲットの方を向くようにします。Playを押し、道のそばにタワーを建ててから、Checkを押してください。

自分で試してみよう

using UnityEngine;

public class Tower : MonoBehaviour
{
    public int cost = 50;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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