今回は Navmesh という Unity の機能を利用して、線路上に電車を走らせてみましょう。具体的な手順は以下の通りです。

・下準備:Hierarchy 上に Rails を作成し、線路をひとまとめにする。
・Navmesh の設定:線路と電車
・スクリプトの作成:C#を利用

今回は細かな設定は後回しにし、ひとまず電車を動作させるところまですすめます。

Navmesh とは、簡単に一言でいうと、シーン上にキャラクターが自動的に動くシステムだと考えればいいかと思います。例えばアクションゲームなんかでで敵がプレイヤーを追いかけてきたりしますが、あれと同じようなものです。今回は敵の代わりに電車なだけで、基本的なしくみ変わりません。

と、その前に、作業の効率化を図るため、まずは素材の整理をしましょう。前回は線路と電車を配置したりして素材の数が増えてきました。現状はこんな感じになっています。

ここで新しい線路用の GameObjcect を作り、そちらにすべての線路をまとめるような手順をとってみます。左上の「Create」をクリックし「Create Empty」を選択すると、新たに GameObjcect が作成されます。

続けて GameObject を右クリックし、「Rename」で名前を変更しましょう。わかりやすいように Rails としました。

あとはドラッグ&ドロップするだけです。その際、選択先が線で表示されている場合は、その線の箇所に素材が移動します。また、選択先が素材の名前で表示されている場合は、選択先の中に素材が移動され、選択先の子要素となります。

つまり、今回の場合は Rails が親要素、Srail や Rrail などが子要素となります。

親要素:Rails(フォルダ)
子要素:Srail や Rrail(ファイル)

なぜこのようなことをするのかというと、次におこなう Navmesh の設定が簡素化させるためです。それでは改めて Navmesh の機能を追加していきますが、はじめに、 Navigation というタブを準備しておきましょう。

これは「Window」メニューの下の方にある「Navigation」をクリックすれば追加されます。

次に Hierarchy にある先ほど作成した Rails を選択の上、Inspector にある Static のところの▼をクリックしましょう。


続けて Navigation Static をクリックすると下のような画面が現れますので、Yes, ~ を選びましょう。

一見すると何の変化もなさそうですが、気にせず続けましょう。今度は Inspector の横にある Navigation (先ほど追加したタブ)を選択すると下のような画面が現れます。

上の画面では Object が選択されていますが、今回必要となるのは Bake なので Bake を選択しましょう。

何やらいろいろな数字が並んでいますが、ひとまず無視して、右下にある Bake をクリックしましょう。すると Scene 画面の線路上に新たな模様が現れました。

これが Navmesh と呼ばれるものです。今回の場合ですと、この新たに生成された Navmesh 上を電車が走るという仕組みになっているわけです。これで線路側の準備は整いました。それでは続いて電車側の設定にまいりましょう。まずは Hierarchy で電車を選択します。

続いて Inspector の「Add Component」から「Navigation」⇒「Nav Mesh Agent」を選択します。

これでNav Mesh Agent の細かな設定が可能になりました。Nav Mesh Agent とは、自動で動く対象(敵キャラら今回のような電車など)を指し示します。Nav Mesh Agent(電車)が NavMesh (経路=線路)上を動くということですね。

これで電車が動きそうな気もするのですが、実はまだ動きません。Nav Mesh Agent にスクリプトが必要になります。スクリプトは Unity のオンライン上の Documentation のところにあるので、それを活用しましょう。

リンク先はこちら

Project にある Create から C# Script を選択します。

MoveDestination と名前を変更しましょう。

先ほどのリンク先にあるスクリプトをそのままコピペしましょう。その際、「using UnityEngine.AI」を追記しましょう。これがないとエラーになります。

そして、作成した MoveDestination を電車(Train001)へドラッグ&ドロップします。

すると、Train001 の Inspector に Move Destination (Script) が追加されます。

ところがよく見てみると、Goal の部分が None (Transform) となっています。これは電車がどこに向かって走るかを指し示すものですが、現時点ではそれが定義されていません。

それでは改めて電車の目的地を設定しましょう。一番遠い位置にある Srail (5) にしてみましょうか。Hierarchy にある Srail (5) を Inspector の Goal にドラッグ&ドロップします。すると、Goal 欄が Srail (5) になります。

これで、電車(Train001)が Srail (5) に向かって走るはずです。ではでは、再生ボタンを押して試してみましょう。

YouTube に動画を Up しましたので、こちらでも確認できます。

動きはしましたが、後ろ向きに走っているのがわかります。そこで Train001 の Rotation Y を 180 にして向きを変えてみましたが、電車が回転し、結局は後ろ向きに走り出しました。仕方がないので、blender に戻り、オブジェクトモードで回転 Z を 180 とし、電車の本体ごと向きをかえてみましょう。

セーブ後、Unity に戻り、改めてファイルを読み込み、名前をTrain002 とし電車を再配置。あとは、先ほどと同様に Nav mesh Agent の各種設定をし、再生ボタンを押してみると、

今度はうまくできました。

今回は Navmesh の使って線路上を電車を走らせる段階まですすめました。次回はもう少し細かな設定を追加していきましょう。次回、どうぞお楽しみに。