【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メソッドを選択する。


完成
これでプレイヤーが近いと追いかけてきて、一定以上離れると追いかけるのをやめるようになった。
ディスカッション
コメント一覧
分かりやすい解説、有り難うございます。
質問があり、コメントさせて頂きました。
上記の「スクリプトを設定する」→「2.On Trigger Stayの右下の…」を実行しようとした際、No Functionのセレクトボックスに「EnemyMove」および「OnDitectObject」が表示されません。
原因が全くわからない状況でございます。
回答いただけると幸いでございます。
コメントありがとうございます。
おそらく以下のどちらかかとおもいます。
1.「スクリプトを設定する」の2と3の項番を追加して、”On Trigger Stay”プロパティの各値の入れ方を細かくしたので、こちらを確認してください。
1がちゃんと設定できている場合は以下が原因かと思います。
2.敵のゲームオブジェクト(当プログ上では”Ghost Brown”)にEnemyMove.csスクリプトがアタッチされていない。
敵のゲームオブジェクトにEnemyMove.csスクリプトをアタッチすれば表示されると思います。