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 を使った滑らかな移動
ディスカッション
コメント一覧
まだ、コメントがありません