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

2024年1月24日Unity

スポンサーリンク

※Unityのナビゲーションシステム(Bakeのやり方等)はVersion: 2022.2以降ではやり方が変わったので、新しいやり方を紹介します。

Version: 2022.1以前を使っている方は以下を見てください。

では早速最新のやり方の紹介です。

完成動作

作り方(動画)

作り方(ブログ)

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)(Version: 2022.2以降の変更点)

NavMeshを使ってPatrollerオブジェクトを巡回させるので、Patrollerオブジェクトを巡回させる場所をBakeする。

3-1.AI Navigationをインストール(Version: 2022.2以降はAI Navigationのインストールが必要になった)

3-1-1.Window→Package Managerを選択

3-1-2.PakagesをUnity Registryにする

3-1-3.右上の検索窓で"AI Navigation"と入力し、AI NavigationをInstallする。

3-1-4.Pakage Managerを閉じる

3-2.NavMesh Surfaceを配置(Bake機能を持つゲームオブジェクトを作成)

3-2-1.Hierarchyタブで以下のように選択し、NavMesh Surfaceのゲームオブジェクトを作成

3-2-2.NavMeshSurfaceコンポーネントがアタッチされたゲームオブジェクトが作成される。
 ※NavMeshSurfaceコンポーネントがBake機能を持っています。

3-2-3.設定をいじるためにNavigationタブが必要であれば、以下のようにして表示(今回は設定はいじりません)

3-3.巡回させるGameObjectに"Nav Mesh Agent"コンポーネントを追加

3-3-1.Patrollerオブジェクトに"Nav Mesh Agent"コンポーネントを追加

3-3-2."Nav Mesh Agent"コンポーネントの"Stopping Distance"プロパティの値を0.5に変更
※"Stopping Distance"プロパティが0だと目的地との距離が完全一致しないといけなくて、完全一致は難しい場合もあるのである程度近づけばよいということにする。

3-3-3.その一つ下の"Auto Braking"プロパティのチェックを外す。
※これは有効になっていると、目的地点の到着時にエージェントの移動速度が減速する。今回は巡回させるので、この設定は無効の方がスムーズな動きをする。

3-4.Bakeする

3-4-1.NavMesh SurfaceオブジェクトのNavMeshSurfaceコンポーネントのBakeボタンを押下

3-4-2.以前のバージョンと同じように見慣れた形になる(NavMesh Agentが動ける範囲が青色で表示される。)

ここまでくれば、あとは以前のバージョンと変わりません。

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.4-1で作成したWaypointPatrol.csスクリプトをPatrollerオブジェクトにアタッチ

5-2.Patrollerオブジェクトの"Waypoint Patrol"コンポーネントの"WayPoints"プロパティに2で作成した"WayPointA"~"WayPointD"を入れる。

5-2-1.以下の画像右下の"+"を押下

5-2-2.作成されたElementに"WayPointA"を入れる。

5-2-3.上記を繰り返して、"WayPointD"まで入れる。

5-3.上から入れた順で巡回するようになる。

完成

これでゲームをスタートすると、Patrollerが設定した地点を巡回する。

Unity

Posted by ton