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

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

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

f:id:tsubaki_t1:20161201025139g:plain

  • OffMeshLink上の動きを一定にする
  • autoTraverseOffMeshLink = falseの意味
  • 関連

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