【Unity】回転を0に初期化する

投稿者: | 2021-04-07

Quaternion.identityでも回転なしの値を得られますが、defaultを使って0に初期化することもできます。

シーンには親子にした2つのCubeをおいて、親にスクリプトを付けました。

左ドラッグでCubeを回転して、右クリックで回転にdefaultを代入して0に初期化しています。

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);

        Debug.Log("Quaternion.identity = " + Quaternion.identity);
        Quaternion rot = default;
        Debug.Log("default = " + rot);
    }

    // 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;
                    Quaternion rot = default;
                    rot.w = 1f;
                    childCube.rotation = rot;
                }
                // 押していないときはローカル
                else
                {
                    // childCube.localRotation = Quaternion.identity;
                    childCube.localRotation = default;
                }
            }
            // シフトキーを押していないときは親
            else
            {
                // transform.localRotation = Quaternion.identity;
                transform.localRotation = default;
            }

        }
    }
}

しかし、defaultを入れるだけだと、子のワールド回転に代入しても、親の軸に揃ってしまいます。Quaternion.identityのときはワールドの軸に揃いました。

これは、Quaternion.identiryと回転のdefaultでは、4つ目の値が異なるからだと思います。

上のスクリプトでは、回転のdefaultのwに1を入れると、ワールドの軸に揃うようになりました。

Quaternion rot = default;
rot.w = 1f;
childCube.rotation = rot;

コメントを残す

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