2020/11/09
今回は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です。
NavigationウィンドウからBakeします。Agentの設定はお好みで。
するとTerrainは「Navigation Static」をオフにしているので対象にならず、ProBuilderで作った地形は対象になります。
もし期待した結果にならない場合はProBuilderのオブジェクトを修正して再度Bakeします。
ProBuilderで作ったモデルを非表示にする
Bakeした後はいらないので非表示にしてしまいます。
と思ってしまうかもですが、Bakeする前に非表示にすると範囲が対象外になってしまいます。
なのでBakeでデータが出力されたのを確認してから非表示にしましょう。
これで「見た目はTerrainだけど、移動範囲はProBuilderで作った地形」の状態になりました。
あとがき
そんなわけで、「Terrainで見た目」「ProBuilderでNavMeshの移動範囲」を作ってみました。
TerrainだけでNavMeshの移動範囲まで考慮して作るのはすごく難しいですが、これでステージ設計がかなり楽になりました。
もちろんTerrainだけでなく、自作のモデルとかでも同じことができますので、NavMeshの移動範囲に悩んでいる方は試してみてください。