【Unity】(Version: 2022.2以降対応)複数地点を巡回するGameObjectを作成する方法

2021年8月15日Unity

スポンサーリンク

敵などを設定した複数の地点を巡回するようにするやり方です。
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が設定した地点を巡回する。

Unity

Posted by ton