モチベーション
- 敵を避けながらステージを進んでゴールまで行くようなゲームを作りたい。
- NavMeshというのが、キャラを動かすのに便利らしいので勉強してみたい。
ステージを作る
ひとまず動くものを作りたいので、見た目はこだわらずにデフォルトのオブジェクト生成のPlateで地面を作成してCubeを作成しました。
はじめはBoxColliderを付与していたが、NavMeshを使う上では特に必要なさそうでした。
NavigationWindowからNavMeshをBakeする
後の方に記載するが、NavigationWindowからのBakeはシーンに対するもので、Prefabで作ったステージにNevMeshを張るのは 全く別の方法になります。
似たような設定があるのに共通していない、という少し分かりにくい感じなのでシーンに対するNavMeshについて興味のない人はオブジェクトに対してNavMeshをBakeする方法まで飛ばしてみてもらった方がよいかも知れません。
NavMeshをBakeする前の準備
NavMeshをBakeする前にMeshを張る予定のすべてのオブジェクトに『NavigationStatic』のステータスを付与する必要があります。
デフォルト設定でのBake
とりあえずステージが出来たので、Window -> AI -> NavigationでNavMeshのWindowを開いてBakeを実行。
!?
どうやら、StepHeightやMaxSlopeの設定で、登れる場所と認識されてしまった様子。
BakedAgentSizeの設定変更によるBake
平面で動かすようなゲームなら、MaxSlopeを0、StepHeightを0.01のように設定するのがよさそう。
他のオブジェクトを進入禁止にする方法
他の手段として、Objectのタブを開いた状態で、SceneやHierarchyでオブジェクトを選択して『NavigationArea』で『Not Walkable』を選択するとそのオブジェクトはBakeの対象にならないので、キチンとしたものを作るのはこちらの方がよさそう。
『NavigationArea』での選択はAreasタブで追加できて、ルートのコストを設定することも出来る様子。レースゲームの砂漠地帯みたいな、通行可能だけれど極力通りたくない、みたいなエリアを作る時に有用そう。
NavigationからのBakeはシーンに対して
さて、Bakeが完了したので次のステージを作ろうといったんステージを非アクティブにしたところ、Navigationでの表示はBakeされたものが残っている。
つまりこのMeshはオブジェクトに対してではなく、シーンに対してBakeされている様子。(まぁ、考えればオブジェクトを指定してBakeしているわけではないし、そりゃそうかという感じ)
RPGとかなら、シーンごとにNavMeshをBakeしても問題なさそうだけれども、今回はステージをPrefabにして1シーンで入れ替えたいのでオブジェクトにBakeする方法を考える。
オブジェクトに対してNavMeshをBakeする方法
どうやら、2021.3の段階ではデフォルトで入っているNavigationシステムではPrefabにBakeは出来ない様子。
Experimentalになるが、PackageManagerのAdd package by nameでcom.unity.ai.navigation
と入力することで、NavMeshの他の機能も使えるようになるとのこと。
2022.2以上であれば、Pre-Release版が使用できるようなので、NavMeshを使用するならそちらの方がよさそう。
追加されるComponentは下記の4つ。
NavMeshSurface - Use for building and enabling a NavMesh surface for one type of Agent.
NavMeshModifier - Use for affecting the NavMesh generation of NavMesh area types based on the transform hierarchy.
NavMeshModifierVolume - Use for affecting the NavMesh generation of NavMesh area types based on volume.
NavMeshLink - Use for connecting the same or different NavMesh surfaces for one type of Agent.
ステージのゲームオブジェクトにNavMeshSurfaceをアタッチすることでBakeをすることが出来る。
これでBakeを行うことで、NavMeshのアセットファイルが生成され、このComponentのenableを切り替えることでNavMeshの有効・無効を切り替えることができるようになります。
NavMeshSurfaceを使用する際の注意
Meshの可視化
Bakeを行う際、Prefabをダブルクリックで開いた状態で行うと、何故かNavMeshが可視化できず、どのようにBakeされたのか分かりません。
Scene上でPrefabを開いてBakeするか、Scene上でBakeをしてApplyするかするのがよさそうです。
Bakeの対象
NavigationではGameObjectに『NavigationStatic』の設定をしていたが、NavMeshSurfaceではその設定の必要がありません。
代わりに、存在するMeshRendererすべてがNavMeshの対象になる様子です。
プレハブにするなら、ステージの親にNavMeshSurfaceをアタッチしてCollectObjectsのターゲットを『Children』にするのがよさそうな雰囲気。
Volumeは指定範囲内のでのMeshを作成するので、ブロックを組み合わせてマップを作るようなゲームなら有用そう。
通れないオブジェクトの設定
NavigationでBakeする際は『Object』のタブを使ってNavigationAreaを変更しても対応できない。
そのため、通れなくするオブジェクトにNavMeshModifierをアタッチしてOverideAreaにチェックしてAreaTypeをNotWalkableに設定することで、Bakeの対象から外すことができる。
Agentの設定
NavMeshSurfaceのBakeはNavigationと違ってAgentのMaxSlopeやStepHeightを制御できないように見えますが、AgentTypeの項目がNavigationのAgentsの項目に紐づいているので、こちらで設定を変更すれば反映されます。