ターゲットを見つける
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です。チャレンジ
中級各タワーは、射程内で最も近い敵を選びます。
Enemyで、public static readonly List<Enemy> All = new List<Enemy>();を追加し、OnEnableでthisを追加し、OnDisableで削除します。Towerで、public float range = 4f;とprivate Enemy target;を追加します。- 毎フレーム、
Enemy.Allからrange内の最も近い敵(またはnull)を見つけ、新しい対象であれば"Target: " + found.nameをログに出力し、targetに保持します。
「プレイ」を押し、道のそばにタワーを建てます。Consoleに新しい対象がそれぞれ表示されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
// 後で実装:塔が射程内の敵を見つけ、その敵の方を向いて発砲する。
public class Tower : MonoBehaviour
{
}
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド