たるこすの日記

読者です 読者をやめる 読者になる 読者になる

たるこすの日記

リアルからバーチャルへ、バーチャルからリアルへ

HoloLens の空間マップで NavMesh を使ってみる

HoloLens Unity

Unity 5.6 でナビゲーション機能が強化され、動的に NavMesh を構築できるようになりました。
NavMesh はキャラクターなどが移動できる面を表しており、NavMesh を設定したうえで NavMeshAgent を使えばルート探索や移動を行わせることができます。

動的に NavMesh を構築できるようになったことで、HoloLens で認識した空間マップに対し NavMesh を設定できるようになりました。
今回はこの機能を試してみようと思います。

HoloLens と NavMesh

HoloLens の空間マップでの NavMesh の利用は、すでに @morio36 さんが記事にされているのでそれを参考にさせていただきます。

また、以下のリポジトリに NavMesh のサンプルがいくつか用意されており、参考になります。

Unity プロジェクトの作成

Unity 5.6.0f3 を使います。

新しいプロジェクトを作成し、HoloToolkit-Unity-v1.5.6.0 をインポートします。
シーンから Main Camera を削除し、以下のプレハブを追加します。

  • HoloLensCamera
  • InputManager
  • CursorWithFeedback
  • SpatialMapping

SpatialMapping の Spatial Mapping Observer で設定する Triangles Per Cubic Meter の数値を大きくすると、SpatialMapping のメッシュが細かくなります。
今回は 500 → 2000 に変更しておきました。

また、NavMeshComponents に入っている以下のスクリプトをインポートしておきます。

  • LocalNavMeshBuilder.cs
  • NavMeshSourceTag.cs

動的 NavMesh 作成

SpatialMapping で作成されたオブジェクトで動的に NavMesh を作成します。
NavMesh に追加したいオブジェクトに NavMeshSourceTag.cs をアタッチし、LocalNavMeshBuilder.cs で NavMeshSourceTag.cs がついたオブジェクトを集めて NavMesh を作成します。

NavigationManager という名前で空の GameObject を作成し、 LocalNavMeshBuilder.cs をアタッチします。
SpatialMappingNavMesh.cs を以下のように作成してアタッチし、Inspector で SpatialMapping を設定します。
このスクリプトは、SpatialMapping によって作成されたオブジェクトに NavMeshSourceTag.cs を追加します。

Agent の設定

Windows > Navigation で Agent タブを開き、Agent の大きさや乗り越えられる高さの設定を行います。
今回は以下の写真のように設定しました。

Navigation を開いた状態で Holographic Remoting Player を利用して実行してみると、以下のように NavMesh が作成されている範囲が青く表示されるはずです。

青い領域が表示されなかったり少ししか表示されないという場合には、Agent が大きすぎることが原因かもしれません。
Agent の設定を変更して試してみてください。

SDユニティちゃんを歩かせてみる

こちらのサイトから unitypackage をダウンロードしてインポートします。
SDユニティちゃん 3Dモデルデータ - ダウンロード - UNITY-CHAN! OFFICIAL WEBSITE

Assets\UnityChan\SD_unitychan\Prefabs\SD_unitychan_humanoid をシーンに追加し、スケールを調整します。
今回は x, y, z ともに 0.3 に設定しました。

さらに、Idle Changer を無効にし、 Nav Mesh Agent を加えて Speed や Obstacle を調整します。

次に、Agent での移動に合わせて、歩く、走るといったモーションを付けられるようにします。
この部分は以下のサイトを参考にしました。

Animator Controller を作成し、Palameters に Speed を追加します。

また、Blend Tree を作成し、以下の 3つのモーションを登録します。

Motion Threshold
Standing@loop 0
Walking@loop 0.3
Runnning@loop 5

Controller が作成出来たら、SD_unitychan_humanoid の Animator の Controller に設定し、Animator の ApplyRouteMotion のチェックを外します。

さらに、以下のスクリプトを作成し、アタッチします。
このスクリプトでは、エージェントの移動速度に合わせて Speed の値を設定しています。

あとは、Nav Mesh Agent に対して移動の目的地を設定すれば、移動可能な範囲から経路を探索し移動させることができます。

今回は移動先の設定方法として、以下の2通りを試してみます。

  • Air-Tapしたポイントに目的地を設定する
  • ランダムに目的地を設定する

Air-Tap したポイントに目的地を設定する

空の GameObject を作成して MoveToClickPoint と名前を付け、以下の MoveToClickPoint.cs と LineRenderer をアタッチします。

これで、Air-Tap した位置が目的地になりSDユニティちゃんが移動してくれます。

ランダムに歩かせてみる

先ほど作成した MoveToClickPoint を一旦無効にします。

RandomWalk.cs を以下のように作成し、SD_unitychan_humanoid にアタッチします。

さらに、空の GameObject を作成し、以下のように SpawnObject.cs を作成してアタッチします。

インスペクタで SD_unitychan_humanoid をプレハブにしたものを設定します。

これにより、Air-Tap した位置にSDユニティちゃんが出現し、ランダムに目的地を設定し移動するようになります。

おわりに

NavMesh を使うことで、簡単にキャラクターを移動させることができました。
HoloLens をお持ちの方はぜひお試しください。

ユニティちゃんライセンス

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