【Unity】Vectorとは?オブジェクトの座標や方向などを決める構造体

Vector構造体とは? Unity

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

このページでは、

「UnityのVectorってなに?」

「Vectorはどうやってつかうの?」

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

Unityでは、オブジェクトの座標や回転量、向き、力などを表すのにVector(ベクトル)というものを使います。

このVectorは、x,y,zの3つの値(変数)をひとまとめにしている構造体となっています。

Vector構造体によって、オブジェクトの座標の位置やどのくらい回転させるか、またオブジェクトにどのくらいの力を加えるかなどを、指定することができます。

そこで、このページでは、UnityのVector構造体について、どういうものなのか、仕組みや使い方などをまとめていきます。

この記事を書いた人

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

Vector構造体とは?

まずは、Vector構造体の仕組みについて紹介していきます。

オブジェクトの座標や方向などを決める構造体

Vector(ベクトル)とは、2次元ベクトルおよび3次元ベクトルを表すための構造体です。

そして、このVectorは、オブジェクトの座標や向きを決めたり、力の強さなどを表すのに使います。

例えば、3Dゲームでオブジェクトを配置する座標を指定する場合、X座標Y座標Z座標の3つの値を使って、場所を指定することになります。

この座標の位置を指定するためのそれぞれの値をまとめているものが、Vectorという構造体になります。

なお、構造体とは、クラスと同じように変数やメソッドをまとめているもので型として使えます。

構造体は、クラスよりも高速で動くことができますが、機能の制限が強いという特徴があります。

x,y,zのfloat型のメンバ変数を持つ

このVectorは、

  • 2次元ベクトルではVector2
  • 3次元ベクトルではVector3

の構造体を使います。

そして、

  • Vector2では「x」「y」
  • Vector3では「x」「y」「z」

のメンバ変数を持っていて、それぞれの変数によってベクトルを表していることになります。

Vector構造体の使い方

ここからは、実際にUnityでのVector構造体の使い方についてまとめていきます。

座標を管理するのに使う

オブジェクトの座標を決めたり移動させたりするのに、Vector構造体はよく使います。

例えば、スペースキーを押したらオブジェクトを特定の座標に移動させたいとした場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    Vector2 movePos = new Vector2(3.5f, 3.5f);  // 移動先の座標を決める

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            transform.position = movePos;   // 座標の位置に代入して移動する
        }
    }
}

5行目で移動させたい座標をVector2型(2Dゲームなので)で指定します。

新しくVector2を作成する際は、new演算子を付けてインスタンスを作成してあげます。

そして、スペースキーを押した処理の中の11行目で、オブジェクトの座標の位置を決める「transform.position」に先ほどのVector2型の変数を代入することで、オブジェクトの座標が変わります。

他にも、オブジェクトを移動する際は、「transform.Translate」などが使われます。

回転量を決めるのに使う

オブジェクトを回転する際にも、Vectorが使われます。

ここでは、スペースキーを押している間は、オブジェクトが常に回転するという仕組みを作ってみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    Vector3 rotation = new Vector3(0.2f, -0.3f, 0.03f); // 回転量をVectorで指定する

    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            transform.Rotate(rotation); // オブジェクトを回転させる
        }
    }
}

オブジェクトを回転させる処理は、Transformコンポーネントで定義されているRotateメソッドを使うことができます。

このRotateメソッドは、引数にVector型を指定してあげることで、オブジェクトをそのベクトル分回転させることができます。

5行目で先ほどと同様にVector3型の変数を新しく作成して、それを11行目でRotateメソッドの引数に指定しています。

力を加えるのに使う

オブジェクトに物理的な動きを持たせるRigidbodyコンポーネントを付けて、そのオブジェクトに力を加えて動かしたい時にも、Vectorは使います。

今回は、スペースキーを押すとオブジェクトの後ろから力が加わるように設定していきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    Vector2 power = new Vector2(500, 0);  // 力のベクトルを作成
    Rigidbody2D rb; // Rigidbody型の変数を宣言

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();   // Rigidbodyコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(power); // オブジェクトに力を加える
        }
    }
}

Unityで力を加える処理として、Rigidbodyコンポーネントで定義されているAddForceメソッドが使われます。

AddForceは、引数にVector型を指定してあげることで、その方向と強さに力を加えることができるメソッドです。

5行目で力のベクトルを新しく作成して、スペースキーを押した処理の17行目でAddForceの引数に指定してあげます。

これで、スペースキーを押すと、

左から右に向かって力が加わっているのが分かります。

距離を測るのに使う

オブジェクトの間の距離を計測したりするのにも、Vector構造体は使われています。

例えば、2つのオブジェクト同士の距離をリアルタイムで計測する仕組みを作っていきます。

using TMPro;
using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject red;
    public GameObject yellow;
    Vector3 redPos; // redオブジェクトの座標
    Vector3 yellowPos;  // yellowオブジェクトの座標
    TextMeshProUGUI textMeshProUGUI;

    void Start()
    {
        textMeshProUGUI = GetComponent<TextMeshProUGUI>();
    }

    Vector3 redPosPre;
    Vector3 yellowPosPre;

    void Update()
    {
        if (redPos != red.transform.position)
        {
            redPos = red.transform.position;    // redオブジェクトの座標を代入
        }

        if (yellowPos != yellow.transform.position)
        {
            yellowPos = yellow.transform.position;  // yellowオブジェクトの座標を代入
        }

        if (redPosPre != redPos || yellowPosPre != yellowPos)
        {
            textMeshProUGUI.text = Vector3.Distance(redPos, yellowPos).ToString("F2") + "m";    // オブジェクト間の距離を計算

            redPosPre = redPos;
            yellowPosPre = yellowPos;
        }
    }
}

2つのオブジェクトの距離は、Vector構造体で定義されているDistanceメソッドで計測することができます。

このDistanceは、引数で2つのオブジェクトのVector型を指定することで、距離を測定してくれるメソッドです。

オブジェクトAとBに分けて、それぞれの座標の位置を24行目と29行目で取得しています。

そして、34行目でDistanceメソッドの引数にそれぞれのVector型を指定することで、オブジェクト間の距離を取得できます。

今回は、UIで距離を表示するようにしたので、

片方のオブジェクトを動かすと、距離表示が変わるようになっています。

なお、Vector構造体には、他にもベクトルの長さを取得できるmagnitudeという変数などを持っています。

まとめ

このページでは、Unityでよく使われるVector構造体について、どんな仕組みなのか、また使い方までを紹介していきましたが、いかがでしたでしょうか?

Vectorは、オブジェクトの座標や向き、力の強さなどを決める構造体です。

2Dゲームでは、xとyの変数を持つVector2を使い、3Dゲームでは、xとyとzの変数を持つVector3を使って表します。

このVectorは、Unityでも様々な時に登場してくるので、覚えておくとよいでしょう。

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

コメント