「Nav Mesh Surface」コンポーネントを使って、エージェントタイプごとに別のナビメッシュをベイクしてみました。
コンポーネントを入手する
「Nav Mesh Surface」コンポーネントはGitHubでダウンロードできます。https://github.com/Unity-Technologies/NavMeshComponents
Assetsフォルダの中身をすべてプロジェクトのAssetsフォルダに配置しました。
サンプルシーン
インポートしたファイルの中にはサンプルシーンもあります。Assets > Examples > Scenes の中の「1_multiple_agent_sizes」サンプルシーンを開きました。
エージェントの設定
このシーンには「HumanoidAgent」と「OgreAgent」という2つのゲームオブジェクトに、ナビメッシュエージェントコンポーネントがついています。
そこで、NavigationウィンドウのAgentsタブで、これらに対応する2つのエージェントタイプを作りました。
「OgreAgent」に設定する方は、半径を2倍にしました。
NavMesh Surfaceを使う
「Nav Mesh Surface」コンポーネントを使うには、GameObject > AI > NavMesh Surface でこのコンポーネントだけが付いたゲームオブジェクトを作成します。
または、ヒエラルキーウィンドウにあるゲームオブジェクトにこのコンポーネントを追加することもできます。
このコンポーネントで対象のエージェントタイプを設定して「Bake」ボタンでベイクできます。
「Nav Mesh Surface」をもう一つ追加して、半径の大きい方のエージェントタイプを選択し「Bake」ボタンを押すと、形の違うナビメッシュが重なってベイクされました。
半径が小さいエージェントタイプ向けのナビメッシュではすべてのゲートを通過できますが、もう片方では最も幅の広い右端のゲートの下にしかナビメッシュが作られません。
エージェントに目的地を設定すると、小さい方が近くのゲートを通る間、大きい方は遠回りして右端のゲートを通るのがわかります。
ベイクに使うオブジェクトを選択
エージェントタイプの下の3つのパラメーターでは、ベイクに使うジオメトリをフィルタリングできます。
Collect Objectsを「All」にするとすべてのオブジェクトを、「Children」にするとコンポーネントが配置されたゲームオブジェクトとそのすべてのアクティブな子オブジェクトを使用します。
「Volume」に設定すると、バウンディングボリュームに重なったオブジェクトだけを使います。Edit Volumeボタンを押すとシーンビューでバウンディングボリュームの大きさを変えられます。
ベイクすると、ボリュームの中にだけナビメッシュが作られます。対応するエージェントはこの中に閉じ込められるようです。
Include Layersでは、レイヤーを使ってオブジェクトをフィルタリングできます。床のプレーンにだけ別のレイヤーを設定して、Include Layersでそのレイヤーを選択すると、ベイクするときにゲートを無視します。
Use Geometryでは、メッシュやテレインのジオメトリを使うか、コライダーとテレインのジオメトリを使うかを選べます。
また「NavMesh Agent」や「NavMesh Obstacle」コンポーネントを持つゲームオブジェクトはベイクに含まれません。
Default Areaでは「Not Walkable」などの他のエリアタイプを選ぶこともできます。