Unityで主人公をナビゲーション機能とマウスクリックで移動させる

Unityでマウスクリックした位置にキャラクターを移動させる方法
Unityのアクションゲームでマウスクリックした位置にキャラクターが移動する機能を作成していきます

で主人公キャラクターをクリックした位置に移動させる事が出来ました。

細かく移動先を指定する事は出来たものの、途中に障害物がある場合、その先の地点をクリックしても壁に突入して移動が出来ません。

途中に障害物があってもそれを避けてクリックした位置に移動するような機能を作る場合ナビゲーション機能が便利です。

スポンサーリンク

ナビゲーションエージェントの設定

今回はナビゲーション機能を主人公に取りつけクリックした位置に障害物を避けながら移動するキャラクターにします。

移動スクリプトは前述した『Unityでマウスクリックした位置にキャラクターを移動させる方法』の記事で使用した物を改造しますのでそちらを参照してください。

またナビゲーション機能に関しては

敵キャラをUnityのナビゲーション機能を使って移動させる
Unityのナビゲーション機能を使って敵キャラクターを移動させます。ナビゲーション機能はあらかじめBakeされたフィールドを移動出来る機能です。

を参照してください。

主人公キャラを選択し、インスペクタからAdd Component→Navigation→Nav Mesh Agentを選択して追加してください。

ナビゲーション移動4

Agent Size
Radius、Heightはエージェントのサイズ、コライダと同じような感じです。
Base OffsetはRadius、Heightとキャラクターのオフセット?謎

Steering
Speedはエージェントの最高速度、一番速く移動する時のスピードです。
AngularSpeedは曲がる時のキャラクターの回転の最高速度
Accelerationは最高加速度、数値を高くすると走りだし等で一気に加速します。
Stopping Distanceは目的地にどれだけ近づいたら止めるか
Auto Brakingはチェックを入れると目的地で止まります。チェックしないと止まらずずっと動き続けます。

Obstacle Avoidance
QualityはNavMeshObstacleを設定したゲームオブジェクトとの避け方の品質
Priorityはエージェントの優先度、自分より優先度の低いものを無視します。今のところ使い方がわからない

PathFinding
Auto Traverse OffMesh Linkはオフメッシュリンク(ナビゲーションのワープポイントみたいなもの)を自動で移動するかどうか
Auto Repathはチェックを入れると部分的な終了地点到達時に再度経路を探索します。到達不可能な経路に来た時に違う経路を探してくれる?
Area Maskはエージェントが移動出来る場所を指定します。

エージェントが移動出来るエリア(地面)を作成

ナビゲーションエージェントを取りつけた主人公キャラが移動出来るエリアを作成します。

ナビゲーション移動1

フィールドや坂等キャラクターが移動できる地面のゲームオブジェクトのインスペクタのStaticにチェックを入れます。
上の画像のように地面にあたるゲームオブジェクトすべてのStaticにチェックを入れます。

ナビゲーション移動2

上のようにNavigationタブを表示させます(Unityメニュー→Window→Navigation)。
画像ではインスペクタが上から下まで長くなってしまって全部を表示するのがためらわれました。

・・下の方にBakeボタンがあるので押します。

Agent Radius、Agent Heightはエージェントの範囲です。
Max Slopeはエージェントが昇れる坂の角度
Step Heightは昇れる段差の高さ
Drop Height、Jump Distanceはオフメッシュリンクを自動で生成する時に落ちる高さと横の距離を指定出来ます。

オフメッシュリンク(地続きでない場所を移動する機能)は自分でも作成出来ます。
自動で生成する場合はObjectタブでGenerate OffMeshLinksのチェックを入れます。

主人公をナビゲーション機能を使って動かすNavMoveスクリプトを作成

ナビゲーションエージェント(主人公)が歩ける場所が出来たので次は主人公がマウスクリックされた位置に移動するNavMoveスクリプトを作成します。

キャラクターをクリックした方向に向けたり、CharacterControllerを使って移動させる必要がなくなるので、スクリプトがかなり簡潔になります。
ただ移動経路を探索するので処理が多くなります。

スクリプトが出来たのでキャラクターに設定します。
NavMoveのインスペクタでMouseDownModeにチェックを入れます。

これでマウスクリックした位置にキャラクターが動くようになります。
チェックを入れない場合はマウスクリックしなくてもマウスの位置に移動しますが、処理負荷がかなり大きくなります。

アニメーターコントローラの設定が終わってない方は

Unityのアニメーションの切り替えシステムとスクリプト
Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

を参照して作成してください。

ナビゲーション機能とマウスクリックで移動が出来るか確認する

これでナビゲーション機能とマウスクリックで移動の機能が完成したので
Unityの実行ボタンを押して確認してみましょう。

ナビゲーション移動3

上のように坂をクリックすると坂の横にぶつからず迂回して坂を昇るようになりました。
途中にBakeされた障害物があればそれを回避して目的地に移動します。

ナビゲーション機能で注意しなければいけないのは、ゲームオブジェクトのStaticにチェックを入れてBakeしたものの上しか移動しない事です。
途中にBakeしていない障害物等があると通り抜けてしまいます。

ナビゲーションエージェントが障害物、移動出来る場所として認識するにはStaticにチェックを入れてBakeする必要があります。

Staticにチェックを入れると他のなんたらStaticにもチェックが入ります。

なんたらStaticはいくつか種類がありますが・・・わたくしは今のところ使い分けする必要がないのでわかりません(^_^;)

なんたらStaticを個別で指定したい場合はチェックボックスの横の↓記号の所をクリックして個別にチェックを入れます。

また動くゲームオブジェクトを障害物として認識(敵キャラ等が動く障害物にあたる)したい場合はNavMeshObstacleを使う必要があります。

NavMeshObstacleに関しては

敵キャラをUnityのナビゲーション機能を使って移動させる
Unityのナビゲーション機能を使って敵キャラクターを移動させます。ナビゲーション機能はあらかじめBakeされたフィールドを移動出来る機能です。

を参照してください。

これでキャラクターをナビゲーション機能を使って頭のいい動きをしてくれるようになりました。

この機能を使えば遠くの地点をクリックして移動先を指定したとしてもナビゲーション機能で移動経路を探索し最適な経路で移動してくれます。
これは非常に便利ですね!