Unityで学ぶ:Vector3の基本と「マジックナンバー」を避ける書き方

はじめに

Unityでゲームを作る際、オブジェクトの位置や移動を扱うときに必ず登場するのが Vector3 クラスです。

また、コードを書く上で「マジックナンバー(意味の分からない数値)」を避けることは、保守性を高めるために重要です。

この記事では、Vector3の基本的な使い方と、マジックナンバーを回避するコーディングの工夫について学びましょう。


1. Vector3の基本

Vector3は 3次元ベクトル(x, y, z) を表す構造体です。オブジェクトの位置や方向、移動量などを表現できます。

宣言と代入

var position = new Vector3(0, 1, 2);
transform.position = position; // (0,1,2) の位置に配置

ベクトルの性質を利用する

Debug.Log(position.normalized); // 方向ベクトル(大きさ1)
Debug.Log(position.magnitude);  // 大きさ(長さ)
  • normalized → 大きさを1に正規化して「方向」だけを表す
  • magnitude → ベクトルの長さを取得

四則演算も可能

Debug.Log(new Vector3(3, 1, 0) + new Vector3(5, 3, 1));
// → (8, 4, 1)

Debug.Log(new Vector3(3, 1, 0) * 2f / 5f);
// → (1.2, 0.4, 0)

よく使う定義済みベクトル

Debug.Log(Vector3.zero);    // (0,0,0)
Debug.Log(Vector3.up);      // (0,1,0)
Debug.Log(Vector3.forward); // (0,0,1)

これらを使うことで、毎回 new Vector3(…) と書かなくても済みます。


2. マジックナンバーを避けよう

コード中にいきなり数字を書くと「この数字は何を意味しているのか?」が分かりにくくなります。

これを「マジックナンバー」と呼び、保守性を下げる原因となります。

悪い例

rigidbody.velocity = rigidbody.velocity.normalized * 5;

→ 「5」が移動スピードだと慣れた人なら分かるかもしれませんが、他人には意味不明です。


良い例(定数や変数を使う)

public float moveSpeed = 5f;

rigidbody.velocity = rigidbody.velocity.normalized * moveSpeed;
  • moveSpeed と名前を付けることで「移動速度」だと一目で分かる
  • Inspectorから変更できるので調整が簡単
  • 後から仕様変更が入っても対応しやすい

良い質問です!「方向ベクトル(normalized)」と「大きさ(magnitude)」は、Unityでのゲーム開発においてとても頻繁に使われます。それぞれの使い道を整理してみましょう。


3. 方向ベクトル(normalized)の使い道

方向ベクトルは「向きだけを表すベクトル(長さ=1)」 です。

位置や移動の「方向」を計算したいときに役立ちます。

1. 移動処理に使う

Vector3 dir = (target.position - transform.position).normalized;
transform.position += dir * speed * Time.deltaTime;
  • 自分からターゲットへの方向を求め、その方向に一定のスピードで移動できる。
  • ホーミング弾や敵キャラの追尾移動に活用できます。

2. 向き(回転)の決定

Vector3 dir = (target.position - transform.position).normalized;
transform.forward = dir; // オブジェクトをターゲット方向に向ける
  • 敵キャラをプレイヤーに向ける
  • 発射口をターゲットに向けて弾を撃つなどの「向き制御」に便利。

3. 力や弾道の制御

rigidbody.AddForce(dir * power);
  • 方向ベクトルに威力(スカラー値)を掛けることで「特定方向に力を加える」ことが可能。
  • 砲弾、矢、パンチのノックバックなどに利用されます。

4. 大きさ(magnitude)の使い道

大きさ(magnitude)は「ベクトルの長さ(スカラー値)」です。

「どのくらい離れているか」「どのくらい速いか」を測るのに便利です。

1. 距離の計算

float distance = (target.position - transform.position).magnitude;
if (distance < 5f)
{
    Debug.Log("ターゲットに近づいた!");
}
  • プレイヤーと敵の距離
  • 取得可能範囲(アイテムを拾う距離など)
  • 攻撃判定の範囲チェック

2. スピードの測定

float speed = rigidbody.velocity.magnitude;
Debug.Log("現在の移動速度は " + speed);
  • Rigidbodyの速度ベクトルの長さを測ることで「速さ」が分かる。
  • スピード制限やブースト効果の判定に使える。

3. 正規化と組み合わせる

  • 「ベクトルを大きさと方向に分ける」ことがよくあります。
Vector3 v = new Vector3(3, 4, 0);

float length = v.magnitude;     // 5
Vector3 dir = v.normalized;     // (0.6, 0.8, 0)

Vector3 check = dir * length;   // 元のベクトルに戻る

→ 「長さ × 方向 = 元のベクトル」 という関係です。

これは物理・ゲーム演算の基本パターンです。


4. まとめ

  • 方向ベクトル(normalized)
    • 「どっちに進む?」を決める
    • 移動方向、向きの決定、力の加える方向
  • 大きさ(magnitude)
    • 「どのくらい?」を決める
    • 距離の測定、速さの測定、範囲判定

この2つを組み合わせることで、「どこに、どのくらい動くか」 を自在にコントロールできます。


4. まとめ

  • Vector3 は位置・方向・移動などを表す便利な構造体
  • normalized で方向ベクトル、magnitude で長さを取得できる
  • よく使う方向は Vector3.up や Vector3.forward を活用
  • マジックナンバーは避ける → 意味のある名前を付けた変数や定数に置き換える

5. 発展的な活用

  • 移動処理で transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime) を使う
  • 内積(Vector3.Dot)、外積(Vector3.Cross)を使って角度や回転を計算する
  • Lerp や MoveTowards を使った滑らかな移動

訪問数 6 回, 今日の訪問数 7回

C#,Unity,構造体

Posted by hidepon