【Unity】LookRotationとは?特定方向に回転させるQuaternionを取得できるメソッド

LookRotationとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「LookRotationってどんなメソッド?」

「LookRotationを使うとどういう動きが作れるの?」

というお悩みの方に向けた内容となっています。

Unityでは、オブジェクトの回転処理を作る際に、LookRotationというメソッドが使われることがあります。

このLookRotationとは、オブジェクトを指定した方向に向かせるための回転をQuaternionで作成することができるメソッドです。

例えば、カメラの向きをプレイヤーのいる方向に回転させたい場合や、敵オブジェクトを指定した方向に向かせたいといった場合に、LookRotationが活用できます。

そこで、このページでは、LookRotationメソッドについて、どんな仕組みや機能なのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

LookRotationとは?

まずは、LookRotationがどういうメソッドなのかについて紹介していきます。

指定した方向に回転するQuaternionを作成できるメソッド

LookRotationは、オブジェクトを指定した方向へ向かせるための回転をQuaternionで作成することができるメソッドです。

例えば、移動するプレイヤーを配置して、そのプレイヤーがいる方向に常にカメラオブジェクトの向きを回転させたいなどといった場合に、LookRotationが使えます。

このLookRotationメソッド自体が回転処理を行う訳ではなく、その向きを向かせるためのQuaternionを作成することができるメソッドです。

そのため、実際にオブジェクトを回転させる場合は、オブジェクトの回転を定義している「transform.rotation」に作成されたQuaternionを入れてあげることでその方向を向くようになります。

Transform.LookAtメソッドとの違い

Unityには、LookRotationと同じように、指定した方向や座標の向きにオブジェクトを回転させるTransform.LookAtというメソッドがあります。

このLookAtメソッドは、LookRotationと違い、実際にオブジェクトを回転させる処理まで行うことになるので、指定したオブジェクトや座標の方向へ向かせるだけであれば、LookAtの方がコードが少なく済みます。

ただし、回転させる処理にカスタマイズを行いたい場合、例えば、

  • オブジェクトの向きを少しずつ回転させたい
  • オブジェクトのY軸以外の軸は回転させたくない

などのような処理を作る場合は、Quaternionで自由に調整できるので、LookRotationメソッドの方が便利だと思います。

LookRotationの使い方

ここからは、LookRotationメソッドの使い方について紹介していきます。

引数で向かせたい方向のベクトルを指定する

LookRotationを使う際は、以下のように引数で向かせたい方向を指定することで、Quaternionを作成することができます。

Quaternion.LookRotation(forward, upwards)

forward:オブジェクトを向かせたい方向(Vector3型)
upwards:上方向のベクトル(Vector3型)

第1引数に、そのオブジェクトを向かせたい方向Vector3型で指定してあげます。

ここで指定した方向に、オブジェクトの前方、つまりローカル座標のZ軸(青い矢印の向き)が向くためのQuaternionを作成してくれます。

なお、指定するのは座標ではなく方向になるので、特定のオブジェクトの方向を向かせるのであれば、お互いのオブジェクトの座標を引いてあげることで、その方向のベクトルを作成して指定することができます。

また、第2引数には、上方向のベクトルを指定することができ、省略した場合は「Vector3.up」が指定されることになります。

オブジェクトのZ軸の向きは第1引数で決まっているので、Y軸の向きを第2引数で決めていることになります。

LookRotationでカメラを徐々に回転させる処理

ここからは、実際にLookRotationメソッドを使った処理を作っていきます。

シーン内に3つの球体のオブジェクトを配置しておき、キーボードの「1」「2」「3」を押すと、カメラがその方向に向かって徐々に回転するような処理を作ります。

カメラオブジェクトに対して、以下のスクリプトをアタッチしておきます。

using UnityEngine;
using static UnityEngine.GraphicsBuffer;

public class Test : MonoBehaviour
{
    // オブジェクトをインスペクターから取得
    public GameObject obj1;
    public GameObject obj2;
    public GameObject obj3;

    Vector3 direction;  // カメラを向かせる方向を取得する変数
    bool isRotation = false; // 回転中かどうかを判定する変数
    Quaternion rotation;    // カメラの回転にセットするQuaternion

