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

追尾移動計算は、ターゲット(プレイヤーなど)への方向ベクトルを計算し、その方向に一定の速度で移動させる処理です。
敵キャラクターがプレイヤーを追いかける動きを実現する際に、よく使われます。
方向ベクトルに速度をかけることで、自然な追尾移動を実現できます。
追尾移動計算の基本要素は、以下の3つです。
- 方向ベクトル:ターゲットへの方向を表すベクトル
- 速度:移動する速度
- フレームレート補正:Time.deltaTimeによる時間補正
Unityでは、Vector3を使った方向計算と、Time.deltaTimeによる時間補正で実現します。
ゲームでの具体的な使い道

追尾移動計算が、ゲームでどう使われているか確認してみましょう。
敵の追尾AI
敵キャラクターがプレイヤーを追いかける際に使います。
プレイヤーへの方向ベクトルを計算し、その方向に移動させます。
ミサイルの誘導
ミサイルがターゲットに向かって飛ぶ際に使います。
ターゲットへの方向を常に計算し、その方向に移動させます。
ペットの追従
ペットや相棒がプレイヤーを追いかける際に使います。
プレイヤーの位置に応じて、方向を更新しながら追従します。
敵の群れの追尾
複数の敵が群れでプレイヤーを追いかける際に使います。
各敵が個別にプレイヤーへの方向を計算し、移動します。
追尾移動計算が使われる場面
- 敵キャラクターのプレイヤー追尾
- ミサイルやプロジェクタイルの誘導
- ペットや相棒の追従
- 群れの敵の集団追尾
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
数学的に理解する!追尾移動を支える4大ステップ

追尾移動の実装は、コードを丸暗記するのではなく「数学的なイメージ」を持つことが大切です。
実は、この動きは「方向を出す → 質を揃える → 量をかける」という、非常に論理的なステップで構成されています。
ここでは、その仕組みを4つの工程に分けて詳しく解説します。
1. ターゲットへの「方向ベクトル」を算出する
まずは、自分がどこに向かうべきかを割り出します。
ゲーム数学において、ある地点から別の地点への方向を求めるには「引き算」を使います。
ここで重要なのは、「目的地(ターゲット)から現在地(自分)を引く」という順番です。
- 計算式: 方向ベクトル = ターゲットの位置 – 自分の位置
- 意味: 自分から見て、ターゲットがどの方向にどれくらい離れているかを表す矢印が生まれます。
2. 「正規化(Normalize)」で速度を一定にする
算出した方向ベクトルをそのまま移動に使うと、ターゲットから遠いほど移動速度が速くなり、近づくと遅くなるという不安定な挙動になります。
これを防ぐために、ベクトルの「長さ」を1に揃える「正規化」という作業を行います。
- 計算式: 正規化ベクトル = 方向ベクトル / ベクトルの長さ
- メリット: 「方向」の情報だけを純粋に取り出せるため、どんな距離にいても同じ速度で追いかけられるようになります。
3. 速度とフレームレート補正を掛ける
長さ1になったベクトルに、実際の「速さ」と、PCの性能差を吸収するための「時間」を掛け合わせます。
これにより、1フレームあたりの正確な「移動量」が決定します。
- 計算式: 1フレームの移動量 = 正規化ベクトル × 設定速度 × Time.deltaTime
- 重要性:
Time.deltaTimeを掛けることで、高スペックなPCでも低スペックなPCでも、現実世界の1秒間で進む距離が一定に保たれます。
4. 現在の位置に移動量を加算する
最後に、算出した移動量を現在の自分の座標に足し合わせます。
これを毎フレーム(Updateメソッド内など)繰り返すことで、滑らかに追いかけるアニメーションが完成します。
- 計算式: 新しい位置 = 現在の位置 + 1フレームの移動量
- 結果: ターゲットが動いても、毎フレーム「方向」を計算し直すため、常に追いかけ続ける挙動になります。
⚠️ 数学マニアの注目ポイント
- 引き算の順序: 「自分 - ターゲット」にすると、逆方向に逃げていく挙動になるので注意!
- 正規化の忘れ: 「正規化」を忘れると、敵が瞬間移動のような猛スピードで突っ込んでくる原因になります。
- リアルタイム更新: 毎フレームこの4ステップを繰り返すことで、ターゲットが急カーブしても追従が可能になります。
Unityで実装する際の注意点(代表例)

