😊
【Unity Tips】Unity初心者でも簡単!NavMesh不要のシンプルな手法で敵の追跡シーンを実現
はじめに
Unityゲーム開発で敵AIを効果的に構築したいですか?NavMeshは便利ですが、もっとシンプルで自由度の高い方法が求められることも。
この記事では、敵キャラクターが指定地点を巡回し、プレイヤー接近時に追跡する簡易AIのC#コードを紹介します。
❏ 初心者でもコピペで簡単に取り入れられます!
Unityの基本操作からC#スクリプトの基礎まで、やさしく学べる入門チュートリアルはこちら
サンプル
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が完成!今すぐ始める入門チュートリアルはこちら
2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP
- 初心者~中級者までOK:学習進度に合わせて質問や情報共有
- 質問サポートが充実:わからないことを仲間や講師に即相談
- 学習仲間と切磋琢磨:一緒に学ぶから続けやすい
Discordサーバー参加はこちら
3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート
- コナラ総販売200件超:さまざまなUnity開発の依頼を対応
- VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
- ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数
ご相談・お問い合わせはこちら
Discussion