【Unity】magnitudeとは?ベクトルの長さを取得できる変数

magnitudeとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityのmagnitudeの使い方が知りたい!」

「magnitudeで何が分かるの?」

というお悩みの方に向けた内容となっています。

Unityで、オブジェクトの座標や移動する方向などを決めているのが、ベクトル(Vector)と呼ばれる構造体です。

そして、このベクトルの長さを取得することができる変数として、「magnitude」があります。

magnitudeを使うことで、そのベクトルの長さが分かるようになるので、例えばオブジェクト同士の距離などを計測するのに使えます。

そこで、このページでは、UnityのVectorで使うことができる変数のmagnitudeについて、どんな変数なのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

magnitude変数とは?

まずは、magnitudeという変数がどういう変数なのかを紹介していきます。

ベクトルの長さを取得できる変数

magnitudeは、Vectorの構造体が持つ変数で、そのベクトルの長さをfloat型で保持しています。

そもそもVectorとは、オブジェクトの座標や移動する方向、オブジェクトに加える力などを扱うための構造体で、Vector3ではx,y,zの3つ、Vector2ではx,yの2つのfloat型の変数を持っています。

magnitudeは、このベクトルの長さを取得することができる変数です。

平方根の計算が入るので処理が重い

magnitudeは、処理が少し重くなりやすいというデメリットがあります。

なぜなら、ベクトルの長さを求める際に、三平方の定理によって内部で平方根(√)の計算が使われているからです。

プログラミングにおいて、この平方根の計算は処理が多少重たいため、magnitudeの変数の使い過ぎに注意しておく必要があります。

なお、同じようなものにsqrMagnitudeという変数があります。

このsqrMagnitudeは、ベクトルの長さの二乗の値をそのまま返してくれる変数で、平方根の計算が含まれないので、magnitudeよりも処理が軽くなります。

そのため、例えば実際の長さの値ではなく、どちらのベクトルの長さが長いかどうかといった比較をするだけであれば、sqrMagnitudeを使う方が処理は早いのでおすすめです。

magnitudeの使い方

ここからは、実際にmagnitudeをどうやって使っていくのかを紹介します。

Vector.magnitudeで長さを取得する

using UnityEngine;

public class Test : MonoBehaviour
{
    Vector3 power = new Vector3(2, 2, 6);   // ベクトルを作成

    void Start()
    {
        float length = power.magnitude; // ベクトルの長さを取得
        Debug.Log(length);
    }
}

まず、5行目でVector3の構造体でpowerという変数名のベクトルを作成しておきます。

magnitudeは、Vectorの中で管理されている変数になるので、

Vector.magnitude

と、記述して取得することができます。

ここでは、powerという変数でベクトルを作成しているので、9行目でpower.magnitudeと書いてベクトルの長さを取得しています。

オブジェクト同士の距離を計測できる

magnitudeを使って、オブジェクト同士の距離を計測することができます。

ここでは、2Dゲームで四角と丸のオブジェクトを作り、このオブジェクト間の距離を計測します。

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject square;
    public GameObject circle;

    void Start()
    {
        Vector2 sqPosition = square.transform.position; // 四角の座標位置を取得
        Vector2 ciPosition = circle.transform.position; // 円の座標位置を取得
        Vector2 difference = sqPosition - ciPosition;   // 座標の差を計算
        float distance = difference.magnitude;  // 距離をmagnitudeで取得
        Debug.Log(distance);
    }
}

5,6行目でそれぞれのオブジェクトの変数を宣言して、後でインスペクターウィンドウから入れておきます。

オブジェクトの座標位置は、Transformコンポーネントのposition変数で取得することができます。

10,11行目で、それぞれのオブジェクトの座標位置をVector2型の変数に代入しておきます。

次に、オブジェクト間のベクトルを取得したいので、12行目で先ほど代入したそれぞれのVector2型の変数を引いています。

そしてこのベクトルに対して、13行目でmagnitude変数を使いベクトルの長さを取得することで、オブジェクト間の距離を取得することができます。

なお、オブジェクト同士の距離を計測する方法として、Vectorが持つDistanceメソッドを使うことでも計測できます。

まとめ

このページでは、Unityで使うことができるmagnitude変数について、仕組みや使い方までをまとめていきましたが、いかがでしたでしょうか?

magnitudeは、Vectorの構造体で管理されている変数で、ベクトルの長さを取得することができます。

また、このmagnitudeを使うことで、オブジェクト同士の距離を計測するということもできるようになります。

ただ、magnitudeは平方根の計算が含まれて処理が重くなりやすいので、ベクトルの長さを比較するだけであればsqrMagnitudeを使うようにしましょう。

最後までお読みいただきまして、ありがとうございました!

コメント