Unityに関連する記事です

 Unity 2022.2 以降より、標準で搭載されていた AI Navigation(NavMesh) の機能が廃止され、Package Manager 経由でインストールして利用する形式になりました。

 今まで Github にて公開されていた NavMeshComponent の機能に近い形での変更が入っているため、
2022.1 以前とは、事前の準備や、Bake の使用方法が異なっています

参考サイト
Unity 公式マニュアル
AI Navigation




Package Manager


 Package Manager を開いて、Packages を Unity Registry に変更し、AI Navigation を選択してインストールを行います。





メニュー


 ヒエラルキーにおいてメニューを表示し、AI の中から選択したゲームオブジェクトを作成して利用します。





 例えば NavMesh Surface を選択すると、このコンポーネントがアタッチされたゲームオブジェクトが作成されます。





 このコンポーネントを持つゲームオブジェクトが Bake 機能を有します。


Navigation ビュー


 Package Manager から AI Navigation をインストールすると、Window メニューに AI コマンドが追加されます。





 以前は NavMeshAgent コンポーネントをアタッチすると自動的に Navigation ビューがインスペクタービューの隣に追加されましたが、
2022.2 以降は、Window メニューから操作して Navigation ビューを手動で表示させる必要があります。

 



 タブが2種類だけになっており、Bake のボタンもありません。


Navigation window reference



 なお、Navigation(Obsolute) コマンドを選択すると、以前の形式の Navigation ビューを表示できます。





Bake の方法


 Navigation ビューから Bake を行う方式から変更になっています。

 Bake を行うには、ゲームオブジェクトに専用のコンポーネントをアタッチし、ゲームオブジェクト単位で設定を行い、Bake を行う方式です。


NavMesh Surface コンポーネント


 NavMesh の Bake を行うコンポーネントです。

 Agent Type に設定した情報を元に Bake を行います。
設定部分自体は、以前の Navigation ビューに用意されていた情報に似ています。

 以前の Bake は static に設定されているゲームオブジェクトに対して処理を行っていましたが
Agent Type ごとに分けることは出来ませんでしたので、この部分も大きく異なります。





参考サイト
Unity 公式マニュアル
NavMesh Surface



NavMesh Obstacle コンポーネント


 NavMesh の Bake を行った際に障害物と認識させるためのコンポーネントです。
以前は Bake 時に static であれば、Bake の情報に該当しないものは自動的に障害物として設定されましたが
今回からは、障害物として使いたい各ゲームオブジェクトにこのコンポーネントをアタッチしておく必要があります。

 AI メニューのコマンド内には存在していませんので、いままでと同じように、任意のゲームオブジェクトにアタッチして利用します。




参考サイト
Unity 公式マニュアル
NavMesh Obstacle


サンプルスクリプト


 NavMeshAgent 自体に変更はありませんので、今までと同じソースコードで AI による経路移動が実装出来ます。

 以下は NavMeshAgent を利用した、指定した対象を経路移動を行って追従する、シンプルな実装例です。




補足


 NavMesh の情報をランタイムで設定することが出来るようになっているため、以前のようにゲームオブジェクトに static の設定を行う必要はありません
2022.2 以降では Navigation Static が選択できないようになっています。






 
 NavMeshAgent コンポーネント、OffMeshLink コンポーネントの機能などは、そのまま残されています。

 また NavMeshComponent の機能が統合されたことにより、2Dへの利用もできるようになっています。



 今回は割愛していますが、NavMeshModifierVolume コンポーネントと NavMeshModifier コンポーネントを組み合わせることで
一部のエリアのみを指定して Bake 情報を上書きすることが出来ます。


NavMeshModifierVolume

NavMesh Modifier




 プロジェクトの制作途中で Unity のバージョンアップを行ったときの対応策として、
AI メニューの中に NavMesh Updater コマンドが用意されています。

 このコマンドを実行することで、2022.2 以前のバージョンの NavMesh の情報を
2022.2 以降のバージョンに自動的に切り替えることが出来るようになっています。





 下記の公式マニュアルに手順が載っています。


Upgrade projects for use with AI Navigation package


2Dタイルマップの場合


・すべての Tilemap ゲームオブジェクトは Static に設定し、TilemapCollider2D コンポーネントと NavMeshSourceTag2D コンポーネントをアタッチする。

・Bake して歩かせたい Tilemap は「NavMeshSourceTag2D」の Area を 0 にする。
 また、タイルの設定を Grid か Sprite に設定し、SpriteEditor の Custom Physics で白い枠をつける。

・歩かせたくない Tilemap は「NavMeshSourceTag2D」の Area を 1 にする。
 タイルの設定はどれでもよい。

・CompositeCollider2D がアタッチされていると、正常にBake できない。
 そのため、CompositeCollider を一旦リムーブし、Bake してから追加することでコライダーを結合できる。

・これらを満たした上で NavMeshBuilder2D コンポーネントの Bake を押すことで Bake できる。Bake On Enable にチェックを入れておく。
 このゲームオブジェクト自体は Static である必要なし。

・Bake 後、そのままだと、NavMesh を Bake したコライダーによって、プレイヤーのコライダーと接触してしまって移動できなくなる。
 回避方法は主に2つ。

Bake したゲームオブジェクトをゲーム実行時に SetActive(false) で非表示にすることで、Bake の情報のみを残すことが出来る。
 この場合、スクリプトで制御する。

Bake 用の Tilemap に Layer を設定し、Layer Collision Matrix でプレイヤーと接触しないようにする。




<Radius 調整後>

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます