ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】TerrainとProBuilderを組み合わせて見た目とNavMeshの移動範囲を分離させたお話

time 2021/08/22

今回はUnityのTerrain絡みのお話です。
NavMeshは「移動範囲を制限する」ことができません。NavMeshObstacleで強引にできなくもないですが、割と大変です。
これはTerrainにBakeする場合でも同様なので、例えば以下のように「同じ高さだけど通り道だけを移動させたい」なケースには対応できません。

この例の場合、NavMeshの範囲はこうなってほしい。

しかしステージの見た目はTerrainの地形作成やテクスチャ設定で作りたいので、ProBuilderを使ってNavMeshの移動範囲を別で作ってみました。

手順

Terrainを作る

まずはTerrainで好みの地形を作ります。移動範囲のことは考えなくてOKです。

作成したTerrainがNavMeshのBake対象に含まれないように注意します。
インスペクター右上のstaticから「Navigation Static」のチェックが外れているか確認しましょう。

ProBuilderで移動範囲を作る

次にProBuilderでキャラクターの移動範囲を作っていきます。
ProBuilderの「New Shape」からPlaneを選択し、通り道に合わせて伸縮させます。生成時の「Width Segments」と「Length Segments」を0にするとやりやすいです。

こちらはBake対象にするので「Navigation Static」のチェックを入れます。

ちなみに必ずしもProBuilderである必要はありません。他のアセットやソフトでモデリングしたものを配置してもOKです。

NavMeshのBakeを実行

NavigationウィンドウからBakeします。Agentの設定はお好みで。

するとTerrainは「Navigation Static」をオフにしているので対象にならず、ProBuilderで作った地形は対象になります。

もし期待した結果にならない場合はProBuilderのオブジェクトを修正して再度Bakeします。

ProBuilderで作ったモデルを非表示にする

Bakeした後はいらないので非表示にしてしまいます。

見た目いらないならBake前から非表示にしてもいいの?

と思ってしまうかもですが、Bakeする前に非表示にすると範囲が対象外になってしまいます。
なのでBakeでデータが出力されたのを確認してから非表示にしましょう。

これで「見た目はTerrainだけど、移動範囲はProBuilderで作った地形」の状態になりました。

あとがき

そんなわけで、「Terrainで見た目」「ProBuilderでNavMeshの移動範囲」を作ってみました。
TerrainだけでNavMeshの移動範囲まで考慮して作るのはすごく難しいですが、これでステージ設計がかなり楽になりました。
もちろんTerrainだけでなく、自作のモデルとかでも同じことができますので、NavMeshの移動範囲に悩んでいる方は試してみてください。

down

コメントする