【Unity】NavMeshAgentとは?NavMesh上を移動させるコンポーネント

NavMeshAgentとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「NavMeshAgentってなに?」

「NavMeshAgentの使い方が知りたい!」

というお悩みの方に向けた内容となっています。

Unityでは、AI Navigationというシステムを使って、オブジェクトを特定の範囲で自動で移動させるという仕組みを作ることができます。

この仕組みの中で、NavMeshAgentは、NavMesh上を移動させることができるコンポーネントとして使うことができます。

そして、このNavMeshAgentには、目的地を指定することで、経路を計算して自動で移動することができるメソッドなどが定義されています。

そこで、このページでは、UnityのNavMeshAgentというコンポーネントについて、どんな機能なのか、また使い方や設定項目までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

NavMeshAgentとは?NavMesh上を移動させるコンポーネント

NavMeshAgentとは、AI Navigationのシステムにおいて、NavMesh上を移動させることができるコンポーネントです。

そもそもNavMeshというのは、NavMeshSurfaceコンポーネントを使って、事前にオブジェクトなどの地形情報における面を保存したデータのことです。

そして、NavMeshAgentは、このNavMeshデータの範囲内で移動できるようになるコンポーネントで、目的地となる地点を指定することで、そこまでの最短経路を探して自動で移動するということもできるようになります。

例えば、NPCのように特定の範囲を自動で移動するキャラクターなどを作るような場合に、NavMeshAgentをそのキャラクターに紐づけて作ることができます。

NavMeshAgentの基本的な使い方

NavMeshAgentの基本的な使い方について紹介していきます。

NavMesh上にNavMeshAgentのオブジェクトを配置

まずは、NavMeshデータの上にNavMeshAgentのオブジェクトを配置しておきます。

ここでは、事前に以下のようにNavMeshデータ(水色の部分)を作っています。

なお、NavMeshデータの作り方については、以下のページに詳しく解説していますので、参考にしてみてください。

このNavMesh上に、移動させたいオブジェクトを配置しておきます。

そして、このオブジェクトを選択した状態で、インスペクターウィンドウの「AddComponent」から「Navigation」にある「NavMeshAgent」を選択します。

これで、NavMeshAgentのコンポーネントをオブジェクトに紐づけることができました。

ちなみに、NavMeshAgentは、以下のように円柱の形状で定義されていて、この形状でNavMesh上を動いていくことになります。

手動で移動させる処理を作る

NavMeshAgentのコンポーネントを紐づけたオブジェクトは、NavMeshデータの範囲内を移動することができるようになります。

ここでは、実際にキー操作を使って手動で移動させる処理を作ってみます。

NavMeshAgentのオブジェクトに、以下のスクリプトを紐づけておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        transform.Translate(Input.GetAxis("Horizontal") * 0.01f, 0, Input.GetAxis("Vertical") * 0.01f);
    }
}

7行目でTranslateメソッドを使って移動させる処理を作っていて、GetAxisメソッドでWとSキーで画面からみて前後の移動、AとDキーで左右の移動を行うようにしています。

これでゲームを実行してみると、

オブジェクトを移動させると、NavMeshで指定した範囲内を移動できているのが分かります。

自動で移動する処理を作る

NavMeshAgentは、指定範囲内を手動で移動させるだけでなく、自動で移動させることもできます。

先ほどのNavMeshAgentのオブジェクトに対して、今度は以下のスクリプトを紐づけておきます。

using UnityEngine;
using UnityEngine.AI;   // AI Navigationをスクリプトから使用する際に記述

public class Test : MonoBehaviour
{
    NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();   // NavMeshAgentを取得する
    }

    void Update()
    {
        // マウスをクリックした場合
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);    // カメラからマウスカーソルの位置に向かうRay
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))  // Rayを飛ばしてオブジェクトとの衝突判定
            {
                agent.SetDestination(hit.point);    // マウスカーソルの位置に向かって自動で移動させる処理
            }
        }

    }
}

20行目でマウスをクリックした際に、Raycastメソッドを使って、マウスのカーソル位置でRayを飛ばしています。

そして、マウスで指定した位置を目的地として、22行目でSetDestinationメソッドで経路を探索して、自動で移動させる処理を行っています。

このSetDestinationメソッドは、NavMeshAgentコンポーネントで定義されているメソッドで、引数に目的地を指定することで、自動で最短経路を探索して移動する処理を行います。

NavMeshAgent.SetDestination(target);

target:目標地点となる座標(Vector3型)

これでゲームを実行してみると、

上記のように、マウスでクリックした位置に向かって、NavMeshAgentを紐づけたオブジェクトが移動しているのが分かります。

この仕組みを使うことで、以下のようにプレイヤーを自動で追いかけるオブジェクトなども簡単に作ることができます。

NavMeshAgentの設定項目

ここからは、インスペクターウィンドウから行えるNavMeshAgentのより細かい設定について紹介していきます。

Agent Type:NavMeshAgentのタイプを指定する項目

Agent Typeは、そのNavMeshAgentのタイプを指定する項目で、円柱の形における幅や高さ、またどのくらいの段差を登れるようになるかなどをタイプで設定することができます。

NavMeshSurfaceコンポーネント側で指定したAgent Typeと、NavMeshAgent側で指定したAgent Typeが同じ場合に、そのNavMesh上を移動できるようになります。

Base Offset:NavMeshAgentの高さの位置の調整

