Posted at

【Unity】AIが賢く移動できるための機能、NavMeshとオフメッシュリンクを設定する


最初に

本記事はUnityでのNavMeshとオフメッシュに関して解説した記事となります。


NavMeshとは?

ゲーム内に設置してあるジオメトリから、自動で生成される簡略化された地形の表面です。これのおかげによって、AIを持つキャラクターに障害物を避けて通るような知的な移動を行わせることが可能となります。

このNavMeshはNavMeshSurfaceという高レベルなNavMeshコンポーネントを使用することでランタイムでも更新することが可能なので、扉が開くなどのステージギミックがあった際にもNavMeshの繋がり部分を気にせず自由に作成することができます。

ちなみにこのNavMeshに沿って移動を行うキャラクターのことをナビメッシュエージェント(NavMesh Agent)と呼びます。

NavMeshを用いた経路検索アルゴリズムはUnityではA*を採用しているようです。


NavMeshの生成

Unityのメニューから[Windows]→[AI]→[Navigation]と進んでください。

image.png

Inspector部にNavigationタブが表示されたと思います。

image.png

最初にシーン中の静的オブジェクトを示してBakeしてみましょう。

「Navigation Static」というチェックボックスをtrueにしてください。

次に[Bake]タブを開いてNavMeshを生成するのに必要なプロパティ群を確認していきましょう。

設定名
概要

Agent Radius
キャラクターの中心が壁などにどの程度まで近づけるか

Agent Height
キャラクターの手が届く高さ

Max Slope
キャラクターが登れる傾斜角度

Step Height
キャラクターが登れる段の高さ

蒸気をキャラクターのサイズに合わせて調整しましょう。

調整した後はBakeボタンを押下することで、NavMeshが作成できます。

image.png

青色になっている箇所がNavMeshが作成されていることを表しています。

作成後はAssetsフォルダ下の同シーンが格納されているフォルダ内にシーンと同名のフォルダが作成されているはずです。そのフォルダ下にNavMesh.assetが作成されます。


高レベルなNavMesh

Unityが用意しているNavMeshにはいくつか高度なNavMeshも存在しています。これらはUnity標準には含まれておらず、自身でUnity Technologies GitHubからDLしてインストールを行う必要があります。

↓公式の詳細ページ↓

https://docs.unity3d.com/ja/2018.1/Manual/NavMesh-BuildingComponents.html

この辺はまた改めて試して記事を書いてみようと思います。


オフメッシュリンクとは?

オフメッシュリンク(Off-Mesh Link)は歩行する以外での移動組み込みを可能にしてくれます。たとえば障害物を飛び越えさせて移動のショートカットを行わせる時に、このオフメッシュリンクが役立ちます。

では早速作成してみましょう。


オフメッシュリンクの手動作成

まず最初なのでGameObjectから任意のジオメトリを二つ用意してシーンのショートカットのStart位置とEnd位置の場所に設置してください。実際にゲームに組み込む際には空のGameObjectでも問題ありません

image.png

ショートカットを開始する場所に設置したら、Start側のオブジェクトにNavigation > Off Mesh Linkというコンポーネントを追加します。

そのコンポーネントの設定にStartとEndがあるので、それぞれ設置したジオメトリをアタッチしてください。

image.png

NavMeshがすでにBakeされていればオフメッシュリンクも有効となります。

適用されていない場合は、アタッチした後にNavMeshをBakeすることでオフメッシュリンクも適用されます。


オフメッシュリンクの自動生成

オフメッシュリンクはNavMeshと同様にBake時の設定で自動生成することも可能です。

まず、NavigationタブのObjectタブを確認しましょう。

ここにある「Generate OffMeshLinks」というチェックボックスをtrueに設定してください。

image.png

その後、Bakeタブに戻り、オフメッシュリンクの自動生成に必要な設定をさらに行いましょう。

image.png

設定名
概要

Drop Height
落下を行う高さの最高値

Jump Distance
ジャンプを行う最長距離値

どちらも値を0に設定することでオフメッシュリンクは生成されなくなります

値の適正な数値は公式マニュアルを参考にしてみてください。↓

https://docs.unity3d.com/ja/2018.1/Manual/nav-BuildingOffMeshLinksAutomatically.html

ここまで設定できたらBakeを押下してみてください。以下のようにオフメッシュリンクが自動で生成されたのを確認できたと思います。

image.png


最後に

オフメッシュリンクの存在を知らなかったため、こんな便利機能があることに感動しました。さすがUnity、つよい。そのうちハイレベルなNavMeshも試して動かしてみたいと思います。


参考