Unity初心者でも簡単!NavMesh不要のシンプルな手法で敵の追跡シーンを実現
自己紹介
閲覧ありがとうございます。はじめまして、ゲーム開発所RYURYUの"りゅうや"と申します。
❏ ゲーム開発ランキング【 1位 】実績多数
❏ ココナラ総販売【 200件達成 】
❏ GC甲子園2022・東京ゲームショウ2023など出展経験あり
ゲーム開発所RYURYUとは
Unityを駆使した先進的な「ゲーム・VR・メタバース開発」や「オンライン教育サービス」を展開するゲームスタジオです。
Zennで5日間でFPSゲームをゼロから開発する本を執筆しました!!
どこでもUnity教室「5日間でFPSゲームをゼロから完成!」初心者向けの実践型講座
【2025年版 / Unity 6対応】
はじめに
Unityゲーム開発で敵AIを効果的に構築したいですか?NavMeshは便利ですが、もっとシンプルで自由度の高い方法が求められることも。
この記事では、敵キャラクターが指定地点を巡回し、プレイヤー接近時に追跡する簡易AIのC#コードを紹介します。
❏ 初心者でもコピペで簡単に取り入れられます!
サンプル
1 |AIスクリプトの作成
手順
① 新しいC#スクリプト「Patrol」を作成します。
② その後、Enemy(敵)オブジェクトにアタッチします。
インスペクターの設定項目
項目 | 説明 |
---|---|
patrolArea | 巡回するエリアの設定。詳細は②の箇所で解説します。 |
destPoint | はじめに巡回する地点を入力します。 |
tracking Range | 敵がプレイヤーを追い始めるための感知半径。 |
quit Range | この距離を超えるとプレイヤーの追跡を中止します。 |
速度 (Speed) | 敵が移動する際のスピード。 |
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日スタート!
無料で参加できるこの機会をお見逃しなく!
一人で悩む必要はありません。あなたの成長を全力でサポートする仲間と環境が、ここにあります!
Discussion