View on GitHub

NavMeshWalker

NavMeshAgentの歩き方をCharacterControllerで制御します。

NavMeshWalker

NavMeshAgentの歩き方をCharacterControllerで制御します。

前提

ライセンス

SDユニティちゃん

本リポジトリーに含まれるSDユニティちゃんのモデルは、ユニティちゃんライセンスで提供されています。

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

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

その他のスクリプトやデータについて

MIT License

Copyright (c) 2018 Yu Tanaka


サンプルの実行方法

こちらでWebGLのデモを試せます。

マウスでユニティちゃんを移動させたい先の床を指します。クリックは不要です。

Unityで試す場合は、ScenesフォルダーのSampleSceneをダブルクリックして開いてPlayします。

組み込み方

プロジェクトへの組み込み方です。おおよそ、以下のような流れです。

  1. パッケージのダウンロードと組み込み
  2. NavMeshをベイク
  3. NavMeshWalkerの設定
  4. 指定の場所を設定するスクリプト
  5. キャラクターを差し替える
  6. アニメーションの設定

組み込みたいプロジェクトを開いた状態で作業をします。

1. パッケージのダウンロードと組み込み

歩かせるゲームオブジェクトのプレハブを組み込みます。

2. NavMeshをベイク

移動ルートを作成するためのNavMeshをベイクします。手順は以下の辺りが参考になると思います。

SDユニティちゃんを使う場合、以下ぐらいの設定が丁度よさそうでした。

SD Unitychan Setting

ベイク結果は以下のような感じです。

Bake result

ベイクしても水色のゾーンが作成されていない場合、足場がNavigation Staticになっていない可能性があります。Static設定するのが手っ取り早いです。

static

3. NavMeshWalkerの設定

歩かせるゲームオブジェクトのプレハブNavMeshWalkerをシーンに配置します。

Playを開始すると、マウスで指した場所に、SDユニティちゃんが歩いていくようになります。

キャラクターが歩く速度や、旋回速度は、NavMeshWalkerの以下の項目で調整できます。

NavMeshWalker Setting

項目 内容
Walk Speed 歩く速度。大きくすると速くなります。
Angular Speed 旋回する時の角速度です。大きくすると速くなります。
Turn Angle 目的地がこの角度よりずれている場合、移動せずにその場で方向転換します。
Turn Angular Speed その場で方向転換する時の回転速度です。大きくすると速くなります。
Speed Down Distance 目的地がこの距離より近い場合、旋回角度の大きさに応じて歩きを遅くします。
Stop Distance 目的地がこの距離以内の場合は到着とみなします。
Speed 2 Anim 移動速度とアニメーションの速度を調整します。大きくすると、移動速度に対して、アニメーションが速くなります。
Stop Speed 移動がこの速度より遅くなったら、アニメーションを立ちアニメにします。
Average Speed アニメの速度を平均化するための係数。細かく旋回する時に立ち絵が挟まると不自然になるので、この値でこれまでの速度と新しい速度を平均化します。

キャラクターが登れる斜面や段差については、Character Controllerで設定します。Character Controllerについてはこちらの公式マニュアルを参照ください。

4. 指定の場所を設定するスクリプト

マウスで指した場所に移動する動きの解除方法

デフォルトのNavMeshWalkerには、マウスで指した場所に移動を設定するデモのためのMouse Click Targetスクリプトが設定されています。

Mouse Click Target

この動作が不要になったらRemoveして下さい。

スクリプトで移動先を設定する方法

スクリプトから移動先を設定する方法です。

using AM1.Nav;
public NavController Target;
Target.SetDestination(target);

これで、スクリプトから移動先を制御できます。

目的地に到着しているかは、以下で確認できます。

if (Target.IsReached) {
    // 到着している
}

スクリプト例

こちらに、オブジェクトをクリックしたら、設定された場所にNavMeshWalkerオブジェクトを向かわせるスクリプトの例があります。

5. キャラクターを差し替える

キャラクターを差し替える手順です。デフォルトのNavMeshWalkerオブジェクトは、子供にSDユニティちゃんのプレハブを持っています。

player object

change model

Set Transform

Set Animator

スクリプトで移動を制御する場合、Apply Root Motionが悪さをする場合があるので、チェックを外しておくとよいでしょう。問題が起きたらチェックを戻してください。

Set Face Catcher

以上で差し替え完了です。

Changed Chr

6. アニメーションの設定

サンプルのアニメーターは以下のようなシンプルなものです。

Animator

このうち、サンプルではStandingWalkingしか使っていません。

サンプルのAnimatorを利用する場合

Animatorはそのまま利用して、Animationを他のものに差し替えるには、Animatorの各状態に設定されているAnimationを変更してください。

Select Status

Set Animation

これでアニメーションのみを差し替えることができます。

独自でAnimatorを作る場合

Animatorを変更したい場合は、Float型のSpeedパラメーターを定義してください。

Speed

スクリプトから、このパラメーターにキャラクターの移動速度を渡しています。この値を使ってStandingWalking、必要ならRunningを切り替えるようにしてください。

制約

本来、NavMeshAgentは他のエージェントを回避するのですが、現在はパスを辿るだけなので、他のエージェントを回避しません。回避の必要性はnextPositionを確認することで把握できると思われますので、必要な場合は改良してください。

NavMeshAgentは常に着地して移動するようになっているため、ジャンプや落下はできません。それらをやりたい場合は、着地しているかを判定して、空中の時はNavMeshAgentを無効にして、着地したら有効にするような制御が必要になります。

また、到着判定でY値を無視するようになっているので、立体交差があるようなマップだと正常に到着が判定できない可能性があります。

不具合報告

不具合がありましたら、Issuesにご報告いただければ幸いです。

参考・関連URL