ナビメッシュエージェント(NavMeshAgent)の使い方

ここではナビメッシュエージェント(NavMeshAgent)の使い方について説明します。


※この記事で使用しているUnityのバージョン:Unity2019.1

ナビメッシュエージェント(NavMeshAgent)とは

ナビメッシュエージェント(NavMeshAgent)は、簡単に言えば「キャラクターを自動的に移動させられる機能」です。これを使えば自動で動く敵キャラクターやモブキャラなどを簡単に作ることができて便利です。

なお、ナビメッシュエージェントを使ってキャラクターを動かすには、事前にステージの地形にナビメッシュを生成しておく必要がありますのでご注意ください。

ナビメッシュエージェントの設定項目

次にナビメッシュエージェントコンポーネントの設定項目は下記の通りです。

ナビメッシュエージェントコンポーネント

ここでは分かりづらいものだけを説明しますね。

  • Agent Type:
    エージェントの種類。必要ならナビゲーションウィンドウ(メニューバー→ウィンドウ→AI→ナビゲーション)の「エージェント」タブから追加できます。
  • ベースオフセット:
    ナビメッシュエージェントの円柱の中心の高さ
  • 自動ブレーキ:
    目標に接近したときに自動的に速度を落とすかどうか
  • Quality:
    エージェントの障害物回避の精度。品質が低いほどCPUの処理負荷を軽減できるため、たくさんのエージェントを動かせます。
  • Priority:
    この値より低い値のエージェントを無視して回避するようになります。
  • オフメッシュリンクの走査を自動化(Auto Traverse OffMesh Link):
    ONの場合、自動的にオフメッシュリンクを超えるようになります。
  • パスの再取得を自動化(Auto Repath):
    ONの場合、エージェントは部分的な経路の終了地点へ到達した際に自動で経路の探索を行います。
  • Area Mask:
    エージェントが経路を探索するときに、どのエリアを探索するかを設定できます。エリアはナビゲーションウィンドウの「領域」タブから追加できます。

「追いかけてくる敵キャラ」の作り方

それでは具体的な活用例を見ていきましょう。ここではナビメッシュエージェントを使って「追いかけてくる敵キャラ」を手軽に作ってみます(下の動画参照、クリックで再生)。

追いかけてくる敵キャラの例

ナビメッシュエージェントで追いかけてくるキャラを作るための手順は次の通りです。

  1. ゲームオブジェクトにナビメッシュエージェントをアタッチして設定する
  2. エージェントに目標地点を知らせるスクリプトを書く

手順1:ナビメッシュエージェントをアタッチして設定する

まず、自動的に動かしたいゲームオブジェクトにナビメッシュエージェントをアタッチして設定を行います。今回はデフォルトの設定を使いました。

手順2:スクリプトを書く

次に、そのままではナビメッシュエージェントに目的地を登録していない状態なので、目的地をスクリプトを使って教えてあげます。今回のように単純に追いかけてくるだけの場合は、次のような簡単なスクリプトで動きを実現することができます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AgentTest : MonoBehaviour
{

  [SerializeField]
  Transform target;

  NavMeshAgent agent;

    // Start is called before the first frame update
    void Start()
    {
    agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
    agent.SetDestination(target.position);
  }
}

このスクリプトのポイントは2つあって、

  • 冒頭に「using.UnityEngine.AI」を書く
  • 毎フレーム「SetDestination()」を呼んで目的地を更新する

ということです。ナビメッシュエージェントではSetDestinationで目的地を登録して、それを元に経路を探索するので最低限このメソッドは覚えておいてください。