Base Offsetとは、Agent Typeで指定したNavMeshAgentの円柱形の高さの位置を調整することができる項目です。

このBase Offsetの値を増やせば増やすほど、NavMeshAgentの円柱形は下に向かって移動していくことになり、コライダーのように当たり判定の位置が変わっていきます。

Base Offset = 1
Base Offset = 2

Speed:NavMeshAgentの移動速度

Speedは、NavMeshAgentが自動で移動する際の最高速度を指定することができる項目です。

以下のように、Speedの値が大きければ大きいほど、より速く移動するようになります。

Angular Speed:NavMeshAgentの回転速度

Angular Speedは、NavMeshAgentが自動で移動する際の回転速度を指定することができる項目です。

NavMeshAgentが自動で移動する際、オブジェクトのローカル座標のZ軸が正の方向を前方として、移動する方向にその向きを変えながら移動します。

そして、Angular Speedの値が大きければ大きいほど、カーブなどで向きを変える速度が速く回転するようになります。

Acceleration:NavMeshAgentの加速度

Accelerationは、NavMeshAgentを自動で移動する際の最大の加速度を指定することができる項目です。

以下のように、Accelerationの値が大きければ大きいほど、加速が速くなります。

Stopping Distance:目的地点のどのくらい手前で停止するか

Stopping Distanceは、NavMeshAgentが目的地点に移動している際に、その場所のどれくらい手前で停止させるかを決めている項目です。

以下のように、Stopping Distanceを指定することで、目標より手前で停止するようになります。

Auto Braking:自動で減速を行うかどうか

Auto Brakingは、NavMeshAgentが目的地点に近づくと、自動的にブレーキをかけて減速を行うかどうかを決める項目です。

このAuto Brakingの設定は、指定した目的地点に到着した後、別の目的地点へ移動させるような使い方の場合に、到着時に自動でブレーキをかけるかどうかを決めています。

実際に、複数の青いオブジェクトの中からランダムに一つを選び、そこを目的地点として繰り返し移動する処理をNavMeshAgentで作ってみたところ、Auto Brakingにチェックを入れた場合は、以下のように目的地点に近づくとブレーキがかかり、速度が遅くなります。

このAuto Brakingのチェックを外してみると、ブレーキがかからないので、以下のように目的地点を大きく超えながら、次の目的地点に移動しているのが分かります。

Radius:NavMeshAgentの半径の長さ

Radiusは、NavMeshAgentの円柱形の半径の長さを指定する項目で、障害物や他のNavMeshAgentとの間の最小距離となる値です。

このRadiusの値を上げれば上げるほど、幅の狭い通路を通れなくなったり、設置した障害物との間の距離が拡がることになります。

なお、NavMesh上で障害物となるオブジェクトを配置する際は、NavMeshObstacleコンポーネントを使用します。

Height:NavMeshAgentの高さ

Heightは、NavMeshAgentの円柱形の高さを指定する項目で、トンネルなど高さを指定した障害物を作る際に、通過できるかどうかを決めることになります。

このHeightの値が高ければ高いほど、低い穴のような障害物を通過できなくなります。

Quality:NavMeshAgent同士の衝突時の品質

Qualityは、NavMeshAgentが複数配置しているような場合に、NavMeshAgent同士が衝突する際の品質を表している値で、下げれば下げるほど衝突が無視されるようになります。

なお、このQualityを「None」にすると、NavMeshAgent同士が衝突しなくなるので、以下のようにお互いに重なって表示されるようになります。

Priority:NavMeshAgent同士の衝突時の優先度

Priorityは、NavMeshAgent同士が衝突した際の優先度を表している値で、小さければ小さいほど優先度が高くなります。

Priorityの値の小さいNavMeshAgentと、Priorityの値の大きいNavMeshAgentが衝突すると、Priorityの大きいNavMeshAgentだけが、衝突を回避するように移動することになります。

Auto Traverse Off Mesh Link:オフメッシュリンクを自動的に通過するかどうか

Auto Traverse Off Mesh Linkは、オフメッシュリンクを自動的に通過するかどうかを設定する項目です。

オフメッシュリンクの通過時にアニメーションを設定したり、別の手段で通過するような場合は、このAuto Traverse Off Mesh Linkをオフにしてあげます。

Auto Repath:再度経路探索を行うかどうか

Auto Repathは、NavMeshAgentが部分的な経路の目標地点に到達した後に、再度経路探索を行うかどうかを決める項目です。

この部分的な経路とは、目的地に到達できないような場合に、目的地に近い地点へ進む経路のことで、この後にもう一度経路を探索するかどうかを決めています。

Area Mask:どのエリアを通過できるようにするか

Area Maskは、NavMeshAgentがどのエリアを通過できるようにするかを設定できる項目です。

NavMeshデータを作成する際に、エリアを定義することができるので、特定のエリアにはそのNavMeshAgentが入れないようにすることができます。

まとめ

このページでは、UnityのNavMeshAgentについて、どんなコンポーネントなのか、また使い方や設定をまとめていきましたが、いかがでしたでしょうか?

NavMeshAgentとは、AI Navigationのシステムで使われるNavMesh上を移動することができるコンポーネントです。

このNavMeshAgentを使うことで、特定の範囲を自動で移動するNPCのようなオブジェクトを作ることができます。

また、NavMeshAgentの大きさや速度、またお互いの衝突に関しても細かく設定することができます。

最後までお読みいただきまして、ありがとうございました!

コメント