😊

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

2024/12/02に公開

はじめに

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

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

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

Unityの基本操作からC#スクリプトの基礎まで、やさしく学べる入門チュートリアルはこちら
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

サンプル

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開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion