NavMeshWalker
NavMeshAgentの歩き方をCharacterControllerで制御します。
前提
- Unity2017.3以降で動作確認
ライセンス
SDユニティちゃん
本リポジトリーに含まれるSDユニティちゃんのモデルは、ユニティちゃんライセンスで提供されています。
この作品はユニティちゃんライセンス条項の元に提供されています
その他のスクリプトやデータについて
Copyright (c) 2018 Yu Tanaka
サンプルの実行方法
こちらでWebGLのデモを試せます。
マウスでユニティちゃんを移動させたい先の床を指します。クリックは不要です。
Unityで試す場合は、ScenesフォルダーのSampleSceneをダブルクリックして開いてPlayします。
組み込み方
プロジェクトへの組み込み方です。おおよそ、以下のような流れです。
- パッケージのダウンロードと組み込み
- NavMeshをベイク
- NavMeshWalkerの設定
- 指定の場所を設定するスクリプト
- キャラクターを差し替える
- アニメーションの設定
組み込みたいプロジェクトを開いた状態で作業をします。
1. パッケージのダウンロードと組み込み
歩かせるゲームオブジェクトのプレハブを組み込みます。
- Releasesページから、最新版のNavMeshWalker.?.?.?.unitypackageをダウンロードします
- プロジェクトにインポートします
2. NavMeshをベイク
移動ルートを作成するためのNavMeshをベイクします。手順は以下の辺りが参考になると思います。
SDユニティちゃんを使う場合、以下ぐらいの設定が丁度よさそうでした。
ベイク結果は以下のような感じです。
ベイクしても水色のゾーンが作成されていない場合、足場がNavigation Staticになっていない可能性があります。Static設定するのが手っ取り早いです。
3. NavMeshWalkerの設定
歩かせるゲームオブジェクトのプレハブNavMeshWalkerをシーンに配置します。
- Projectビューで、NavMeshWalker/Prefabsフォルダーを開きます
- NavMeshWalkerプレハブを、シーンかヒエラルキーにドラッグ&ドロップして、配置します
Playを開始すると、マウスで指した場所に、SDユニティちゃんが歩いていくようになります。
キャラクターが歩く速度や、旋回速度は、NavMeshWalkerの以下の項目で調整できます。
項目 | 内容 |
---|---|
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スクリプトが設定されています。
この動作が不要になったらRemoveして下さい。
スクリプトで移動先を設定する方法
スクリプトから移動先を設定する方法です。
- 座標を設定するためスクリプトの冒頭で、以下の
using
を追加します
using AM1.Nav;
- アタッチしたスクリプトに、NavControllerを保持する変数を宣言します。ここに、UnityのインスペクターでNavMeshWalkerをドラッグ&ドロップするなどして、指示先のインスタンスを設定します
public NavController Target;
- 座標を設定するのは、
Target
のSetDestination()
メソッドに、目指す座標を渡します
Target.SetDestination(target);
これで、スクリプトから移動先を制御できます。
目的地に到着しているかは、以下で確認できます。
if (Target.IsReached) {
// 到着している
}
スクリプト例
こちらに、オブジェクトをクリックしたら、設定された場所にNavMeshWalkerオブジェクトを向かわせるスクリプトの例があります。
5. キャラクターを差し替える
キャラクターを差し替える手順です。デフォルトのNavMeshWalkerオブジェクトは、子供にSDユニティちゃんのプレハブを持っています。
- 差し替えたいキャラクターを同じように子供にして、SD_unitychan_humanoidは削除します
- モデルの座標を
0, 0, 0
にして、奥を向くように回転を調整します
- Animatorコンポーネントをアタッチして、Controllerにアニメーターデータを設定します。サンプルとして、SDユニティちゃんのアニメデータを利用した簡単なものをAnimations/NavMeshWalkerに用意してあります
スクリプトで移動を制御する場合、Apply Root Motion
が悪さをする場合があるので、チェックを外しておくとよいでしょう。問題が起きたらチェックを戻してください。
- SDユニティちゃんのアニメを利用する場合、表情変更のイベントを受け取る必要があります。エラーが出ないようにスタブメソッドを定義した
FaceCatcher.cs
を用意したので、Demo/Scripts
フォルダーから、Animator
コンポーネントをアタッチしているオブジェクトにドラッグ&ドロップしてアタッチします
以上で差し替え完了です。
6. アニメーションの設定
サンプルのアニメーターは以下のようなシンプルなものです。
このうち、サンプルではStandingとWalkingしか使っていません。
サンプルのAnimatorを利用する場合
Animatorはそのまま利用して、Animationを他のものに差し替えるには、Animatorの各状態に設定されているAnimationを変更してください。
- Animatorウィンドウで差し替えたい状態を選択します
- InspectorのMotino欄に、変更したいアニメーションをドラッグ&ドロップします
これでアニメーションのみを差し替えることができます。
独自でAnimatorを作る場合
Animatorを変更したい場合は、Float
型のSpeed
パラメーターを定義してください。
スクリプトから、このパラメーターにキャラクターの移動速度を渡しています。この値を使ってStandingやWalking、必要ならRunningを切り替えるようにしてください。
制約
本来、NavMeshAgentは他のエージェントを回避するのですが、現在はパスを辿るだけなので、他のエージェントを回避しません。回避の必要性はnextPosition
を確認することで把握できると思われますので、必要な場合は改良してください。
NavMeshAgentは常に着地して移動するようになっているため、ジャンプや落下はできません。それらをやりたい場合は、着地しているかを判定して、空中の時はNavMeshAgentを無効にして、着地したら有効にするような制御が必要になります。
また、到着判定でY値を無視するようになっているので、立体交差があるようなマップだと正常に到着が判定できない可能性があります。
不具合報告
不具合がありましたら、Issuesにご報告いただければ幸いです。