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引数を調節すると振り向く速さを変更できるので、用途に合わせて変えてみてください。