最短経路を探索して進む知的なAIを簡単に作るUnityUnityのナビゲーションシステムで最短経路を探索して進む知的なAIを簡単に作る方法をまとめました。障害物を避けながら目的地まで進む知的なキャラクター(エージェントと呼びます)を簡単に作成できます。この記事ではナビゲーションシステムの基本的な使い方を紹介します。前提として、検証用に以下のようにPlaneメッシュを組み合わせて地形を作っておきます。ナビメッシュを生成するナビゲーションシステムを使うには、まずナビメッシュ(NavMesh)と呼ばれる経路探索用のデータを生成する必要があります。Staticとしてマークします。NavigationからNavigationウィンドウを開きます。ウィンドウが開いたらBakeタブを選択します。次にこのウィンドウで基本的な設定をしていきます。以下の4つを理解すれば基本的なNavMeshが作れます。エージェントがどれだけ高い段差を登れるか適当に設定したらBakeボタンを押下してNavMeshを作ります。Sceneビューを見ると正常に生成されていることが確認できます。青い部分がナビメッシュです。凸多角形のポリゴンで構成されていることが確認できました。Bake時の詳細設定項目さてNavigationウィンドウのBakeタブの下部にはさらに詳細な設定項目があります。Sizeですが、これはNavMeshが粗くて地形のメッシュの形状と全然異なってしまうときに使います。ボクセルサイズを小さくするほど精度が上がりますが、ベイク時間も比例して増加します。この設定項目は通常は変えることはないと思います。いま、次のように小さい独立したNavMesh領域が作られていたとします。Areaはこのような独立したNavMeshの最小の大きさを定義する値です。この値を大きくすると、小さいNavMeshしか作れない領域は無視されます。低めの階段などは斜めのNavMeshとして生成されることが多いです。Meshにチェックを入れます。高さ用のメッシュ情報が別途生成されます。エージェントを動かす次に作成したNavMesh上にエージェントを配置して動かしてみます。適当にCylinderを作成してNavMeshAgentコンポーネントをアタッチします。このNavMeshAgentのvelocityに値を代入するとエージェントを動かすことができます。}}また、NavMeshAgent.destinationに座標を入れるとそこまで最短距離で自動的に移動してくれます。}}動的に動く障害物を設定する次に動的に動く障害物を設定してみます。適当にCubeを生成し、NavMeshObstacleコンポーネントをアタッチします。これで再生すると、障害物の部分は通れなくなっていることが確認できます。ここで、上図から見て取れるようにこの障害物はナビメッシュ自体には変化を与えていません。経路探索の際にはこの障害物の部分も経路として計算されてしまいます。NavMeshを障害物によって削るにはNavMeshObstacleのCarveにチェックを入れます。するとこの障害物の形にNavMeshが削り取られます。NavMeshの形が変わるということはA*によるグローバルな経路探索もやり直しになるということを意味します。これは比較的重い処理であり、頻繁に行われるとパフォーマンスに影響してしまいます。そのためCarveは基本的にはOFFにして、必要なケースだけONにする必要があります。これに関してはナビゲーションシステムの仕組みから理解する必要があるため、以下の記事にまとめました。Linkで非連続なNavMesh間を移動する今このように非連続なNavMeshが生成されているとします。このような場合にはオフメッシュリンクを使うと、離れたNavMesh間が経路として繋げられます。使い方としては、適当なGameObjectにOffMeshLinkコンポーネントをアタッチして、結びたい二点をStartとEndにアサインします。NavMeshを表示した状態で二つのオフメッシュリンクの周りに円が表示されていて、かつ線でつながれていればOKです。この状態で、離れたNavMesh上の位置にdestinationを設定して再生します。オフメッシュリンクにより離れたNavMeshがつながれていることが確認できました。Linkを自動的に作る段差から飛び降りるためのオフセットリンクと、ジャンプして溝を飛び越えるためのオフセットリンクはベイク時に自動生成することもできます。OffMeshLinksにチェックを入れます。Linksに、飛び降りることが可能な高さとジャンプ可能な距離を入力します。設定が終わったらあとはベイクすれば、オフメッシュリンクが自動的に生成されます。1はてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。