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

テラシュールブログ

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

【Unity】NavmeshAgaentの移動がOffMeshLink上で妙に加速するのを防ぐ

OffMeshLinkは複数のNavMeshを繋ぐ上で役に立つ機能です。例えば下のようにメッシュ間に崖がある場合、その辺りを繋いでくれます。

但し、OffMeshLinkは何故か通常より高速で動作する性質があるらしく、若干気持ち悪い動きになってしまいます。

今回はその辺りを何とかします。

f:id:tsubaki_t1:20161201025139g:plain

OffMeshLink上の動きを一定にする

OffMeshLink上の移動速度を一定にするオプションは無いので、スクリプトで「OffMeshLinkに乗っている時、スクリプトで制御する」ようにします。

コードはこんな感じです。

gist.github.com

まず25行目の yield return new WaitWhile(() => agent.isOnOffMeshLink == false); でOffMeshLinkに乗るまで処理を待機します。

OffMeshLinkに乗ったらagent.Stop();で一旦Navmeshを停止し、スクリプト上でポジションを動かすようにします。

あとは目標地点に到着したらagent.CompleteOffMeshLink();agent.Resume();で移動を再開するだけです。

f:id:tsubaki_t1:20161201030123g:plain

 

もし、OffMeshLinkをジャンプや他のアクションで移動したい場合、30行目~37行目の処理を改造して、上手くアニメーションと合わせる等をするのが良さそうです。

サンプルコードでは20行目にagent.autoTraverseOffMeshLink = false;と記述しています。この処理によって意図的にOffMeshLinkをNavmeshAgentが渡れないように設定しています。 これはNavmeshAgentのisOnOffMeshLinkを確実に動かすためです。

OffMeshLink上での移動はどうもY軸の距離は見ていないらしく、X/Z軸の距離に応じて移動速度を決定しているみたいです。で、X/Z軸が同じだがY軸が異なる…といったケースの場合、0フレームでOffMeshLinkのゴールまで到達してしまうので、isOnOffMeshLinkが動作しません。

そこで「OffMeshLinkに乗るが移動はしない」autoTraverseOffMeshLink を設定しておくことで、予期しないワープを回避します。

f:id:tsubaki_t1:20161201031014j:plain

f:id:tsubaki_t1:20161201030656g:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp