【数学アレルギー向け】敵の追尾や弾の移動で必須となる「ベクトル」の考え方超入門

【数学アレルギー向け】敵の追尾や弾の移動で必須となる「ベクトル」の考え方超入門

はじめに:数学が苦手でもゲームは作れる

「ベクトル」という言葉を聞いただけで、高校時代の数学の記憶が蘇る方もいるのではないでしょうか。

ゲーム開発で使うベクトルは、数学の授業で習ったものよりずっとシンプルです。この記事では、数式をできるだけ使わず、「なんとなくわかる」を目指して解説していきます。

ベクトルって結局なに?

一言でいうと「矢印」です

ベクトルを難しく考える必要はありません。「どの方向に、どれくらい進むか」を表す矢印、というイメージです。

たとえば、こんな指示を想像してください。

「北に向かって3メートル歩いて」

これがベクトルです。方向(北)大きさ(3メートル) の2つの情報を持っています。

ベクトルの基本概念
ベクトルは「方向」と「大きさ」を持つ矢印

ゲームでの具体例

ゲーム開発では、Vector3という形でベクトルを扱います。これは3つの数字の組み合わせです。

Vector3(1, 0, 0)  → X方向(右)に1進む
Vector3(0, 1, 0)  → Y方向(上)に1進む
Vector3(0, 0, 1)  → Z方向(奥)に1進む

「え、3つも数字があるの?」 と思うかもしれませんが、単に「右に何歩、上に何歩、奥に何歩」を表しているだけです。

X, Y, Z軸の図
X, Y, Z の3つの軸で3D空間を表現

敵がプレイヤーを追いかける仕組み

ここからが本番です。ベクトルを使って「敵がプレイヤーを追尾する」処理を作ってみましょう。

ステップ1:方向を求める

敵からプレイヤーへの方向は、「目的地 − 現在地」 で求められます。

追いかける方向 = プレイヤーの位置 − 敵の位置
敵→プレイヤーの方向
引き算で「どっちに進めばいいか」がわかる

計算すると (5-2, 3-1) = (3, 2) という矢印が得られます。これが「敵からプレイヤーへ向かう方向」です。

ステップ2:正規化(Normalize)する

ここで問題が発生します。

プレイヤーが近くにいると矢印が短く、遠くにいると矢印が長くなってしまいます。このまま移動に使うと、遠い敵ほど速く動いてしまうことに。

距離によって速度がバラバラになってしまう

そこで登場するのが正規化(Normalize)です。

正規化とは?

矢印の長さを「1」に揃える処理です。方向はそのまま、長さだけを調整します。

正規化前:(3, 2)       → 長さがバラバラ
正規化後:(0.83, 0.55) → 長さが1に統一
正規化のビフォーアフター
方向はそのまま、長さだけを1に揃える

これで距離に関係なく、常に同じ速度で追いかけることができます。

ステップ3:速度をかける

最後に、正規化したベクトルに「移動速度」をかけて完成です。

// Unityでの実装例(敵自身のスクリプトに書く場合)
Vector3 direction = (player.position - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;

たった2行で追尾AIの完成です!

弾をまっすぐ飛ばす

弾の移動も同じ考え方です。

private Vector3 shootDirection;

void Start() {
    // 【発射時】生成された瞬間に1回だけ計算!
    shootDirection = (target.position - transform.position).normalized;
}

void Update() {
    // 【毎フレーム】決まった方向に飛び続ける
    transform.position += shootDirection * bulletSpeed * Time.deltaTime;
}

ポイントは、発射時に方向を決めて保存しておくこと。毎フレーム方向を計算し直すと、弾が追尾ミサイルになってしまいます(逆に言えば、これがホーミング弾のロジックです)。

距離の計算

「プレイヤーが近づいたら攻撃する」といった処理には、距離の計算が必要です。

便利メソッドを使おう

UnityならVector3.Distanceを使うだけでOKです。

float distance = Vector3.Distance(enemy.position, player.position);

if (distance < 5f)
{
    // 攻撃開始!
}

中身の計算(三平方の定理)を知らなくても、まったく問題ありません。

距離と攻撃範囲
一定距離以内に入ったら攻撃を開始

パフォーマンスTips

距離の比較だけなら、sqrMagnitudeを使うと少し高速です。

// 5メートル以内かどうかを判定
if ((player.position - enemy.position).sqrMagnitude < 25f) // 5の2乗
{
    // 攻撃開始!
}

大量の敵がいるゲームでは、このちょっとした工夫が効いてきます。

よく使うベクトル操作まとめ

やりたいことコード
AからBへの方向(B - A).normalized
2点間の距離Vector3.Distance(A, B)
ベクトルの長さvector.magnitude
長さを1にするvector.normalized
2つのベクトルを混ぜるVector3.Lerp(A, B, 0.5f)

まとめ:ベクトルは「矢印」と覚えよう

  • ベクトル = 方向と大きさを持つ矢印
  • 方向を求める = 目的地 − 現在地
  • 正規化 = 長さを1に揃えて、速度を扱いやすくする
  • 距離 = Vector3.Distanceに任せる

数学的な理解は後からついてきます。まずは「こう書けば動く」を体験して、ゲーム作りを楽しんでください!

参考リンク