😊

Unity初心者でも簡単!NavMesh不要のシンプルな手法で敵の追跡シーンを実現

2024/12/02に公開

自己紹介

閲覧ありがとうございます。はじめまして、ゲーム開発所RYURYUの"りゅうや"と申します。

❏ ゲーム開発ランキング【 1位 】実績多数
❏ ココナラ総販売【 200件達成 】
❏ GC甲子園2022・東京ゲームショウ2023など出展経験あり

ゲーム開発所RYURYUとは

Unityを駆使した先進的な「ゲーム・VR・メタバース開発」や「オンライン教育サービス」を展開するゲームスタジオです。

Zennで5日間でFPSゲームをゼロから開発する本を執筆しました!!

どこでもUnity教室「5日間でFPSゲームをゼロから完成!」初心者向けの実践型講座
【2025年版 / Unity 6対応】
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

はじめに

Unityゲーム開発で敵AIを効果的に構築したいですか?NavMeshは便利ですが、もっとシンプルで自由度の高い方法が求められることも。

この記事では、敵キャラクターが指定地点を巡回し、プレイヤー接近時に追跡する簡易AIのC#コードを紹介します。

❏ 初心者でもコピペで簡単に取り入れられます!

サンプル

https://x.com/RYURYU_GAME_MFG/status/1731540255365628128

1 |AIスクリプトの作成

手順

① 新しいC#スクリプト「Patrol」を作成します。
② その後、Enemy(敵)オブジェクトにアタッチします。

インスペクターの設定項目

項目 説明
patrolArea 巡回するエリアの設定。詳細は②の箇所で解説します。
destPoint はじめに巡回する地点を入力します。
tracking Range 敵がプレイヤーを追い始めるための感知半径。
quit Range この距離を超えるとプレイヤーの追跡を中止します。
速度 (Speed) 敵が移動する際のスピード。

Patrolスクリプト

Patrol
using System.Collections.Generic;
using UnityEngine;

public class Patrol : MonoBehaviour
{
    //インスペクターで変更できる変数
    [SerializeField]
    [Tooltip("探索グループ")]
    GameObject patrolArea;

    [SerializeField]
    [Tooltip("はじめに探索する地点")]
    int destPoint = 0;

    [SerializeField, Range(0, 100)]
    [Tooltip("探索範囲")]
    float trackingRange = 3.0f;

    [SerializeField, Range(0, 150)]
    [Tooltip("追跡範囲")]
    float quitRange = 5f;

    [SerializeField, Range(0, 25)]
    [Tooltip("敵のスピード")]
    float speed = 5.0f;

    //敵が保持している変数
    private List<Transform> points = new List<Transform>();
    private bool tracking = false;
    private GameObject target;

    void OnEnable()
    {
        //targetのゲームオブジェクトを取得
        target = GameObject.Find("Player");
        //巡回地点pointsのリストに追加
        for (int i = 0; i < patrolArea.transform.childCount; i++)
        {
            points.Add(patrolArea.transform.GetChild(i).gameObject.transform);
            patrolArea.transform.GetChild(i).GetComponent<MeshRenderer>().enabled = false;
        }
    }
    void Update()
    {
        var targetPos = target.transform.position;
        //敵と巡回地点の距離を計算
        var distanceToTarget = Vector3.Distance(this.transform.position, targetPos);
        //敵とプレイヤーとの距離を計算
        var distanceToNextPoint = Vector3.Distance(this.transform.position, points[destPoint].transform.position);
        //プレイヤーとの距離がtracking内ならば追跡
        if (tracking)
        {
            var currentPos = Time.deltaTime * speed / distanceToTarget;
            if (distanceToTarget > quitRange) tracking = false;
            //移動処理を実行
            this.transform.position = Vector3.Lerp(transform.position, target.transform.position, currentPos);
        }
        //プレイヤーとの距離がquitRange外ならば探索に戻る
        else if (!tracking)
        {
            var currentPos = Time.deltaTime * speed / distanceToNextPoint;
            if (distanceToTarget < trackingRange) tracking = true;
            //巡回地点がないときは処理をしない
            if (points.Count == 0) return;
            //移動処理を実行
            this.transform.position = Vector3.Lerp(transform.position, points[destPoint].transform.position, currentPos);
            //次の巡回地点を決定
            if (currentPos >= 1)
            {
                destPoint = (destPoint + 1) % points.Count;
            }
        }
    }
}

