UnityのVector3とは?初心者にもわかる意味と使い方

ゲーム開発

はじめに

Unityで3Dオブジェクトを扱う際には、Vector3 というクラスがよく登場します。 座標や回転、スケーリングを指定するうえで欠かせない要素なので、最初の段階で理解しておくと安心ですね。 皆さんの中には、「3次元空間を扱うのは難しそう」という不安を感じる方もいるのではないでしょうか。 しかし、基本的な概念をしっかり押さえれば、思い通りにオブジェクトを動かすことができます。 この記事では、Vector3の仕組みや使い方を丁寧に解説していきます。

Vector3の基本概念

Unityでの3D座標は x, y, z の3つの軸を用いて表現します。 Vector3 は、それら3軸の値を1つにまとめた型です。 たとえば (1, 2, 3) のように、3つの要素をまとめて扱えるのが特長でしょう。

一方で、2DゲームやUI要素などには Vector2 を使うケースがあります。 しかし3Dゲームや3D空間のアプリを開発するのであれば、Vector3のほうが圧倒的に使用頻度が高いです。 x, y, z という3つの軸を同時に扱うので、場所の指定だけでなく、移動方向や回転などにも活用できます。

Vector3を生成する方法

Vector3は、下記のようにコードを書くだけで簡単に生成できます。 このとき、要素のデータ型は float となる点に気をつけてください。

// x=1.0, y=2.0, z=3.0 のVector3を生成
Vector3 myVector = new Vector3(1.0f, 2.0f, 3.0f);

// 要素の参照もできる
float xValue = myVector.x;
float yValue = myVector.y;
float zValue = myVector.z;

3D空間を扱ううえでは、こうした小さな数値操作が積み重なって全体の動きを作り上げます。 実務でも、ゲームオブジェクトの位置や方向を扱う場面で何度も目にするクラスなので、まずはこの基本形を押さえてみてください。

位置・移動で使うVector3

3Dオブジェクトの 位置 を指定したり更新するには、Vector3が欠かせません。 たとえば、プレイヤーキャラクターを移動させる方法として、transform.position に新しいVector3を代入する手段がよく使われます。 ここでは、実際の移動処理の一例を見てみましょう。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float moveSpeed = 5f;

    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        // 入力値を用いて移動方向を作成
        Vector3 direction = new Vector3(h, 0, v);

        // 正規化してスピードを乗算
        direction = direction.normalized * moveSpeed * Time.deltaTime;

        // 現在位置に方向ベクトルを足して新しい座標を計算
        transform.position += direction;
    }
}

このコードではキーボード入力(Horizontal と Vertical)に応じて、キャラクターを前後左右に移動させています。 3Dゲームでは地面方向の軸が y ではなく z で表される場合も多いので、何軸が上下で何軸が左右なのか、あらかじめ確認しておくと混乱を減らせますね。

Translateメソッドとの違い

移動を実行するには、transform.position に Vector3 を代入する以外に、transform.Translate() メソッドを使う方法もあります。 どちらもオブジェクトを移動させる点は同じですが、コードの書き方や内部挙動が少し異なります。 好みに合わせて使い分けるのも1つの手でしょう。

Translateメソッドはローカル座標系やワールド座標系など、座標系を指定できるオプションもあります。 必要に応じて使い分けると、思い通りの動きを実現しやすくなります。

回転で使うVector3

オブジェクトを回転させるときにも、Vector3はよく出番があります。 Unityの EulerAngles と呼ばれる概念は、このVector3で回転角度を表す仕組みになっています。

transform.eulerAngles の使い方

例えば、オブジェクトの回転をコードで操作する場合は、transform.eulerAngles に対して新しいVector3を割り当てる方法があります。

using UnityEngine;

public class RotateObject : MonoBehaviour
{
    void Update()
    {
        // 回転角度を1度ずつ増やしていく例
        Vector3 currentRotation = transform.eulerAngles;
        currentRotation.y += 1.0f;
        transform.eulerAngles = currentRotation;
    }
}

この場合、毎フレーム y軸方向の回転角度を加算しています。 結果として、y軸まわりに回り続ける動きを簡単に実装できます。

回転系メソッドとの組み合わせ

transform.Rotate() を使うと、さらに直感的に回転を加えることもできます。 しかし、複数の回転を積み重ねていくと、オイラー角特有の難しさ(ジンバルロックなど)に直面するかもしれません。 そのため、Quaternionを使った回転制御が推奨される場面もありますが、初心者の方はまずVector3の回転指定に慣れておくとよいですね。

スケーリングで使うVector3

