【Unity】敵にプレイヤーを追わせる方法(NavMesh)

Unity

はじめに

敵がPlayerを追ってきて、攻撃を加える。だいたいの3Dゲームなら実装したい機能かと思います。

この、「敵がプレイヤーを追いかける」処理は、UnityがNavMeshという仕組みを用意してくれていますので、その基本的な使い方をご紹介します。

今回は、ラビット(左側:敵)がPlayer(右側)を追いかける処理を実装することを例にNavMeshの基礎的な実装方法をご紹介します。

NavMeshをベイクする

NavMeshは、事前に敵が移動可能な範囲を計算しておくことで実現できる仕組みです。

NavMeshを開いて、乗り越えることが可能な段差の高さや、登ることが可能な坂道の角度などを設定し、行動可能範囲を算出しましょう。

Window > AI > Navigationをクリックします。

Navigationウィンドウが開きます。こちらで、設定を行います。今回はこのままで行いますが、主なパラメータについて説明します。

Agent Radius

エージェントの半径

Agent Height

エージェントの高さ

Max Lope

エージェントが登れる最大の坂道の角度

Step Height

エージェントが越えられる段差の最大の高さ

設定が完了したら、「Bake」ボタンをクリックします。

時間のかかる処理です。完了まで待ちます。

計算が完了したら、移動可能な範囲に色が付きます。

コンポーネントをアタッチ

次に、敵に「Nav Mesh Agent」をアタッチします。

追従させたいオブジェクトをクリックして、Inspectorの「Add Component」から「Nav Mesh Agent」をアタッチしましょう。

移動速度を設定

移動速度や回転速度などは、先ほどアタッチした「Nav Mesh Agent」コンポーネントの「Steering」にて設定します。

Speed

速度を設定します。少し遅く移動してほしいので1に設定しました。

Angular Speed

回転速度を設定します。今回は180に設定しました。

Acceleration

加速度を設定します。今回は3にしました。

追従対象を設定

スクリプトにて、何を追従すればよいかを設定します。

こんかいは、EnemyMoveという名前のスクリプトファイルを作成し、下記のソースで実装しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
[RequireComponent(typeof(NavMeshAgent))]
public class EnemyMove : MonoBehaviour
{
    // 追いかける対象の座標情報
    [SerializeField] private Transform playerTransform;
   
    // エージェントをキャッシュしておく用
    private NavMeshAgent _agent;
void Start()
    {  
        // Nav Mesh Agentコンポーネントを取得
        _agent = GetComponent<NavMeshAgent>();
    }
void Update()
    {
        // エージェントの行き先に、プレイヤーの座標を設定
        _agent.destination = playerTransform.position;
    }
}

スクリプトのポイント

個人的に、スクリプトにおけるポイントをまとめたいと思います。

UnityEngine.AIを宣言

NavMeshAgentを利用するためには、UnityEngine.AIの宣言が必要です。

using UnityEngine.AI;

行き先はVector3型で指定

追いかける先は「_agent.destination」で指定していますが、これはVector3型です。

今回は、プレイヤーの現在位置を取得する方法として、プレイヤーの座標を「SerializeField」を使い、この後、Inspectorで指定することで取得して、毎フレームセットしています。

追いかける目標をセット

さて、作成したスクリプトを敵のオブジェクトにアタッチすると、「Enemy Move (Script)」というコンポーネントがアタッチされ、そのなかに、「Player Transform」プロパティが表示されています。

ここに、追いかける対象(Player)を指定します。

さいごに

これで、追従するようになりました。

以上です。

コメント

タイトルとURLをコピーしました