OffMeshLinkは複数のNavMeshを繋ぐ上で役に立つ機能です。例えば下のようにメッシュ間に崖がある場合、その辺りを繋いでくれます。
但し、OffMeshLinkは何故か通常より高速で動作する性質があるらしく、若干気持ち悪い動きになってしまいます。
今回はその辺りを何とかします。
OffMeshLink上の動きを一定にする
OffMeshLink上の移動速度を一定にするオプションは無いので、スクリプトで「OffMeshLinkに乗っている時、スクリプトで制御する」ようにします。
コードはこんな感じです。
まず25行目の yield return new WaitWhile(() => agent.isOnOffMeshLink == false);
でOffMeshLinkに乗るまで処理を待機します。
OffMeshLinkに乗ったらagent.Stop();
で一旦Navmeshを停止し、スクリプト上でポジションを動かすようにします。
あとは目標地点に到着したらagent.CompleteOffMeshLink();
とagent.Resume();
で移動を再開するだけです。
もし、OffMeshLinkをジャンプや他のアクションで移動したい場合、30行目~37行目の処理を改造して、上手くアニメーションと合わせる等をするのが良さそうです。
autoTraverseOffMeshLink = falseの意味
サンプルコードでは20行目にagent.autoTraverseOffMeshLink = false;
と記述しています。この処理によって意図的にOffMeshLinkをNavmeshAgentが渡れないように設定しています。 これはNavmeshAgentのisOnOffMeshLink
を確実に動かすためです。
OffMeshLink上での移動はどうもY軸の距離は見ていないらしく、X/Z軸の距離に応じて移動速度を決定しているみたいです。で、X/Z軸が同じだがY軸が異なる…といったケースの場合、0フレームでOffMeshLinkのゴールまで到達してしまうので、isOnOffMeshLink
が動作しません。
そこで「OffMeshLinkに乗るが移動はしない」autoTraverseOffMeshLink
を設定しておくことで、予期しないワープを回避します。