Unityのナビゲーション機能を使って決まった場所を巡回させる

今回はUnityのナビゲーション機能を使って、決まった場所を巡回するキャラクターを作成します。

ナビゲーション機能を使って目的地を指定すればNavMeshした場所を自動でルートを決めて移動してくれました。

ナビゲーション機能については

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

の方でもやっているので参考にしてください。

しかし、例えば城で見回りをするキャラクターを作りたい場合は目的地についたら次の目的地に向かって移動してほしいと思います。

そういう時は自動で移動場所を指定しないで、決められた場所をあらかじめ設定しておき、
それらの場所を順々に移動するようにします。

ナビゲーションの機能をつけてあればそれほど難しい処理は必要ありません。

スポンサーリンク

キャラクターを巡回させるスクリプトMoveEnemy2

ではスクリプトを見ていきます。スクリプトの名前は仮にMoveEnemy2としてあります。ネーミングとしては悪い例です。

まずはNavMeshAgentのコンポーネントを入れる変数agent、
移動する場所をインスペクタ上から設定出来るようにpublicでVector3配列の値を宣言します。

このmovePosition変数はVector3で指定せずとも、移動させたい個所にゲームオブジェクトを設定しておき、その個所に移動させるようなスクリプトを組む事も可能です。

その場合は変数の型をTransformにしておき、インスペクタで移動させたい個所のゲームオブジェクトをドラッグ&ドロップします。

nowPositionは今移動している個所の番号を保存しておくint型の変数です。

Start関数内で最初に移動する個所の指定をします。

movePositionは配列なので、配列の要素にnowPositionの値を入れて移動する場所のVector3の値を取得し、それをagentのSetDestinationというあらかじめ定義されている関数を呼ぶ時に渡しています。

これでスタート時に最初の目的地は設定される事になります。

次は移動の処理に関してです。

移動はUpdate関数で常に監視します。

Vector3.Distance関数でMoveEnemy2を設定しているオブジェクトの位置(巡回する敵キャラ)とエージェントの目的地agent.destinationとの距離が0.1fつまり0.1m以内になった時に到着判定をします。

agent.remainingDistanceでエージェントが目的地とどのぐらい離れているかを調べる事が出来ますが、エージェント(敵キャラ)の子要素に主人公キャラを検知するエリアなどを持っていた場合、そのエリアからエージェントの目的地との距離を計算してしまう為、こちらの方法は取りません。

SearchAreaを使わず、Rayを使って主人公を検知している場合はagent.remainingDistanceでも問題ありません。

到着判定がされた場合は、次の目的地をエージェントに指定し、決められた巡回の場所の数を超えていた場合は、最初の巡回地に戻します。

これで永遠に巡回してくれる敵キャラクターを作成出来ます。

今回は巡回の記事なので到着したら次の目的地に即座に移動してしまいますが、
目的地に到着したら一定の秒数待機し、その後次の目的地に移動するという事も出来ます。

また近くに主人公キャラが来たら、主人公を追いかけまわし、見失ったらまた巡回に戻るという処理も出来ます。

そこら辺は

Unityで主人公キャラが近づいてきたら追いかける敵キャラを作る
Unityで主人公キャラクターが敵キャラクターに近づいたら敵が主人公に近づいてくるようにしたいと思います。

の記事を参考にしてください。

見失った時に次の目的地を巡回地に指定すると巡回に戻れます。

これで、ナビゲーション機能の移動を使って、決まった場所を巡回する機能の作成が出来ました。