ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】オブジェクトのY軸のみをあるオブジェクトの方向に回転させる方法

time 2019/06/08

今回はUnityで「あるオブジェクトを別のオブジェクトの方向に向ける」方法に関するお話です。
単に向けるだけならTransform.LookAt()を使うと簡単にできますが、これだとX軸やZ軸まで回転してしまい、都合が悪い場合があります。
「Y軸だけ回転させる」やり方をいつも忘れてしまうため、備忘も兼ねて記事にしておきます。

別のオブジェクトへの方向の求め方

「あるオブジェクトから見た別のオブジェクトの方向」の求め方ですが、これは公式マニュアルに解説されています。
https://docs.unity3d.com/ja/current/Manual/DirectionDistanceFromOneObjectToAnother.html

要は「対象オブジェクトの位置 – 自分のオブジェクトの位置」の計算結果が方向になります。
これをQuaternion.LookRotation()に渡すと、そのベクトルに対するQuaternion型が得られます。

求めた向きにY軸のみ回転させる方法

求めたQuaternionTransform.rotationに代入するわけですが、そのままだとX軸とZ軸にも回転してしまいます。
これを防ぐため、LookRotation()に渡すベクトルのY軸を0にしましょう。
また、Quaternion.Lerp()を組み合わせると、より自然な感じで振り向かせることができます。transform.rotationに代入する際に呼び出せばOKです。

using UnityEngine;

public class RotationTest : MonoBehaviour
{
    private GameObject lookTarget;

    void Start()
    {
        lookTarget = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        lookTarget.transform.position = new Vector3(0, 2f, 4.5f);
    }

    void Update()
    {
        if (lookTarget) {
            var direction = lookTarget.transform.position - transform.position;
            direction.y = 0;

            var lookRotation = Quaternion.LookRotation(direction, Vector3.up);
            transform.rotation = Quaternion.Lerp(transform.rotation, lookRotation, 0.1f);
        }
    }
}

テスト用にStart()内でSphereオブジェクトを生成し、それを振り向く対象としました。テスト用なので位置は適当です。
実行して動かすと↓のような感じになります。高低差があってもX軸に回転しないのがポイントです。

Lerp()の第3引数を調節すると振り向く速さを変更できるので、用途に合わせて変えてみてください。

down

コメントする