Menu
CoddyTech

移動方向を向く

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 44/71。

transform.LookAtには、見る対象となる点が必要です。手元にあるのは点ではなく、速度や風、何かが動いた方向などであることもよくあります。Quaternion.LookRotation(direction)は、オブジェクトの上方向をワールドの上方向に保ちながら、前方(青いz軸の矢印)がその方向を向く回転を返します。空中に放たれた矢は、速度が変化するため、最初は上を向き、落下するにつれて傾いていきます。

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (rb.linearVelocity != Vector3.zero)
    {
        transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
    }
}

重要なのは長さではなく方向です。(1, 0, 2)と(3, 0, 6)は同じ回転になります。ゼロベクトルには方向がないため、LookRotation(Vector3.zero)はLook rotation viewing vector is zeroをログに出力し、Quaternion.identityを返します。これにより、オブジェクトは+zの方向を向きます。矢が最初に確認しているのはそのためです。停止すると、その時点で向いていた方向を保ちます。LookAt(target.position)は、LookRotation(target.position - transform.position)と同じ回転を返します。

方向の上下成分に応じて、前方も上または下に傾きます。坂を上る歩行者のように、常に直立させておきたいものでは、まず方向のyを0に設定します。そうすると、オブジェクトはy軸周りにだけ回転します。2つ目の引数LookRotation(direction, Vector3.up)は、どちらを上にするかを指定します。これを指定しない場合の既定値はVector3.upです。

challenge icon

チャレンジ

中級

ミツバチが直立したまま、飛んでいく方向を向くようにします。

  1. LateUpdate()で、Vector3 direction = transform.position - lastPosition;とdirection.y = 0;を設定します。
  2. direction != Vector3.zeroの場合にのみ、transform.rotation = Quaternion.LookRotation(direction);を設定します。こうすると、止まっているミツバチは向きを保ちます。
  3. 最後に、transform.positionをlastPositionに保存します。

「プレイ」を押すと、ミツバチは飛んでいく花の方向を向きます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

    void Start()
    {
        lastPosition = transform.position;
    }

    void LateUpdate()
    {
        // 前のフレームからミツバチが移動した方向を向く。
    }
}

物理演算とゲームプレイのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド