【Unity】敵が一定の範囲内に入ると追いかけてくるようにする

2020年10月8日Unity

スポンサーリンク

敵が一定の範囲内に入るとプレイヤーを追いかけてくるようにします。(NavMeshを使います。)

こちらは以下の内容を行ったことを前提として進めます。

完成動作

プレイヤーにタグをつける

1.プレイヤーのみを対象として敵が追いかけてくるように、プレイヤーに"Player"タグをつける。

Hierarchyウィンドウでプレイヤーのオフジェクトを選択して、InspectorウィンドウのTag欄で"Player"を選択する。

一定の範囲に入ったことを検知するためのColliderを設定する

1.Hierarchyウィンドウで敵のオブジェクト上で右クリックをして「Create Empty」を選択して、空の子オブジェクトを作成する。

2.空の子オブジェクトの名前を「CollisionDetector」とする

3.CollisionDetectorにSphere Colliderをアタッチする。

HierarchyウィンドウでCollisionDetectorを選択し、InspectorタブでAdd Componentを選択して検索する。

4."Is Trigger"にチェックを入れる。
※"Is Trigger"にチェックを入れない場合、Collider同士がぶつかると跳ね返り、チェックを入れるとすり抜けるようになる。

Radias(衝突範囲の大きさ)は適宜変更する。
今回は以下の緑の枠の範囲の大きさにした。

衝突を検知するスクリプトを作成する

CollisionDetector.csという名前でスクリプトファイルを作成し、中身を以下のようにする。

using System;
using UnityEngine;
using UnityEngine.Events;

[RequireComponent(typeof(Collider))]
public class CollisionDetector : MonoBehaviour
{
    [SerializeField] private TriggerEvent onTriggerStay = new TriggerEvent();

    /// <summary>
    /// Is TriggerがONで他のColliderと重なっているときに呼ばれ続ける
    /// </summary>
    /// <param name="other"></param>
    private void OnTriggerStay(Collider other)
    {
        // InspectorタブのonTriggerStayで指定された処理を実行する
        onTriggerStay.Invoke(other);
    }

    // UnityEventを継承したクラスに[Serializable]属性を付与することで、Inspectorウインドウ上に表示できるようになる。
    [Serializable]
    public class TriggerEvent : UnityEvent<Collider>
    {
    }
}

すでに作成済みのEnemyMove.csスクリプトを以下のようにする。

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class EnemyMove : MonoBehaviour
{
    private NavMeshAgent navMeshAgent;

    private void Start()
    {
        navMeshAgent = GetComponent<NavMeshAgent>(); // NavMeshAgentを保持しておく
    }

    // CollisionDetector.csのonTriggerStayにセットし、衝突中に実行される。
    public void OnDetectObject(Collider collider)
    {
        // 検知したオブジェクトに「Player」のタグがついていれば、そのオブジェクトを追いかける
        if (collider.CompareTag("Player"))
        {
            navMeshAgent.destination = collider.transform.position;
        }
    }
}

スクリプトを設定する

1.Hierarchyウィンドウで敵の子オブジェクトのCollisionDetectorを選択し、InspectorウィンドウにProjectウィンドウからCollisionDetector.csをアタッチする。

2.On Trigger Stayの右下の"+"を押下する。
※これは追記なので、画像の背景色が他と異なっているのは気にしないでください。

3."None (Object)"の右の"⦿"を押下して、“Scene"タブの"Ghost Brown"を選択
※これは追記なので、画像の背景色が他と異なっているのは気にしないでください。

4.右側のプルダウンを以下のように選択してEnemyMoveのOnDetectObjectメソッドを選択する。

完成

これでプレイヤーが近いと追いかけてきて、一定以上離れると追いかけるのをやめるようになった。

Unity

Posted by ton