敵キャラクターをプレイヤーに向かって動かしたい。
でも、どう計算すればいいのか分からない。
実は、敵の追尾は、方向ベクトルと速度の組み合わせで実現できるものです。
これらを理解すれば、自然にプレイヤーを追いかける敵を実装できます。
この記事では、敵がプレイヤーを追う計算の仕組みを、方向ベクトルと追尾AIの数学で解説します。
- 敵がプレイヤーを追う計算方法が分からない…
- 方向ベクトルを使った追尾の実装方法が理解できていない。
- 自然に追いかける敵AIを実装したい。
✨ この記事でわかること
- 敵追尾計算の基本となる方向ベクトル
- プレイヤーへの方向の計算方法
- 追尾速度の制御方法
- Unityでの敵追尾AIの実装手順
- 初心者でも理解できる追尾AIの基礎
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
敵追尾計算とは何か(ゲーム制作目線)

敵の追尾計算は、プレイヤーの位置と敵の位置から方向ベクトルを計算し、その方向に移動させる処理です。
プレイヤーへの方向ベクトルを求め、その方向に速度をかけることで、自然に追いかける動きを実現できます。
敵追尾計算の基本要素は、以下の2つです。
- 方向ベクトル:プレイヤーへの方向を表すベクトル
- 追尾速度:敵の移動速度
Unityでは、Vector3.DirectionやVector3.MoveTowardsなどの関数を使って、簡単に実装できます。
ゲームでの具体的な使い道

敵追尾計算が、ゲームでどう使われているか確認してみましょう。
アクションゲームの敵AI
アクションゲームでは、敵キャラクターがプレイヤーを追いかけます。
方向ベクトルを計算して、プレイヤーに向かって移動させます。
ホラーゲームの追跡
ホラーゲームでは、敵がプレイヤーを追跡するシーンが多くあります。
プレイヤーへの方向を計算して、恐怖感を与える動きを実現します。
シューティングゲームの敵
シューティングゲームでは、敵がプレイヤーに向かって移動します。
方向ベクトルを使って、プレイヤーの位置に近づく動きを実現します。
敵追尾計算が使われる場面
- アクションゲームの敵AI
- ホラーゲームの追跡
- シューティングゲームの敵移動
- RPGの敵の追尾
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
敵が追いかける仕組みの核心:数学的アプローチ

敵がプレイヤーを追いかける動きは、一見複雑に見えますが、数学的には「引き算と正規化」というシンプルなステップで構成されています。
この流れを理解することで、あらゆるゲームジャンルに応用可能な追尾AIの基礎が身につきます。
方向ベクトルを作るための「引き算の法則」
まず、敵から見てプレイヤーがどの方向にいるのかを知る必要があります。
ここで重要なのがベクトルの引き算です。
計算式は、「プレイヤーの位置 - 敵の位置」となります。
ゲーム数学において、方向を出すときは常に「目的地(行きたい方) - 現在地(自分)」と覚えるのがコツです。
逆に計算してしまうと、敵がプレイヤーから逃げていく「逃走AI」になってしまうので注意しましょう。
「正規化」で移動スピードを一定にする
計算して得られたベクトルは、そのままでは「プレイヤーまでの距離」という長さを持っています。
このまま移動に使うと、プレイヤーが遠くにいるほど敵が猛スピードで動き、近づくとスローになるという不自然な挙動になります。
そこで、ベクトルの長さを「1」に変換する「正規化(Normalize)」という処理を行います。
これにより、純粋な「方向」だけのデータになり、敵の移動速度を自由にコントロールできるようになります。
Time.deltaTimeによるフレームレートの同期
最後に、計算した方向に速度を掛け合わせますが、ここで「Time.deltaTime」を忘れてはいけません。
これは、PCの性能に関わらず「1秒間に移動する距離」を一定に保つための魔法の変数です。
これを使うことで、どのユーザーが遊んでも同じ速さで追いかけてくる、公平なゲーム体験を提供できます。
⚠️ 計算の重要ポイント
- 目的地 - 現在地:この順番で計算すれば、必ず相手の方を向くベクトルが手に入る
- 正規化(normalized):長さを1にすることで、移動速度を一定に制御できる
- 毎フレーム更新:Update関数内で計算し続けることで、逃げるプレイヤーを逃さず追尾する
Unityで実装する追尾AIのバリエーション

原理を理解したら、次はUnityでの具体的な実装方法を見ていきましょう。
単純に近づくだけでなく、少しの工夫でより「生きているような」敵の動きを作ることができます。
最も基本的なベクトル移動
まずは、先ほど解説したベクトルの計算をそのままコードにした例です。
すべてのカスタマイズの基本となります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class BasicEnemyChase : MonoBehaviour { public Transform player; public float chaseSpeed = 5f; void Update() { // 1. 目的地(player) - 現在地(transform) で方向を計算し、正規化する Vector3 direction = (player.position - transform.position).normalized; // 2. 移動量を計算して座標を更新 transform.position += direction * chaseSpeed * Time.deltaTime; } } |
「向き」を変えてより自然な動きにする
位置だけを移動させると、敵が正面を向いたまま「スライド移動」しているように見えてしまいます。
追尾AIに「プレイヤーの方を向く」処理を追加してみましょう。
|
1 2 3 |
// 追いかけながら、プレイヤーの方を向く処理を追加 transform.LookAt(player); |
この1行を加えるだけで、敵のモデルが常にプレイヤーを正面に捉えるようになり、追いかけられている恐怖や緊迫感が増します。
MoveTowardsでスムーズに接近する
Unityには、自分でベクトル計算をしなくても、指定した地点まで移動させてくれる便利な関数 Vector3.MoveTowards が用意されています。
|
1 2 3 4 5 6 7 8 9 10 |
void Update() { // 現在地から目的地まで、指定した速度分だけ近づける transform.position = Vector3.MoveTowards( transform.position, player.position, chaseSpeed * Time.deltaTime ); } |
コードが短く読みやすくなるため、特別なベクトル操作が必要ない場合はこちらがおすすめです。
応用:視界(範囲)に入ったら追尾を開始する
ゲームを面白くするには、「常に追いかけてくる」のではなく「見つかったら追いかけてくる」仕組みが必要です。
距離を測る Vector3.Distance を使って実装します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public float chaseRange = 10f; // 10メートル以内に近づいたら追跡 void Update() { float distance = Vector3.Distance(transform.position, player.position); if (distance <= chaseRange) { Vector3 direction = (player.position - transform.position).normalized; transform.position += direction * chaseSpeed * Time.deltaTime; // 追尾中だけ相手を向く transform.LookAt(player); } } |

まとめ

この記事では、敵がプレイヤーを追う計算について見てきました。
重要なポイントをおさらいします。
重要なポイント:
- 方向ベクトルは、プレイヤーの位置から敵の位置を引いて計算する
- ベクトルを正規化すれば、速度を直接制御できる
- Time.deltaTimeを使って、フレームレートに依存しない移動を実現する
- Vector3.MoveTowardsを使うことで、より簡単に実装できる
- 視野範囲や距離による速度調整を追加すれば、より高度なAIを実現できる
敵の追尾計算は、ゲーム開発で頻繁に使われる重要な技術です。
方向ベクトルと速度を組み合わせることで、自然にプレイヤーを追いかける動きを実現できます。
基本的な実装から始めて、徐々に機能を追加していくことで、より高度なAIを実現できます。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、敵追尾計算を含む物理演算を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント