ターゲットを見つける
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です。チャレンジ
中級Enemyに新しいリストpublic static readonly List<Enemy> Allを追加します。各敵はOnEnableで自身を追加し、OnDisableで自身を削除します。Towerにpublic floatrange(ArrowTowerプレハブでは4.5に設定)とprivate Enemytargetを追加します。- 毎フレーム、
Enemy.Allの中からタワーに最も近い敵をtargetに設定します。ただし、その敵がrange内にいる場合に限ります。範囲内に敵がいない場合、targetはnullです。
タワーはまだターゲットに対して何もしません。次のレッスンでは、ターゲットの方を向くようにします。Playを押し、道のそばにタワーを建ててから、Checkを押してください。
自分で試してみよう
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。