【Unity】(Version: 2022.2以降対応)複数地点を巡回するGameObjectを作成する方法
敵などを設定した複数の地点を巡回するようにするやり方です。
NavMeshを使います。
※Version: 2022.2以降を使用している方はBakeのやり方が変わっています。
以下を参照
完成動作
作り方(動画)
作り方(ブログ)
1.シーンに各オブジェクトを配置
1-1.以下のようにGameObjectを配置する。
Floor(Cubu)が床、Patroller(赤いCube)が今回巡回させるオブジェクト
2.巡回させたい地点を作成
2-1.空のGameObjectを作成
2-2.名前を"WayPointA"に変更
2-3."WayPointA"を巡回させたい地点に置く
今回は左上に配置
2-4."WayPointA"を複製(Ctrl+Dなど)して、"WayPointB"として巡回させたい位置に置く。
今回は左下に配置
2-5.2-4を繰り返して任意の数の"WayPoint"を作成
今回はWayPointDまでの4つ作成(それぞれ4つの角に置いた)
3.NavMeshをベイク(Bake)
NavMeshを使ってPatrollerオブジェクトを巡回させるので、Patrollerオブジェクトを巡回させる場所をBakeする。
3-1.HierarchyタブでFloorオブジェクトを選択して、InspectorタブのStatic欄で"Navigation Static"を選択
※"Navigation Static"を選択したGameObjectしか、NavMeshでBakeされない(移動可能にならない)
3-2.以下のように選択して"Navigation"タブを表示する。
3-3.とりあえず設定はデフォルトのままで、"Bake"タブを選択して右下の"Bake"を押下
パソコンのスペックによっては"Bake"に時間がかかるので待つ。
3-4.Sceneタブを見て、"Navigation Static"にしたFloorオブジェクトが青い枠で囲われていることを確認
この青い枠が、NavMeshAgentを使用して移動できる範囲
4.複数地点を巡回させるスクリプトを作成
4-1.WaypointPatrol.csという名前のスクリプトを作成して、以下のコードを記載する。
using UnityEngine;
using UnityEngine.AI;
// NavMeshAgentコンポーネントがアタッチされていない場合アタッチ
[RequireComponent(typeof(NavMeshAgent))]
public class WaypointPatrol : MonoBehaviour
{
[SerializeField]
[Tooltip("巡回する地点の配列")]
private Transform[] waypointArray;
// NavMeshAgentコンポーネントを入れる変数
private NavMeshAgent navMeshAgent;
// 現在の目的地
private int currentWaypointIndex = 0;
// Start is called before the first frame update
void Start()
{
// navMeshAgent変数にNavMeshAgentコンポーネントを入れる
navMeshAgent = GetComponent<NavMeshAgent>();
// 最初の目的地を入れる
navMeshAgent.SetDestination(waypointArray[currentWaypointIndex].position);
}
// Update is called once per frame
void Update()
{
// 目的地点までの距離(remainingDistance)が目的地の手前までの距離(stoppingDistance)以下になったら
if (navMeshAgent.remainingDistance <= navMeshAgent.stoppingDistance)
{
// 目的地の番号を1更新(右辺を剰余演算子にすることで目的地をループさせれる)
currentWaypointIndex = (currentWaypointIndex + 1) % waypointArray.Length;
// 目的地を次の場所に設定
navMeshAgent.SetDestination(waypointArray[currentWaypointIndex].position);
}
}
}
5.巡回させるGameObjectの設定
5-1.Patrollerオブジェクトに"Nav Mesh Agent"コンポーネントを追加
5-2."Nav Mesh Agent"コンポーネントの"Stopping Distance"プロパティの値を0.5に変更
※"Stopping Distance"プロパティが0だと目的地との距離が完全一致しないといけなくて、完全一致は難しい場合もあるのである程度近づけばよいということにする。
5-3.その一つ下の"Auto Braking"プロパティのチェックを外す。
※これは有効になっていると、目的地点の到着時にエージェントの移動速度が減速する。今回は巡回させるので、この設定は無効の方がスムーズな動きをする。
5-4.4-1で作成したWaypointPatrol.csスクリプトをPatrollerオブジェクトにアタッチ
5-5.Patrollerオブジェクトの"Waypoint Patrol"コンポーネントの"WayPoints"プロパティに2で作成した"WayPointA"~"WayPointD"を入れる。
5-5-1.以下の画像右下の"+"を押下
5-5-2.作成されたElementに"WayPointA"を入れる。
5-5-3.上記を繰り返して、"WayPointD"まで入れる。
5-6.上から入れた順で巡回するようになる。
完成
これでゲームをスタートすると、Patrollerが設定した地点を巡回する。
ディスカッション
コメント一覧
できました!
良かったです!
すみません、WaypointPatrol.csをpatrollerにアタッチしてもWayPointsプロパティが出てこない場合はどうしたらいいのでしょうか…?
すみません、コメントが表示されていないのでもう一度送信致します…
WaypointPatrol.csをオブジェクトにアタッチしたのですが
“WayPoints”プロパティが表示されません…どうすれば良いのでしょうか…?
すみません、解決しました!
WaypointPatrol.csの5行目にあるRequireComponent(typeof(NavMeshAgent))]を消すことで表示されました!
コメントありがとうございます。
申し訳ありません。コメントは私が承認しないと表示されないようにしているので。
解決したようで良かったです。
また何かあればよろしくお願いいたします。