2|巡回地点の設定

手順

① シーンに空のGameObjectを追加し、「PatrolArea」と名付けます。
② 「PatrolArea」の子オブジェクトとして、「A」「B」「C」の名前で敵が巡回する地点にSphereオブジェクトを生成します。(「D」以降も自由に追加可能です)

3|プレイヤーの設定

手順

① Capsuleオブジェクトを追加し、「Player」と名付けます。

ポイント

以下のコードによりオブジェクトが「Player」と命名されていれば、追跡対象となります。

//targetのゲームオブジェクトを取得
target = GameObject.Find("Player");

4|エネミーの設定

手順

① Cubeオブジェクトを生成し、「Enemy」と名付けます。
②「Enemy」オブジェクトへPatrol スクリプトをアタッチします。
③ Patrolスクリプトは、添付写真のように設定しましょう。

再生時に敵が指定された巡回地点を巡回します。プレイヤーが敵に接近すると、敵は巡回をやめて追跡を開始しますが、一定の距離まで離れると、再び巡回地点に戻ります。


Unityをもっと学びたい“あなた”へ 『どこでもUnity教室』

Unityを独学しているけれど、情報収集に時間がかかり、孤独や不安を感じていませんか?
「どこでもUnity教室」は、そんなあなたのために作られたオンライン学習コミュニティです。

初心者から中級者までを対象に、独学では難しいスキル習得をサポートします。
講師や仲間と一緒に学びながら、分からないことはすぐに解決できる環境をご用意しました。
孤独や情報過多の不安を解消し、効率よく次のステップへ進みましょう!

どこでもUnity教室の特徴

  • 無料で気軽に始められる!
    初心者も中級者も歓迎!仲間と一緒に学びましょう。

  • 作業通話ができるボイスチャンネル
    独学の孤独を解消して、効率よく学べます。

  • すぐに質問できる安心サポート
    質問を投稿すればすぐに解決!他の参加者や講師が迅速に対応します。

  • オンライン教材を順次公開予定
    実践的な課題でスキルを磨ける教材が続々登場します。

独学に限界を感じていませんか?

ChatGPTやインターネットを使えば情報は簡単に手に入りますが、それだけでは「知っているけどできない」第2段階で止まってしまいます。

スキル習得の「第2段階」とは?

「第2段階」は、自分の弱点を認識する重要なステップです。この段階では、

  • 「やりたいことがわかるけど、どう実現するかわからない」
  • 「スクリプトを書いてみたけど、うまく動かない」
    といった悩みに直面します。

「どこでもUnity教室」で第2段階を突破!

「どこでもUnity教室」は、あなたが第2段階を効率よく突破し、次のステップに進むための環境を提供します:

  • 質問しやすい環境:気軽に質問して、すぐに問題を解決!
  • 安心の実践課題:失敗を恐れず挑戦できるステップアップ型の課題。
  • 的確なフィードバック:つまずきポイントを明確にして次のステップへ!(有料プラン予定)

無料で始められるので、まずは参加して学びを加速させましょう!

参加はこちら!

「どこでもUnity教室」Discordサーバーは2024年12月2日スタート!
無料で参加できるこの機会をお見逃しなく!

❏ Discordサーバーに参加する ❏

https://discord.gg/AhxnbR4D

一人で悩む必要はありません。あなたの成長を全力でサポートする仲間と環境が、ここにあります!

Discussion