Unityで学ぶ2Dベクトルの距離計算とmagnitudeプロパティの仕組み

この資料では、Unityの基本機能である2Dベクトル(Vector2)を利用して、2点間の距離を求める方法について解説します。さらに、magnitude プロパティの内部実装の考え方を理解できるように、疑似コードを交えて説明します。


1. プログラム例の概要

以下のコードは、2次元空間上の始点と終点の座標を設定し、それらの間の距離を2通りの方法で計算してコンソールに出力する例です。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Vector2 startPos = new Vector2(0, 0);
        Vector2 endPos = new Vector2(10, 10);

        // 距離を求める:Vector2.Distance() を使用
        float euclideanDistance = Vector2.Distance(startPos, endPos);
        Debug.Log(euclideanDistance);

        // 差分ベクトルを求め、その大きさ(距離)を計算
        Vector2 displacement = endPos - startPos;
        // 表示される値は euclideanDistance と同じ
        Debug.Log(displacement.magnitude);
    }
}

2. コードの詳細解説

2.1. クラス定義と Start メソッド

  • クラス定義
    public class Test : MonoBehaviour
    Unityの MonoBehaviour を継承しているため、このクラスはゲームオブジェクトにアタッチして利用できます。
  • Start メソッド
    void Start()
    ゲーム開始時、またはオブジェクトがシーンに生成された時に自動的に呼び出される初期化メソッドです。

2.2. ベクトルの定義

  • 始点の定義
    Vector2 startPos = new Vector2(0, 0);
    座標 (0, 0) を始点として設定します。
  • 終点の定義
    Vector2 endPos = new Vector2(10, 10);
    座標 (10, 10) を終点として設定します。

2.3. 距離計算方法 1: Vector2.Distance()

  • 計算方法
    float euclideanDistance = Vector2.Distance(startPos, endPos);
    この静的メソッドは、内部で2点間の差分ベクトルを求め、その大きさ(ユークリッド距離)を計算して返します。
  • 結果の出力
    Debug.Log(euclideanDistance);
    計算された距離がUnityのデバッグコンソールに表示されます。

2.4. 距離計算方法 2: ベクトルの引き算と magnitude プロパティ

  • ベクトルの引き算
    Vector2 displacement = endPos - startPos;
    2点間の差分ベクトルを求め、方向と大きさ(距離の情報の両方)を持つベクトルを得ます。
  • 大きさの計算
    Debug.Log(displacement.magnitude);
    差分ベクトルの magnitude プロパティを用いて、その大きさを計算し出力します。
    この方法で計算される距離は、Vector2.Distance() の結果と同じになります。

3. magnitudeプロパティの内部実装

3.1. 基本的な考え方

Vector2magnitude プロパティは、ベクトルの大きさ、つまりユークリッドノルム(直線距離)を計算します。2次元ベクトルの場合、

  • ベクトルが (x, y) とすると、
  • 大きさ (magnitude) = √(x² + y²)

3.2. 疑似コードで見る実装例

以下は、magnitude プロパティの内部でどのような計算が行われているかを示す疑似コードの例です。

public float magnitude
{
    get
    {
        // xとyの値に対してユークリッド距離を計算する
        return Mathf.Sqrt(x * x + y * y);
    }
}
  • Mathf.Sqrt:
    Unityの Mathf クラスの Sqrt 関数を使って平方根を計算しています。
  • x * x + y * y:
    ベクトルの各要素の二乗和を計算しています。これがユークリッド距離の平方に相当します。

3.3. 例:距離計算の全体像

例えば、2点 (0, 0) と (10, 10) の距離を計算する場合:

  1. ベクトルの引き算で (10 – 0, 10 – 0) = (10, 10) となる。
  2. magnitude の計算は、√(10² + 10²) = √(100 + 100) = √200 となる。
  3. 結果は約 14.14 として出力されます。

この計算は、Vector2.Distance(startPos, endPos) でも同様に行われます。


4. コードの目的と利用例

4.1. 学習目的

  • 基本概念の理解:
    2次元空間におけるベクトルの基本操作(引き算、距離計算)を理解するための例です。
  • 内部の仕組み:
    magnitude プロパティの計算方法を疑似コードで示すことで、内部でどのような処理が行われているのか理解を深めます。
  • 変数名の工夫:
    変数名をより意味のある名称(euclideanDistancedisplacement)にすることで、コードの可読性を向上させ、何が計算されているのかが一目で分かるようになります。

4.2. ゲーム開発での応用

  • オブジェクト間の距離判定:
    プレイヤーと敵、または他のオブジェクトとの距離を測定し、近接時のアクション(攻撃、アイテム取得、衝突判定など)を実装する際に利用されます。
  • 移動やナビゲーション:
    オブジェクトが目的地までの距離を知ることで、よりスムーズな移動アルゴリズムの設計や補間処理に役立ちます。

5. まとめ

この資料では、Unityで2Dベクトルを用いて距離を計算する基本的な方法を紹介しました。

  • 2通りの距離計算方法:
    Vector2.Distance() と、ベクトルの引き算+magnitude プロパティを用いる方法。
  • magnitudeプロパティの仕組み:
    疑似コードを用いて、magnitude プロパティが内部で √(x² + y²) の計算を行っていることを示しました。
  • 変数名の改善:
    euclideanDistancedisplacement という変数名により、各変数の意味がより明確になりました。

この知識は、ゲーム内のオブジェクト間の距離判定や移動ロジックの実装において非常に役立ちます。ぜひ実際のコードで試し、各メソッドの動作や内部処理を確認してみてください。

Unity

Posted by hidepon