P1-M02

【UNITY】[NavMesh 1] 障害物をよけて目的地まで進むには

キャラクターを経路に沿わせて移動させたり、障害物を避けながら目的地に移動させるには「NavMesh」を使うと便利です。今回は「NavMesh」(ナビメッシュ)の使い方を説明していきます。

1

地面の追加

1.Hierarchy>Create>Planeで経路を作ります。

2.Hierarchy>Create>Capsuleでキャラクターの代わりを作成します。

→のように配置できましたか?オリジナルのマップをつくっても大丈夫です。

2

マップに動けるエリア(NavMesh)を指定する

キャラクターが歩くことのできるエリア(NavMesh)を作っていきます。※青く表示されているところが歩くことが可能なエリアです。

NavMeshにしたいオブジェクトを選択

歩かせたいオブジェクトすべてを選択します。ここでは3つのPlaneを選択します。

オブジェクトのNavigationに設定する

選択した状態で、Navigationタブ > Object を表示させて、「Navigation Static」にチェックをいれます。また、「Navigation Area」がWalkable(歩行可能)になっているかどうがを確認します。

NavMeshを作成(ベイク)する

選択した状態で、Navigationタブ > Bake を表示させて設定値を決めたら「Bake」ボタンをクリックします。するとNavMeshが作成できます。

→のようになっていればNavMeshの作成は完了です。

NavMeshのBake時の各項目の説明です。項目の値を変えたらその都度「Bake」ボタンをクリックしてNavMeshの再構成が必要です。

 <table class="hl-table-komoku"><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <th>項目</th><!-- [et_pb_line_break_holder] --> <th>説明</th><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Agent Radius</td><!-- [et_pb_line_break_holder] --> <td>エージェントの中心が壁などにどの程度近づけるか設定します</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Agent Height</td><!-- [et_pb_line_break_holder] --> <td>空間内でエージェントの手が届く高さ(低さ)です</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Max Slope</td><!-- [et_pb_line_break_holder] --> <td>エージェントが登れる斜面の角度です</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Step Height</td><!-- [et_pb_line_break_holder] --> <td>エージェントが踏むことができる障害物の高さです</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --></table>
3

NavMeshを使うキャラクターの設定

Navigationを使えるキャラクターの設定を行います。キャラクター側には「Nav Mesh Agent」(ナビメッシュエージェント)をアタッチしていきます。

Hierarchy > Capsule を選択してinspector > Add Component > Nav Mesh Agent をアタッチします。

「Nav Mesh Agent」の設定を→のようにします。

NavMeshのBake時の各項目の説明です。項目の値を変えたらその都度「Bake」ボタンをクリックしてNavMeshの再構成が必要です。

<div> <b>Steering</b> </div><!-- [et_pb_line_break_holder] --><table class="hl-table-komoku"><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <th>項目</th><!-- [et_pb_line_break_holder] --> <th>説明</th><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Speed</td><!-- [et_pb_line_break_holder] --> <td>移動速度</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Angular Speed</td><!-- [et_pb_line_break_holder] --> <td>方向を変えるときの回転速度</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Acceleration</td><!-- [et_pb_line_break_holder] --> <td>移動速度になるまでの加速度</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Stopping Distance</td><!-- [et_pb_line_break_holder] --> <td>ゴール位置、この設定距離まで近づいたらエージェントが停まります</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --> <tr><!-- [et_pb_line_break_holder] --> <td>Auto Braking</td><!-- [et_pb_line_break_holder] --> <td>有効になっていると、目的地点の到着時にエージェントの移動速度が減速する</td><!-- [et_pb_line_break_holder] --> </tr><!-- [et_pb_line_break_holder] --></table>

マウスでクリックした座標にキャラクターが進むようにスクリプトを設定します。

1.キャラクターにアタッチしたNavMeshAgentを取得

2.マウスでクリックしたゲーム上の座標を取得

3.キャラクター(Agent)を座標まで移動させる

4

スクリプトをキャラクターにアタッチ

5

応用

オリジナルの経路を作ってNavMesh作成になれよう。角度や段差のある3Dオブジェクトを作るとNavMeshの挙動をよく理解できるはずだ。

BlenderなどのモデリングソフトやUnityでオリジナル経路を作成してみよう。

今回マウスでクリックした位置を算出するのにRayCastを使っている。そのためオリジナル3Dモデルを使った場合、必ずColliderを追加しよう。Colliderがないと座標が割り出せなくてキャラクターは動かないよ。