対象物の方向を向く(3D)

2022年9月4日

他のオブジェクトを見つめたり、迫って行くときにその方向を向きたい場合があります
Unityでは、そのためのメソッドが用意されています。いくつかの方法があるのでみていきましょう

シーンの構成

LookAtSampleとしてプロジェクトを作成しましょう

ビデオから、プロジェクト名、シーンのゲームオブジェクト、コンポーネントを確認して、同じように構成しましょう

対象物を向くとは

対象物を向くとは、z軸がその方向を向くことを言います

LookAt

対象物のTransfromコンポーネントを引数に取ります。これをアタッチしているゲームオブジェクトは対象物のtransform.potisionの方向を向きます

オーバーロードとして引数にVector3型を取ることもできます

コード

using UnityEngine;

public class WatchLookAt : MonoBehaviour
{
    [SerializeField]
    Transform targetTran;

    void Update()
    {
        transform.LookAt(targetTran);
    }
}

実行結果

LookRotation

対象物の座標(transfrom.potision:Vector3型)を引数に取ります。これをアタッチしているゲームオブジェクトは対象物のtransform.potisionの方向を向きます

rotationに回転を代入しますが、クウォータニオン型(Quaternion)になります
インスペクターでの表示はVector3型になっていますが、内部ではクウォータニオン型で保持されています
回転は、回転順・向きによっては期待通りにならないことがあるため(ジンバルロック)、4元(x, y, z, w)を使って処理されます

コード

using UnityEngine;

public class WatchTargetLookRotation : MonoBehaviour
{
    [SerializeField]
    Transform targetTran;

    void Update()
    {
        transform.rotation = Quaternion.LookRotation(targetTran.position);
    }
}

実行結果

Slerp

対象物を向くのは同じですが、その方向に徐々に向けることができます
動きを補完する処理になります。引数に自身のrotationと対象のrotation、補間スピードを取ります

コード

using UnityEngine;

public class WatchTargetSlerp : MonoBehaviour
{
    [SerializeField]
    Transform targetTran;

    [SerializeField]
    float speed;

    void Update()
    {
        Quaternion quaternion = Quaternion.LookRotation(targetTran.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, quaternion, speed);
    }
}

実行結果

Unity

Posted by hidepon