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

その他

スポンサーリンク

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

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

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

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の右下の"+"を押下して、以下のように設定する。
Hierarchyウィンドウから敵オブジェクトを左下の枠にドラッグアンドドロップして、右側のプルダウンからEnemyMove.csのOnDetectObjectメソッドを選択する。

完成

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

スポンサーリンク

その他

Posted by ton