Unityで追尾移動を実装する場合の注意点を見ていきましょう。
基本的な追尾移動
最もシンプルな追尾移動の実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class ChaseMovement : MonoBehaviour { public Transform target; // 追尾するターゲット public float speed = 5f; // 移動速度 void Update() { // ターゲットへの方向ベクトルを計算 Vector3 direction = target.position - transform.position; // 正規化して方向だけを取得 direction.Normalize(); // 速度をかけて移動 transform.position += direction * speed * Time.deltaTime; } } |
距離チェック付きの追尾
一定距離以上離れている場合のみ追尾する実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class ChaseWithDistance : MonoBehaviour { public Transform target; public float speed = 5f; public float chaseDistance = 10f; // 追尾開始距離 void Update() { // ターゲットとの距離を計算 float distance = Vector3.Distance(transform.position, target.position); // 一定距離以上離れている場合のみ追尾 if (distance > chaseDistance) { Vector3 direction = (target.position - transform.position).normalized; transform.position += direction * speed * Time.deltaTime; } } } |
滑らかな追尾(Lerpを使う方法)
Lerpを使った、より滑らかな追尾の実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class SmoothChase : MonoBehaviour { public Transform target; public float followSpeed = 2f; // 追従速度(Lerpの補間係数) void Update() { // Lerpで滑らかに位置を補間 transform.position = Vector3.Lerp( transform.position, target.position, Time.deltaTime * followSpeed ); } } |
2D空間での追尾
2Dゲームでの追尾移動の実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Chase2D : MonoBehaviour { public Transform target; public float speed = 5f; void Update() { // 2D空間では、Z軸を無視 Vector2 myPos = new Vector2(transform.position.x, transform.position.y); Vector2 targetPos = new Vector2(target.position.x, target.position.y); Vector2 direction = (targetPos - myPos).normalized; Vector2 movement = direction * speed * Time.deltaTime; transform.position += new Vector3(movement.x, movement.y, 0); } } |
速度制限付きの追尾
最大速度を制限した追尾の実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class LimitedSpeedChase : MonoBehaviour { public Transform target; public float maxSpeed = 5f; // 最大速度 public float acceleration = 10f; // 加速度 private Vector3 velocity = Vector3.zero; void Update() { // ターゲットへの方向ベクトル Vector3 direction = (target.position - transform.position).normalized; // 加速度をかけて速度を更新 velocity += direction * acceleration * Time.deltaTime; // 最大速度で制限 if (velocity.magnitude > maxSpeed) { velocity = velocity.normalized * maxSpeed; } // 位置を更新 transform.position += velocity * Time.deltaTime; } } |
回転も追従させる
移動だけでなく、回転もターゲットに向ける実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class ChaseWithRotation : MonoBehaviour { public Transform target; public float moveSpeed = 5f; public float rotationSpeed = 5f; void Update() { // 移動 Vector3 direction = (target.position - transform.position).normalized; transform.position += direction * moveSpeed * Time.deltaTime; // 回転もターゲットに向ける Vector3 lookDirection = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(lookDirection); transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |

まとめ

この記事では、追尾移動計算について見てきました。
重要なポイントをおさらいします。
重要なポイント:
- 追尾移動は、方向ベクトルを計算して速度をかけることで実現される
- ベクトルを正規化すれば、方向だけを取得できる
- Time.deltaTimeを使うことで、フレームレートに依存しない移動ができる
- Lerpを使うと、より滑らかな追尾ができる
- 加速度や速度制限を組み合わせると、より自然な挙動になる
追尾移動計算は、ゲーム開発で頻繁に使われる重要な技術です。
敵AIの追尾や、ミサイルの誘導など、様々な場面で活用できますね。
シンプルな計算で、自然な追尾動きを実現できます。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、追尾移動を含む物理演算を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント