KoschyExpress

Vol.10 Unityで電車を走らせる【電車を周回させる】

「Unityで電車を走らせる」第10回目です。
前回は新たに「信号」を作成し、Unity 上に追加しました。

前回の動画はこちら

「駅」に加え、「信号」もできたことで、レイアウトに変化が生まれました。その一方で、電車の動きは出発地点から指定した目的地に移動するだけの単純なままです。
そこで今回は、レイアウトの変化に対応すべく、スクリプトを新たにしましょう。

とは言っても、Unity の DOCUMENTATION に掲載されているものを流用するだけなので、それほど難しくはありません。参照先はこちらです。

 


// Patrol.cs
using UnityEngine;
using UnityEngine.AI;
using System.Collections;

public class Patrol : MonoBehaviour {

public Transform[] points;
private int destPoint = 0;
private NavMeshAgent agent;

void Start () {
agent = GetComponent<NavMeshAgent>();

// autoBraking を無効にすると、目標地点の間を継続的に移動します
//(つまり、エージェントは目標地点に近づいても
// 速度をおとしません)
agent.autoBraking = false;

GotoNextPoint();
}

void GotoNextPoint() {
// 地点がなにも設定されていないときに返します
if (points.Length == 0)
return;

// エージェントが現在設定された目標地点に行くように設定します
agent.destination = points[destPoint].position;

// 配列内の次の位置を目標地点に設定し、
// 必要ならば出発地点にもどります
destPoint = (destPoint + 1) % points.Length;
}

void Update () {
// エージェントが現目標地点に近づいてきたら、
// 次の目標地点を選択します
if (!agent.pathPending && agent.remainingDistance < 0.5f)
GotoNextPoint();
}
}

では早速やってまいりましょう。Unity を立ち上げ、C# スクリプトを新規作成します。リンク先に掲載されている Patrol.cs を流用しますが、今回はパトロールではないので、ファイル名は TrainController としました。

スクリプトそのものは、こちらを活用するのはいいとして、実際にどのように活用すればいいのか、そのあたりを確認していきましょう。以下、先ほどのリンク先の記載事項を引用します。

 

エージェントに設定した地点を巡回させる

多くのゲームには、プレイエリアの巡回を自動的に行うノンプレイヤーキャラクター (NPC) 機能があります。Unity のナビゲーションシステムを使用すると、このような機能を実装することができます。ただし、単に 2 点間の最短の経路を使用して、制限された予測可能な巡回ルートを作るような一般的な経路の作成よりも少し複雑なものです。NPC が、ある種の順序で通過したり立ち寄ったりするために役に立つ、いくつかのキーとなる地点を設けることによって、より納得のいく巡回パターンを設定することができます。例えば、迷路では、交差点と曲がり角に巡回のキーとなる地点を置き、エージェントがそこですべての通路を確認するようにできます。オフィスビルでは、キー地点を個々のオフィスや部屋に置くこともできます。

 

要するに、いくつか場所を設定すれば、設定された場所を通るというわけですね。「駅」や「信号」を設定すれば、「駅」や「信号」を通過することになるはずです。では、実際にやってみましょう。動作をより精密にするため「駅」と「信号」を二つずつ並べてみました。

画像の番号順に電車が通るように設定します。以前に作成した MoveDestination スクリプトを削除し、新たに作成した TrainController を取り込むと、電車の Inspector 欄が次の画像のように変化します。

Points の Size を 4 にすると、通過箇所を四つ設定できるようになります。

新たにできた四つの欄  (Element 0 ~ 3) に「駅」と「信号」を前の画像に示した順番にドラッグ&ドロップしましょう。

これで準備が整いました。それでは動作確認してみましょう。

うまくできました。autoBraking を false に設定されているので、電車が止まることなくグルグルと周回することができます。これで、ようやく電車っぽくなってきた感じがしますね。これからもどんどん開発を進めていきましょう。次回、どうぞお楽しみに。