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

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

状況により移動するルートを変更する

今回はUnityの経路探索、Navmeshについてです。

Navmeshについてはこちら。

[Unity][Navmesh]マップから落ちないようにステージ上を歩かせる楽な方法
[Unity3D]NavMeshの使い方 その1
[Unity3D]NavMeshの使い方 その2
[Unity] Unity3.5新機能 Nav Mesh を試してみた

さて、UnityのNavmeshとは要するに経路を探索して適当な方法で移動する技術ですが、これは状況により望ましくないケースがあります。例えば、地雷原や明らかに狙われているポイントを通過する場合。またレースの草むらのように移動する場合に速度が落ちてしまう場合です。

そういった場合はNavmeshのレイヤーにコストを設定して回避するみたいです。

Navmeshのレイヤーとコスト

このコストを設定すると、距離とコストを考えてコストが高い箇所は通らないように迂回したりするようになります。

下のデモは、実際に3つのルートにコストをかけ、通るルートを変更させるといった事をします。例えば何も設定しなければパス1を通りますが、パス1にコスト10近くかけるとパス2を選択し始めます。パス1にコスト20、パス2にコスト10程度を与えるとパス3を通り始めます。

デモ">
スクリーンショット 2014-01-13 22.28.38
デモ


これのやり方は下のような感じでやります。

  1. Navmeshウィンドウ(メニュー>Navigation)のLayersを選択して、コストを設定するレイヤーの数だけレイヤーに名前を付ける
  2. Navmeshを設定されているオブジェクトを選択し、NavmeshウィンドウのObject>NavmeshLayerよりレイヤーを指定。
スクリーンショット 2014-01-13 22.41.29 スクリーンショット 2014-01-13 22.45.35

これで対応するレイヤーのコストが高い場合、対象のパスを避けて移動するようになります。

また、下のような感じで重さを動的に変更することが出来ます。

NavMesh.SetLayerCost(レイヤー番号, コスト);

これを上手く使うと、例えば2箇所の梯子があった場合、梯子に人が乗っている分だけコストを上げていくと途中から別の梯子を選択するようになります。

地味に面倒です


使い方の資料が全く無かったのでメモ。個人的にはA* Path Projectの方が好み。