【第8回】NavmeshAgentを使って敵キャラを動かす

前回の作業で敵キャラの基本的な部分ができたので、今回は敵キャラを自動的に動かす処理を作っていこうと思います。

3Dゲームで敵キャラを適切に動かすためには経路探索を行う必要があり、この処理を自作するのは非常に難しいのですが、幸いUnityには「NavmeshAgent(ナビメッシュエージェント)」という経路探索用の便利機能があるのでこれを使って移動処理を作ってみましょう。

スポンサーリンク

NavmeshAgentとは?

まずNavmeshAgentとはUnityの経路探索機能の一つで、キャラクターを目的地まで自動的に動かすためのコンポーネントです。これを使えば、例えば「自力で上手く障害物を避けて移動するキャラクター」等を簡単に作ることができます。FPSや3Dアクションゲームを作る際にとても便利な機能なので、ぜひ使いこなせるようになってください。

ちなみにこの機能を使うためには、予めシーンに「Navmesh(ナビメッシュ)」という、キャラクターが移動できる範囲を定義したものを生成しておく必要があります(※詳しいやり方は後述します)。Navmeshの生成自体は1クリックで簡単にできますが、自動的には生成してくれないのでステージを変更した時などは生成し直すのを忘れないようにしましょう。

NavmeshAgentを使って敵キャラを動かしてみる

では早速ですがNavmeshAgentを使って自動的に移動する敵キャラを作ってみましょう。主な手順は次の3ステップです。

  1. ゾンビにNavmeshAgentコンポーネントを設定する
  2. ゾンビのC#スクリプトに移動処理を追加する
  3. ナビメッシュをベイクする

それぞれ詳しく見ていきましょう。

ゾンビにNavmeshAgentコンポーネントを設定する

まずはゾンビにNavmeshAgentコンポーネントをアタッチして下の図のように設定を行います。

NavmeshAgentの設定例

設定項目は色々ありますが、とりあえずここでは「速度」と「角速度」を変更しました。角速度を速くしたことでデフォルトよりも速く方向転換するようになります。

ちなみに余談ですが、NavmeshAgentはTransformを直接変更してキャラクターを移動させるらしいのでRigidbodyは必要ありません。まあ両者を併用するトリッキーなテクニックもなくはないのですが、基本的にNavmeshAgentを使うときはRigidbodyをつけても意味がないので注意しましょう。

ゾンビのC#スクリプトに移動処理を追加する

そうしたらゾンビのC#スクリプトを変更して、ゾンビが目的地に移動するようにしていきます。「EnemyController」を開き、コードを下のように変更してください(※「★変更1」というコメントがあるところが変更部分。関係ないところは省略してあります)。

using System.Collections;
using UnityEngine;
using UnityEngine.AI;	// ★変更1

public class EnemyController : MonoBehaviour
{

  [SerializeField]
  Animator animator = null;
  [SerializeField]
  NavMeshAgent navmeshAgent = null;   // ★変更1
  [SerializeField]
  Transform target = null;   // ★変更1
  [SerializeField]
  CapsuleCollider capsuleCollider = null;
  [SerializeField, Min(0)]
  int maxHp = 3;
  [SerializeField]
  float deadWaitTime = 3;

  // 省略

  void Update()
  {
    if (isDead)
    {
      return;
    }

    Move(); // ★変更1
    UpdateAnimator();
  }

  // 省略

  // ★変更1
  void Move()
  {
    navmeshAgent.SetDestination(target.position);
  }

  // アニメーターのアップデート処理
  void UpdateAnimator()
  {
    // ★変更1
    animator.SetFloat(SpeedHash, navmeshAgent.desiredVelocity.magnitude);
  }

}

できたらインスペクターで「EnemyController」コンポーネントの新しい欄に必要な設定を行いましょう。とりあえず、動作確認のために「ターゲット」欄にはプレイヤーのゲームオブジェクトを指定しておいてください。

ナビメッシュをベイクする

最後にキャラクターが移動できる範囲を決める「ナビメッシュ」をベイク(=生成)します。

まずはどのゲームオブジェクトの上にナビメッシュを生成するかをUntiyに知らせる必要があるので、次の作業を行ってください。

  1. シーンに仮の床やキューブ等を置いている場合はそれらを選択
  2. インスペクターの「静的」と書いてあるチェックボックスの右側の▼マークをクリックし、「Navgation Static」を選択

これで生成準備はOKです。

そうしたら、次はメニューバーの「ウィンドウ」→「AI」→「ナビゲーション」を選択してナビゲーションウィンドウを開き、「ベイク」タブを開いて下の「Bake」ボタンをクリックしましょう(下図)。

ナビメッシュのベイク方法

すると下の図のように、Navigation Staticを選択したゲームオブジェクトの上面にNavmeshが生成されます。

ナビメッシュの生成例

テストプレイして動作を確認しよう

さて、ここまでの作業で敵キャラクターが動くようになったと思うので、実際にテストプレイして確かめてみましょう。下のGIFのようにゾンビがプレイヤーを追いかけるようになれば成功です。

ゾンビスレイヤー2 敵の移動処理

(画像クリックでGIF再生)


次のページ→敵キャラがプレイヤーを攻撃できるようにする