【Unity】Quaternion.identityとは

投稿者: | 2021-04-02

Quaternion.identityは、回転していないときの回転値が得られます。値は(0, 0, 0, 1)です。transform.rotationに代入すると回転が0になります。

Quaternion.identityを入れるのが子オブジェクトだとどうなるでしょうか。

今シーンに2つのCubeがあります。黄色いCubeが青いCubeの子になっています。

親のCubeにスクリプトを付けました。

スクリプトを使って、これらのCubeを左ドラッグで回転させます。右クリックで回転にQuaternion.identityを入れます。

using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class CubeController : MonoBehaviour
{
    [SerializeField] float turnSpeed = 5f;
    Transform childCube;

    // Start is called before the first frame update
    void Start()
    {
        // 黄色いCubeのトランスフォーム
        childCube = transform.GetChild(0);
    }

    // Update is called once per frame
    void Update()
    {
        // 左クリック中は回転させる
        if (Input.GetMouseButton(0))
        {
            var x = CrossPlatformInputManager.GetAxis("Mouse X");
            var y = CrossPlatformInputManager.GetAxis("Mouse Y");

            // シフトキーを押している時は子を回転
            if (Input.GetKey(KeyCode.LeftShift))
            {
                childCube.localRotation *= Quaternion.Euler(childCube.InverseTransformDirection(Camera.main.transform.up) * x * -turnSpeed);
                childCube.localRotation *= Quaternion.Euler(childCube.InverseTransformDirection(Camera.main.transform.right) * y * turnSpeed);
            }
            // 押していないときは親を回転
            else
            {
                transform.localRotation *= Quaternion.Euler(transform.InverseTransformDirection(Camera.main.transform.up) * x * -turnSpeed);
                transform.localRotation *= Quaternion.Euler(transform.InverseTransformDirection(Camera.main.transform.right) * y * turnSpeed);
            }
        }
        // 右クリックでリセット
        else if(Input.GetMouseButtonDown(1))
        {
            // シフトキーを押しているときは子
            if (Input.GetKey(KeyCode.LeftShift))
            {
                // コントロールキーを押しているときはワールド
                if(Input.GetKey(KeyCode.LeftControl))
                {
                    childCube.rotation = Quaternion.identity;
                }
                // 押していないときはローカル
                else
                {
                    childCube.localRotation = Quaternion.identity;
                }              
            }
            // シフトキーを押していないときは親
            else
            {
                transform.localRotation = Quaternion.identity;
            }

        }
    }
}

右クリックしたときに、シフトキーとコントロールキーを押していたら、子オブジェクトのワールド回転に代入します。シフトキーだけのときはローカル回転に代入します。

ワールドの場合は、親の回転とは関係なく子がワールドの軸に対して無回転の状態になるので、その後親の回転をリセットすると、子は変な方向を向きます。

ローカルの場合は、親の軸に沿っているので、親の回転をリセットすると元に戻ります。

コメントを残す

メールアドレスが公開されることはありません。