対象物(ターゲット)の方向を向く(3D)

2023年3月30日

他のオブジェクトを見つめたり、迫って行くときにその方向を向きたい場合があります
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

対象物を向くのは同じですが、その方向に徐々に向けることができます
Quaternion.Slerpメソッドを使用して、現在の回転から目標の回転に向けて少しずつ回転させることで、スムーズな回転を実現しています。また、回転速度を調整するためのrotateSpeed変数を用意しています。この変数の値を大きくすると回転速度が速くなり、小さくすると回転速度が遅くなります。適切な値を設定して、オブジェクトをスムーズに回転させるようにしてください。

コード

using UnityEngine;

public class WatchTargetSlerp : MonoBehaviour
{
    // 注視する対象のTransform
    [SerializeField]
    Transform targetTran;

    // 回転速度
    [SerializeField]
    float rotationSpeed;

    void Update()
    {
        // ターゲットの方向ベクトルを取得
        Vector3 direction = target.position - transform.position;
        // 方向ベクトルから回転クォータニオンを求める
        Quaternion targetRotation = Quaternion.LookRotation(direction, Vector3.up);
        // 現在の回転から目標の回転に向けて少しずつ回転する
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
    }
}

実行結果

Unity

Posted by hidepon