3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity2021.3.2f1】NavMeshを使ってステージを作ってプレハブ化したい話

Posted at

モチベーション

  • 敵を避けながらステージを進んでゴールまで行くようなゲームを作りたい。
  • NavMeshというのが、キャラを動かすのに便利らしいので勉強してみたい。

ステージを作る

ひとまず動くものを作りたいので、見た目はこだわらずにデフォルトのオブジェクト生成のPlateで地面を作成してCubeを作成しました。
はじめはBoxColliderを付与していたが、NavMeshを使う上では特に必要なさそうでした。
image.png

NavigationWindowからNavMeshをBakeする

後の方に記載するが、NavigationWindowからのBakeはシーンに対するもので、Prefabで作ったステージにNevMeshを張るのは 全く別の方法になります。
似たような設定があるのに共通していない、という少し分かりにくい感じなのでシーンに対するNavMeshについて興味のない人はオブジェクトに対してNavMeshをBakeする方法まで飛ばしてみてもらった方がよいかも知れません。

NavMeshをBakeする前の準備

NavMeshをBakeする前にMeshを張る予定のすべてのオブジェクトに『NavigationStatic』のステータスを付与する必要があります。
image.png

デフォルト設定でのBake

とりあえずステージが出来たので、Window -> AI -> NavigationでNavMeshのWindowを開いてBakeを実行。
image.png
!?
image.png
どうやら、StepHeightやMaxSlopeの設定で、登れる場所と認識されてしまった様子。

BakedAgentSizeの設定変更によるBake

平面で動かすようなゲームなら、MaxSlopeを0、StepHeightを0.01のように設定するのがよさそう。
image.png

他のオブジェクトを進入禁止にする方法

他の手段として、Objectのタブを開いた状態で、SceneやHierarchyでオブジェクトを選択して『NavigationArea』で『Not Walkable』を選択するとそのオブジェクトはBakeの対象にならないので、キチンとしたものを作るのはこちらの方がよさそう。
『NavigationArea』での選択はAreasタブで追加できて、ルートのコストを設定することも出来る様子。レースゲームの砂漠地帯みたいな、通行可能だけれど極力通りたくない、みたいなエリアを作る時に有用そう。
image.png

NavigationからのBakeはシーンに対して

さて、Bakeが完了したので次のステージを作ろうといったんステージを非アクティブにしたところ、Navigationでの表示はBakeされたものが残っている。
つまりこのMeshはオブジェクトに対してではなく、シーンに対してBakeされている様子。(まぁ、考えればオブジェクトを指定してBakeしているわけではないし、そりゃそうかという感じ)
RPGとかなら、シーンごとにNavMeshをBakeしても問題なさそうだけれども、今回はステージをPrefabにして1シーンで入れ替えたいのでオブジェクトにBakeする方法を考える。
image.png

オブジェクトに対して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の有効・無効を切り替えることができるようになります。
image.png

NavMeshSurfaceを使用する際の注意

Meshの可視化

Bakeを行う際、Prefabをダブルクリックで開いた状態で行うと、何故かNavMeshが可視化できず、どのようにBakeされたのか分かりません。
Scene上でPrefabを開いてBakeするか、Scene上でBakeをしてApplyするかするのがよさそうです。
image.png

Bakeの対象

NavigationではGameObjectに『NavigationStatic』の設定をしていたが、NavMeshSurfaceではその設定の必要がありません。
代わりに、存在するMeshRendererすべてがNavMeshの対象になる様子です。
プレハブにするなら、ステージの親にNavMeshSurfaceをアタッチしてCollectObjectsのターゲットを『Children』にするのがよさそうな雰囲気。
Volumeは指定範囲内のでのMeshを作成するので、ブロックを組み合わせてマップを作るようなゲームなら有用そう。
image.png

通れないオブジェクトの設定

NavigationでBakeする際は『Object』のタブを使ってNavigationAreaを変更しても対応できない。
そのため、通れなくするオブジェクトにNavMeshModifierをアタッチしてOverideAreaにチェックしてAreaTypeをNotWalkableに設定することで、Bakeの対象から外すことができる。
image.png

Agentの設定

NavMeshSurfaceのBakeはNavigationと違ってAgentのMaxSlopeやStepHeightを制御できないように見えますが、AgentTypeの項目がNavigationのAgentsの項目に紐づいているので、こちらで設定を変更すれば反映されます。
image.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?