Unity で自動車実装 ~NavMesh が少し浮くときの原因と対策~

こんにちは!

Unity の NavMesh 機能をつかって自動車を実装したところ、自動車が地面から浮いてしまう問題が発生しました。

今回はこの問題の調査・解決記録です。

浮き上がる自動車

Unity NavMesh で自動車を実装したところ、下の画像のように若干浮いてしまう事象に直面しました。

影の描画が ON だと、かなり目立ちます...。

原因

ググったところ Qiita の記事がヒットしました。

@VeyronSakai氏の投稿記事 : NavMeshが若干浮いてしまう時の対処法

この記事に基づいて NavMesh の Bake 結果を見てみたところ、確かに NavMesh が浮いていました。

下の画像は、車道と歩道の境界線を拡大したところで、白線の引いてある車道メッシュよりも水色の NavMesh が高い位置に設定されていること・浮いていることがわかります。

これはどうやら Unity の NavMesh を Bake するプロセスによって引き起こされているようです。

Unity では NavMesh を抽出するときに、3D 空間を NavMesh Agent のサイズ基準でボクセル化するようで、1 ボクセルのサイズが大きいほど、このように高度のずれが発生するようです。

そのため解決方法としては、下記 2 点が有効のようです。

  • NavMesh Agent の高さを低くする
  • ボクセル精度を上げる

(先の Qiita の記事でも解決策について言及があります)

対策

今回はボクセル精度を上げることで対策します。

Voxel Size (ボクセルサイズ)とは何か・・・これは公式サイトのマニュアルに書いていたので引用します。

マニュアルボクセルサイズは、ベイクプロセスが動作する精度を変更することができます。

NavMesh ベイク処理は、任意のレベルのジオメトリから NavMesh をビルドするためボクセル化を行います。アルゴリズムの最初の段階で、シーンがボクセルにラスタライズされ、歩行可能な面が抽出されます。最終的に、この歩行可能な面が NavMesh になります。ボクセルサイズは、最終的にできる NavMesh がどのくらい正確に作成されるかの指標となります。

エージェントの半径あたり 3 個のボクセルがあるようにデフォルトの精度が設定されています。つまり、全部のエージェントの幅は 6 ボクセルです。これは、精度とベイク速度との間の良好なトレードオフです。ボクセルサイズを半分にすると、メモリ使用量が4倍に増加し、それはシーンをビルドするために4倍長く時間がかかります。

とりあえず 0.05 に設定して Bake したところ、下図のようになりました。

まだ若干浮いていますが、だいぶ良くなりました。

ちなみに Voxel Size を最小値の "0.012" にしたところ Bake 処理が終わらなくなったので Unity を強制終了しました😅

PC の性能に依存するとは思いますが、最小値に設定するのは止めたほうがよさそうです。

結果

これで自動車の走行実験です。

おぉー素晴らしい!😆

よーく見ると少し浮いているように見えますが、全然気にならないので、とりあえずこれで実装を進めます!

きょうも最後までご覧いただき、ありがとうございました!

スポンサーリンク

Twitterでフォローしよう