2020/11/09
今回はUnityで「あるオブジェクトを別のオブジェクトの方向に向ける」方法に関するお話です。
単に向けるだけならTransform.LookAt()を使うと簡単にできますが、これだとX軸やZ軸まで回転してしまい、都合が悪い場合があります。
「Y軸だけ回転させる」やり方をいつも忘れてしまうため、備忘も兼ねて記事にしておきます。
別のオブジェクトへの方向の求め方
「あるオブジェクトから見た別のオブジェクトの方向」の求め方ですが、これは公式マニュアルに解説されています。
https://docs.unity3d.com/ja/current/Manual/DirectionDistanceFromOneObjectToAnother.html
要は「対象オブジェクトの位置 – 自分のオブジェクトの位置」の計算結果が方向になります。
これをQuaternion.LookRotation()に渡すと、そのベクトルに対するQuaternion型が得られます。
求めた向きにY軸のみ回転させる方法
求めたQuaternionをTransform.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引数を調節すると振り向く速さを変更できるので、用途に合わせて変えてみてください。