    void Update()
    {
        // それぞれのキー操作の条件分岐
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            direction = obj1.transform.position - this.transform.position;  // カメラを向かせる方向を計算
            isRotation = true;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            direction = obj2.transform.position - this.transform.position;
            isRotation = true;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            direction = obj3.transform.position - this.transform.position;
            isRotation = true;
        }

        // 回転している場合
        if (isRotation)
        {
            rotation = Quaternion.LookRotation(direction);  // カメラを向かせるQuaternionを作成
            transform.rotation = Quaternion.Slerp(this.transform.rotation, rotation, Time.deltaTime * 3);   // 徐々にカメラを回転させる処理

            // 回転が終わった場合
            if (this.transform.rotation == rotation)
            {
                isRotation = false;
            }
        }
    }
}

18行目から32行目の中で、それぞれのキーと連動させる形で、カメラを向かせたい方向を座標から計算して代入しています。

そして、37行目でLookRotationメソッドを使って、その方向にカメラが向いた場合のQuaternionを作成しています。

このQuaternionをそのままrotationの値に入れてしまうと、カメラはオブジェクトの方向を向きますが、パッと切り替わるような変化になってしまいます。

そこで、少しずつカメラが回転する処理を行えるように、38行目でSlerpメソッドを使っていて、その補間された値をrotationに入れるようにしています。

これでゲームを実行してみると、

数字のキーを押すと、そのオブジェクトの方向に徐々に回転しながら、カメラの向きを合わせていく処理が行われているのが分かります。

LookRotationでY軸のみ回転させる処理

今度は、以下のようにオブジェクトを配置して、縦長のオブジェクトが球体のオブジェクトの方向に向く処理を作り、さらにY軸だけを回転させるような調整を行ってみます。

まず、縦長のオブジェクトに以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class Test2 : MonoBehaviour
{
    public GameObject target;   // 球体のオブジェクトを取得する
    Quaternion rotation;    // オブジェクトの回転を取得する

    void Update()
    {
        rotation = Quaternion.LookRotation(target.transform.position - this.transform.position);    // 向きを回転するQuaternion
        transform.rotation = rotation;    // 回転する処理
    }
}

10行目でLookRotationメソッドを使って、ターゲットとなる座標への方向ベクトルを指定してQuaternionを作成しています。

そして、11行目でtransform.rotationにその値を入れてあげることで、オブジェクトが指定した方向を向くようになります。

球体のオブジェクトをキー操作できるようにしておけば、

上のように球体のオブジェクトの移動に合わせて、向きが変わるようになります。

次に、球体のオブジェクトが上や下に行っても、縦長のオブジェクトが上下を向かないような処理を作ってみます。

オブジェクトが上下を向かないようにするには、X軸とZ軸は回転させずに、LookRotationで取得した値のY軸だけ適用させれば良いことになります。

using UnityEngine;

public class Test2 : MonoBehaviour
{
    public GameObject target;
    Quaternion rotation;

    void Update()
    {
        rotation = Quaternion.LookRotation(target.transform.position - this.transform.position);
        transform.rotation = Quaternion.Euler(this.transform.rotation.x, rotation.eulerAngles.y, this.transform.rotation.z); 
    }
}

11行目でtransform.rotationに代入する際に、Eulerメソッドを使ってそれぞれの軸の角度を指定するようにしています。

そして、X軸とZ軸には元々のtransform.rotationで保持しているxとzの角度を指定し、Y軸にはeulerAnglesの変数を使って、指定方向へのY軸の角度を取得して設定しています。

これでもう一度ゲームを実行してみると、

ターゲットの方向を向きますが、上下は向かなくさせることができました。

まとめ

このページでは、Unityで使うことができるLookRotationについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

LookRotationは、指定した方向へ向かせるためのQuaternionを取得することができるメソッドで、引数で方向ベクトルを指定して使います。

例えば、カメラをプレイヤーのいる方向に向かせたり、特定のオブジェクトの向きに回転させたいような場合に、LookRotationが使われます。

また、Transform.LookAtメソッドと違い、Quaternionで回転処理を調整できるので、徐々に回転させたり、特定の軸だけを回転させるといったことができます。

最後までお読みいただきまして、ありがとうございました!

コメント