今回はUnityのナビゲーション機能を使って、決まった場所を巡回するキャラクターを作成します。
ナビゲーション機能を使って目的地を指定すればNavMeshした場所を自動でルートを決めて移動してくれました。
ナビゲーション機能については
の記事でやっていますのでそちらを参考にしてください。
しかし、例えば城で見回りをするキャラクターを作りたい場合は目的地についたら次の目的地に向かって移動してほしいと思います。
そういう時は自動で移動場所を指定しないで、決められた場所をあらかじめ設定しておき、
それらの場所を順々に移動するようにします。
今回の機能を搭載すると、
↑のような感じで敵が巡回をします。
主人公が敵の検知エリアに入った時は追いかけられますが、検知エリアを出た時はまた巡回に戻るようになります。
ナビゲーションの機能をつけてあればそれほど難しい処理は必要ありません。
キャラクターを巡回させる
ここまでわたくしの記事をご覧頂いた方はSetPositionスクリプトで目的地を設定していましたのでそこで巡回地点を周るようにしていきます。
Unity5.5バージョン?以降で、C#でスクリプトを組んでいる場合は
using UnityEngine.AI;
というusingディレクティブを入れておくといいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetPosition : MonoBehaviour { // 初期位置 private Vector3 startPosition; // 目的地 private Vector3 destination; // 巡回する位置 [SerializeField] private Transform[] patrolPositions; // 次に巡回する位置 private int nowPatrolPosition = 0; void OnEnable() { // 初期位置を設定 startPosition = transform.position; // 巡回地点を設定 var patrolParent = GameObject.Find("ZombiePatrolPositions"); patrolPositions = new Transform[patrolParent.transform.childCount]; for (int i = 0; i < patrolParent.transform.childCount; i++) { patrolPositions[i] = patrolParent.transform.GetChild(i); } } // ランダムな位置の作成 public void CreateRandomPosition() { // ランダムなVector2の値を得る var randDestination = Random.insideUnitCircle * 8; // 現在地にランダムな位置を足して目的地とする SetDestination(startPosition + new Vector3(randDestination.x, 0, randDestination.y)); } // 巡回地点を順に周る public void SetNextPosition() { SetDestination(patrolPositions[nowPatrolPosition].position); nowPatrolPosition++; if (nowPatrolPosition >= patrolPositions.Length) { nowPatrolPosition = 0; } } // 目的地を設定する public void SetDestination(Vector3 position) { destination = position; } // 目的地を取得する public Vector3 GetDestination() { return destination; } } |
まず巡回する地点をTransformの配列にインスペクタで指定出来るようにします。
現在の巡回地点はnowPatrolPositionの番号で保持します。
今まではCreateRandomPositionメソッドを呼び出して、スタート地点にランダムな位置を足して目的地を作成していましたが、
SetNextPositionメソッドを使ってpatrolPositionsの地点を順々に周るようにします。
敵をプレハブにしてインスタンス化する場合はインスペクタでpatrolPositionsを設定出来ない為、OnEnableメソッドで巡回する地点の親のゲームオブジェクトを取得し、巡回地点を設定することにします。
敵の操作スクリプトで目的地を設定している箇所をCreateRandomPositionからSetNextPositionに変更します。
敵の巡回地点を作成する
次にpatrolPositionsに設定する巡回地点を作成していきます。
空のゲームオブジェクトを作成し、名前をZombiePatrolPositionsとします。
ZombiePatrolPositionsの子要素に空のゲームオブジェクトを作成し、巡回地点を作りそれぞれ移動させます。
↑のように4地点を巡回させるようにします(上ではZonbieとなってますがZombieが正解です)。
実際の巡回地点は
↑のような位置にしました。
敵のSetPositionスクリプトのpatrolPositionsに今作成した巡回地点を設定します。
これで機能が完成しました。
終わりに
敵キャラの検知エリアに主人公が入った時に追いかける処理は、
の記事でやっていますが、両方を搭載すると巡回中の敵が主人公に気付くと主人公を追いかけ始めますが、見失った時は巡回に戻るようにする事が出来ます。
これで、ナビゲーション機能の移動を使って、決まった場所を巡回する機能の作成が出来ました。