オブジェクトの大きさを変更するスケーリング処理でも、Vector3が効果を発揮します。 transform.localScale は Vector3 型なので、x, y, z の値を調整するだけでオブジェクト全体のサイズを変えられます。

localScaleをいじる基本形

下記のように、オブジェクトの大きさをアニメーションさせるコード例を考えてみましょう。

using UnityEngine;

public class ScaleObject : MonoBehaviour
{
    public float scaleSpeed = 0.5f;

    void Update()
    {
        // サイン波でサイズが変化するように計算
        float scaleFactor = Mathf.Abs(Mathf.Sin(Time.time * scaleSpeed));

        // スケール用のVector3を作成
        Vector3 newScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);

        // オブジェクトに反映
        transform.localScale = newScale;
    }
}

このサンプルでは、Time.time と Mathf.Sin() を利用して値を周期的に変化させています。 Mathf.Abs() も加えているので、負の値になる可能性を排除し、サイズが反転しないようにしています。 こうした小さな工夫で簡単なアニメーションを表現できますね。

演算機能で広がる活用法

Vector3には、加算や減算、内積や外積といった計算が組み込まれています。 3D空間の制御では、単なる「座標の塊」ではなく、計算手段としてのVector3が欠かせません。

ベクトル演算の例

よく使われる演算は以下のようなものです。

加算と減算

位置ベクトルを足したり引いたりすることで、移動先を計算するときに使います。

乗算と除算

スカラー値との乗算や除算で、ベクトルの大きさを調整します。

内積(Dot)

2つのベクトルがどの程度同じ方向を向いているかを示す値です。 視界判定や、キャラクターが向いている方向の計算に役立ちます。

外積(Cross)

2つのベクトルに垂直なベクトルを返す演算です。 3Dの回転軸などを求める場合に利用できます。

例えば、前方ベクトルと敵キャラクターとの方向ベクトルがどれくらい似ているかを調べたいときには、内積が役立ちます。 下記は簡単なサンプルです。

using UnityEngine;

public class DotSample : MonoBehaviour
{
    public Transform enemy;

    void Update()
    {
        // 自分の前方ベクトル
        Vector3 forward = transform.forward;

        // 自分から見た敵の方向ベクトル
        Vector3 toEnemy = (enemy.position - transform.position).normalized;

        // 内積を計算
        float dotValue = Vector3.Dot(forward, toEnemy);

        // dotValue が1.0に近いほど、自分の正面方向に敵がいる
        // dotValue が -1.0に近いほど、真後ろにいる
    }
}

数値だけを見ると難しそうですが、考え方は単純で、似た向きであれば値が大きくなるとイメージすると理解しやすいです。

実務での具体的なシーン

Vector3は単なる数学的なベクトルというだけでなく、ゲームやシミュレーションの開発シーンで頻繁に使います。 実務では、オブジェクトの移動やエフェクトの計算、カメラワークの制御など、さまざまな場面でVector3が登場します。

たとえば、TPS(Third-Person Shooter)やアクションゲームを作るとき、プレイヤーと敵の位置を比較して攻撃判定を行うことがあるでしょう。 そのときは、Vector3同士の距離を測定する Vector3.Distance() を活用できます。 近距離であれば特定の攻撃モーションを再生し、遠距離であれば別の動きをするなど、距離ベースのゲームロジックを簡単に組めますよね。

また、3Dマップ上に配置された各種オブジェクトの座標や向きを一括で計算するときにも、Vector3の演算機能は欠かせません。 シームレスにマップを切り替えたい場合や、広大なフィールドにオブジェクトを配置する場合でも、ループ処理の中でVector3を使って座標のセットを行う、という形で効率的に管理できます。

Vector3の演算を多用すると、処理負荷が上がる場合があります。 大量の計算を行うときは、計算回数を見直すなど最適化の余地を探ることが大切ですね。

まとめ

UnityのVector3 は、3D空間でオブジェクトの位置や回転、スケーリングを管理する際の基盤となるクラスです。 ただ「x, y, z がまとまっているだけ」ではなく、演算機能を使うとさまざまなシーンで役立つことがわかりますね。

初心者のうちは、「オブジェクトをどこに置くか」「どの方向に向けるか」を調整するだけでも、大いに活用することになるでしょう。 また、移動や演算に慣れてきたら、外積や内積を活かした高度な制御や演出にも挑戦してみるのも面白いかもしれません。

Vector3の扱いに習熟しておくと、Unityでの3D開発全体がスムーズになりやすいです。 この記事をきっかけに、ぜひ自分でもコードを書きながら少しずつ感覚を掴んでいってください。

C#をマスターしよう

この記事で学んだC#の知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。