【Unity基礎】Rotateでオブジェクトを回転させる方法

Unityにはオブジェクトを回転させる(向きを変える)方法が無数に用意されていて、初心者にとっては理解するのが難しくなっています。
理系の人ならいざ知らず、「euler」とか「Orientation」とか「ジンバルロック」とかの難しい用語が出てきた日にはパニックです。

そんなUnityの回転関係ですが、初心者でもなんとか理解できそうなのが「Transform.Rotate」を使う方法。
というわけで、Rotateを使ってオブジェクトを回転させる方法をスクリプト例を交えて説明したいと思います。

この記事の環境
Unity Version 2018.2.17f1 Personal
OS Windows10

Rotateとは

RotateとはTransformクラスの関数で、X, Y, Z軸によりオブジェクトを回転させる事ができます。
デフォルトではオブジェクトのローカル座標を使って回転し、引数による指定でワールド座標での回転にすることも出来ます。

「とりあえずキャラクターを右や左に向かせたい」と言う単純な用途だったら、特につまずくことなく使えるかと思います。
ただし、「南に向かせたい」とか、「ターゲットとなるオブジェクトの方に向かせたい」と言う用途では他の方法を使ったほうが簡単です。

Rotateの書式

Rotateは次の2つの書き方ができるようです。

public void Rotate (Vector3 eulers, Space relativeTo= Space.Self);
public void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo= Space.Self);

回転の座標をVector3で与えるか、x, y, zそれぞれの数値(float)で与えるかの違い。

具体的には次のように書きます。

transform.Rotate(new Vector3(0, 2, 0), Space.Self);

または、次のように書いても同じことです。

transform.Rotate(0, 2, 0, Space.Self);

例えばUpdate関数内に上のコードを書くと、Y軸を中心に回転し続けます。

Space.Selfの部分はオブジェクトのローカル座標を使って回転させることを意味します。
Space.Worldとした場合はワールド座標を使用して回転させることが出来ます。
省略した場合はSpace.Selfを指定したのと同じ結果です。

Space.Selfローカル座標で回転(省略可)
Space.Worldワールド座標で回転

Rotateでオブジェクトを回転させるスクリプト例

Scene上にキューブなどのオブジェクトを作成してスクリプトをアタッチ。
スクリプトのUpdate関数を次の内容にコピペすると、キー操作でオブジェクトを回転させられます。

void Update () {
    // UpキーでX軸回転
    if (Input.GetKey("up")) {
        transform.Rotate(2, 0, 0, Space.Self);
    }
    // DownキーでX軸回転
    if (Input.GetKey("down")) {
        transform.Rotate(-2, 0, 0, Space.Self);
    }
    // Right キーでY軸回転
    if (Input.GetKey("right")) {
        transform.Rotate(0, 2, 0, Space.Self);
    }

    //Left キーで左でY軸回転
    if (Input.GetKey("left")) {
        transform.Rotate(0, -2, 0, Space.Self);
    }
    // Aキーで左でZ軸回転
    if (Input.GetKey("a")) {
        transform.Rotate(0, 0, -2, Space.Self);
    }
    // Sキーで左でZ軸回転
    if (Input.GetKey("s")) {
        transform.Rotate(0, 0, 2, Space.Self);
    }
}

Space.Worldを指定して、ワールド座標で回転させる例

上の画像は、Rotateを使ってワールド座標で回転させた例です。
ローカル座標で回転させた下の画像との違いが分かるかと思います。

Rotate関数の引数に「Space.World」を指定してやるとワールド座標での回転になります。
例えばこんな風に。

transform.Rotate(2, 0, 0, Space.World);

X軸は「Space.Self」で動かし、Y軸は「Space.World」動かすというのもありです。
カメラを動かすときはこのほうがうまくいきます。

コメント