ウェイポイント
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 1/18。
このコースでは、タワーディフェンスゲームを作成します。敵はウェーブごとに道に沿って基地へ進み、ビルドパッドに設置したタワーで敵を食い止めます。その後、タワーをアップグレードしたり売却したりできます。各レッスンで機能を1つずつ追加します。ゲームのスクリプトは12個すべて、最初からプロジェクトに含まれています。そのほとんどは短いスタブで、後のレッスンで内容を追加します。
敵はwaypointsに沿って道を進みます。waypointsは曲がり角に配置された空のGameObjectで、通過する順番に配列に格納されています。敵は向かうwaypointのインデックスを保持し、そこに向かって移動します。到着すると、次のwaypointへ進みます。Vector3.MoveTowards(current, target, maxStep)は、点をターゲットに向かって最大でもmaxStepだけ移動させ、ターゲットを通り越すことはありません。そのため、敵はwaypointに正確に到着し、==で到着したかどうかを判定できます。この巡回ドローンは、配置された地点の間を飛び、最後の地点の後は最初に戻ります。
public Transform[] posts;
public float speed = 3f;
private int current;
void Update()
{
Vector3 goal = posts[current].position;
transform.position = Vector3.MoveTowards(transform.position, goal, speed * Time.deltaTime);
if (transform.position == goal)
{
current = (current + 1) % posts.Length;
}
}敵はループしません。最後のwaypointの先には進む場所がないためです。インデックスがLengthに達すると、waypointを指さなくなります。また、waypoints[waypoints.Length]を読み取るとIndexOutOfRangeExceptionが発生するため、インデックスを使う前にチェックします。waypointsは地面から0.6の高さ、つまり敵の中心の高さにあるため、waypointsに向かってまっすぐ進めば、敵の足は地面についたままです。
チャレンジ
簡単Grunt は最初のウェイポイント WP0 に立っており、Enemy スクリプトには、スポーン地点の WP0 から基地の WP7 まで、8つのウェイポイントがすでに waypoints に格納されています。
- private int
nextを追加します。これは Grunt が向かうウェイポイントのインデックスです。Grunt は WP0 から開始するので、nextは 1 から始まります。 UpdateでVector3.MoveTowardsを使い、毎秒speed単位の速さで Grunt をwaypoints[next]に向かって移動させます。- そのウェイポイントに到着したら、次のウェイポイントに向かわせます。
- 最後のウェイポイントを過ぎたら停止させます。移動を続けず、エラーも発生させません。
Play を押して Grunt が道を歩くのを確認し、その後 Check を押します。
自分で試してみよう
using UnityEngine;
public class Enemy : MonoBehaviour
{
public float speed = 2f;
public Transform[] waypoints;
void Update()
{
// ここで経路に沿って移動する:waypointから次のwaypointへ順番に。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。