【Unity】NavMeshで複数を地点を巡回する

2024年4月8日

NavMeshを使用して複数の地点を巡回するためには、いくつかのステップを実行する必要があります

基本的な手順

NavMeshを設定

シーン内でナビゲーションメッシュ(NavMesh)を設定します。これには、シーン内の歩行可能な領域をマークし、NavMesh Surfaceを作成する必要があります。具体的な手順は、次のリンクを参照ください

エージェントの作成

エージェントを作成し、NavMeshAgentコンポーネントをアタッチします。これにより、NavMesh上での移動が可能になります。エージェントは巡回するオブジェクトになります

地点のリストを作成

エージェントが巡回する地点のリストを作成します。これらは空のゲームオブジェクトで表現され、NavMesh Surface内に配置されている必要があります。これらの地点をNavMesh上に配置するために、それぞれの地点にNavMesh Linkを追加して、NavMeshと接続します

このコードは、巡回行動を実現するためのスクリプトです。オブジェクトは指定された場所を巡回します。NavMeshAgentを使用して、巡回ポイント(wayPoints)の配列を持ち、指定された位置にエージェントを移動させます。エージェントが現在の巡回ポイントに到達したら、次のポイントに移動します。巡回ポイントが指定されていない場合、動作は行われません。 Update() 関数はエージェントが目的地に到達したかどうかを確認し、到達した場合は次のポイントに移動します。

using UnityEngine;
using UnityEngine.AI;

public class WaypointController : MonoBehaviour
{
    public Transform[] wayPoints;
    private int currentPoint = 0;
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        GoToNextPoint();
    }

    void Update()
    {
        if (!agent.pathPending && agent.remainingDistance < 0.1f)
        {
            GoToNextPoint();
        }
    }

    void GoToNextPoint()
    {
        if (wayPoints.Length == 0)
            return;

        agent.destination = wayPoints[currentPoint].position;
        currentPoint = (currentPoint + 1) % wayPoints.Length;
    }
}

詳細な説明

NavMeshを使用して複数の地点を巡回する手順を説明します
以下は詳細なステップです。

NavMeshの設定

ナビゲーションメッシュ(NavMesh)を設定するために、まずUnityのシーン内で歩行可能な地域を設定します。具体的なステップは以下の通りです:

  • シーン内の歩行可能な地域に対してNavMeshを生成するには、Hierarchyパネルで「GameObject」 > 「3D Object」 > 「NavMesh Surface」を作成します。
  • NavMesh Surfaceコンポーネントを選択し、BakeボタンをクリックしてNavMeshを生成します。これにより、エージェントが移動できる領域が作成されます。

エージェントの作成

エージェントは、巡回するキャラクターを表します。これには、プレイヤーキャラクターやAIキャラクターなどが含まれます。エージェントを作成するには、UnityのHierarchyパネルでGameObjectを作成し、必要なモデルやコンポーネントを追加します。

地点のリストを作成

エージェントが巡回する地点を作成します。これらの地点は空のゲームオブジェクトで表現され、NavMesh Surface内に配置される必要があります。これらの地点をNavMesh上に配置するために、それぞれの地点にNavMesh Linkを追加して、NavMeshと接続します。以下は具体的な手順です:

  • Hierarchyパネルで「GameObject」 > 「Create Empty」を選択して、空のゲームオブジェクトを作成します。
  • 地点オブジェクトを選択し、InspectorパネルでTransformコンポーネントのPositionを設定して、地点を配置します。
  • 移動可能範囲が離れていて跨ぎたい場合は、NavMesh Linkコンポーネントを追加し、Start PointとEnd Pointを接続します。これにより、NavMesh上の経路が地点間で確立されます。

NavMesh Linkコンポーネントは、Unityのナビゲーションシステムにおいて、非連続なナビゲーションメッシュ(NavMesh)の領域を接続するために使用されます。これにより、エージェント(例えばNPCやキャラクター)がジャンプや落下などの特定のアクションを通じて、別々のナビゲーションエリア間を移動できるようになります。NavMesh Linkを使用することで、より複雑でリアルな移動パターンをゲーム内に実装できます。

スクリプトを作成

エージェントが地点を巡回するスクリプトを作成します。これにはC#スクリプトを使用します。以下の手順でスクリプトを作成します:

Projectパネルで「Create」 > 「C# Script」を選択して、新しいスクリプトを作成します。

  • スクリプト名を適切に設定し、ダブルクリックしてスクリプトを開きます。
  • スクリプト内で、エージェントの動作を制御するコードを記述します。先ほど提供した例のように、エージェントを次の地点に移動させ、巡回地点のループを作成するコードを含めることができます。

NavMeshエージェントにスクリプトをアタッチ

エージェントオブジェクトを選択し、Inspectorパネルで先ほど作成したスクリプトをアタッチします。また、巡回地点のリストを設定するための公開フィールドを提供します。このスクリプトはエージェントの動作を制御し、巡回地点間を移動します。

以上のステップに従うことで、UnityでNavMeshを使用して複数の地点を巡回するエージェントを作成できます。このプロセスをカスタマイズして、さらに高度なナビゲーションや動作を追加できます。

コードの補足説明

if (!agent.pathPending && agent.remainingDistance < 0.1f)

この行は、NavMeshAgent(エージェントがナビゲーションメッシュ上で移動するためのコンポーネント)の状態を確認しています。具体的には、エージェントのパスが保留中でないことと、エージェントが目的地までの距離が非常に短い(0.1f未満)場合に条件が成立します。

  • agent.pathPending:エージェントの現在のパス計算が保留中であるかどうかを示すブール値です。保留中の場合、エージェントはまだ新しい移動パスを計算中で、目的地に向かう途中であることを意味します。
  • agent.remainingDistance:エージェントが現在の目的地までの残りの距離を表す浮動小数点数です。この値が0.1f未満の場合、エージェントは目的地にほぼ到達したことを示します。

したがって、この条件は、エージェントが目的地にほぼ到達し、新しいパス計算が保留中でない場合に真となり、次の巡回ポイントに移動するための条件をチェックしています。

void GoToNextPoint()
{
    if (wayPoints.Length == 0)
    return;
    agent.destination = wayPoints[currentPoint].position;
    currentPoint = (currentPoint + 1) % wayPoints.Length;
}

このメソッドは、NavMeshAgentがナビゲーションポイント(waypoints)を順に巡るためのロジックを実装しています。

  • 最初に、wayPoints配列内にウェイポイントがないかどうかを確認しています。ウェイポイントが1つもなければ、メソッドから抜け出します。これにより、目的地を設定する前にウェイポイントが存在することを保証しています。
  • agent.destinationに現在のウェイポイント(wayPoints[currentPoint])の位置を設定します。これにより、エージェントはその位置に向かって移動を開始します。
  • currentPoint変数は、次にエージェントが向かうウェイポイントのインデックスを保持します。この変数をインクリメントして、wayPoints配列の長さに達したら0にリセットします(これにより、ウェイポイントのリストをループします)。

これらのステップにより、エージェントはシーン内の指定されたウェイポイントを一つずつ順番に訪れることができます。このロジックは、パトロールルートの実装や、ゲーム内でキャラクターを特定のポイント間で自動移動させる場合などに使用されます。

参考)色々な複数のオブジェクトの取得方法

AI,Unity

Posted by hidepon