Unity入門

【Unity】Transform.rotationの使い方【回転・取得・変更|オイラー角・クォータニオン・LookRotation】

この記事について

この記事では Transform.rotation を使ってオブジェクトを回転させる方法を解説します。
Unityでは回転を「オイラー角」と「クォータニオン(Quaternion)」の2種類で扱うことができ、さらに「LookRotation」でターゲット方向を向かせることも可能です。

この記事でわかること

  • transform.rotation で現在の回転を取得できる
  • transform.eulerAngles → オイラー角(x,y,z°)で直感的に指定できる
  • Quaternion.Euler() → クォータニオンを直感的に設定できる
  • Rotate() → 相対的に回転できる
  • Quaternion.LookRotation() → オブジェクトを指定方向へ向けられる

Transformとは?

Transformについては以下の記事を参考にしてください。

Transform.rotationをスクリプトで制御

Transform.rotationをの準備

まずはヒエラルキーで右クリックをして空のGameObjectとCubeを1つずつ用意します。
・「右クリック」→「Create Empty」
・「右クリック」→「3D Object」→「Cube」

作成できたらCubeを空のGameObjectの子オブジェクトにして、空のGameObjectのRotationを(45,200,-120)にしてください。

次にスクリプトを作成してCubeにアタッチしてください。

現在の回転を取得する

オブジェクトの回転を確認するには「transform.rotation」または「transform.eulerAngles」を使います。

  • Quaternion → 内部的な回転表現(精度が高いが直感的には分かりづらい)
  • eulerAngles → x, y, z の角度(「度」単位)で分かりやすい(正の数)
using UnityEngine;

public class Transform_rotation : MonoBehaviour
{
    void Start()
    {
        Quaternion rot = transform.rotation;
        Debug.Log("現在の回転(Quaternion): " + rot);

        Vector3 euler = transform.eulerAngles;
        Debug.Log("オイラー角: " + euler);
    }
}

実行してみると、どちらも親オブジェクトで設定した回転角度と異なりますね。
説明したいところですが、完全な理解をしていないため省略します。オイラー角は「ジンバルロック」に注意、クォータニオンは「回転の指定」を覚えれば取得することは少ないかと思います。

eulerAngles(オイラー角)で回転を変更する

直感的に「90°回転」と指定するなら「transform.eulerAngles」を使います。
※ここからは分かりにくいので親オブジェクトのRotationを(0,0,0)にしておきます。

using UnityEngine;

public class Transform_rotation : MonoBehaviour
{
    void Start()
    {
        // X軸を90°回転
        transform.eulerAngles = new Vector3(45, 0, 0);
    }
}

実行してみると、回転がVector3に合わして回転しましたね。ただしオイラー角は「ジンバルロック」と呼ばれる問題を起こすことがあるので注意しましょう。

Quaternion(クォータニオン)で回転を指定する

Unity内部では回転は Quaternion(クォータニオン) で表現されています。
直感的に使う場合は「Quaternion.Euler(x,y,z)」を利用するのが一般的です。

using UnityEngine;

public class Transform_rotation : MonoBehaviour
{
    void Start()
    {
        // Y軸を45°回転
        transform.rotation = Quaternion.Euler(0, 45, 0);
        Quaternion rot = transform.rotation;
        Debug.Log("現在の回転(Quaternion): " + rot);
    }
}

実行してみると、インスペクターでは(0,45,0)ですが、内部ではクォータニオンに変換されて保持されています。

相対的に回転させる(Rotate)

フレームごとに少しずつ回す場合は「Rotate()」を使います。
キャラクターやオブジェクトを常に回転させる処理に便利です。

using UnityEngine;

public class Transform_rotation : MonoBehaviour
{
    void Update()
    {
        // Y軸を毎秒90°回転
        transform.Rotate(0, 90 * Time.deltaTime, 0);
    }
}

実行してみると、Y軸に対して回転してますね。

LookRotationでターゲット方向を向く

LookRotation」は指定した方向を向く回転を生成する関数です。
※適当な空のCubeを作成してtargetにアタッチしておいてください。

using UnityEngine;

public class Transform_rotation : MonoBehaviour
{
    [SerializeField] private Transform target;

    void Update()
    {
        Vector3 dir = target.position - transform.position;
        Quaternion lookRot = Quaternion.LookRotation(dir);
        transform.rotation = lookRot;
    }
}

実行してみると、CubeがCube1に向くことがわかりました。updateに入れているのでCube1を動かしてみてきちんと向いていることを確認しましょう。

LookRotationの注意点

  • dir == Vector3.zero の場合はエラーになるのでチェックが必要
  • 第2引数で「上方向」を指定できる → Quaternion.LookRotation(dir, Vector3.up)

まとめ

  • transform.eulerAngles → オイラー角で直感的に指定
  • Quaternion.Euler() → クォータニオンで正確に回転を制御
  • Rotate() → 相対的な回転
  • LookRotation() → ターゲット方向を向かせるのに便利