移動方向を向く
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です。
チャレンジ
中級ミツバチが直立したまま、飛んでいく方向を向くようにします。
LateUpdate()で、Vector3 direction = transform.position - lastPosition;とdirection.y = 0;を設定します。direction != Vector3.zeroの場合にのみ、transform.rotation = Quaternion.LookRotation(direction);を設定します。こうすると、止まっているミツバチは向きを保ちます。- 最後に、
transform.positionをlastPositionに保存します。
「プレイ」を押すと、ミツバチは飛んでいく花の方向を向きます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class FaceMotion : MonoBehaviour
{
Vector3 lastPosition;
void Start()
{
lastPosition = transform.position;
}
void LateUpdate()
{
// 前のフレームからミツバチが移動した方向を向く。
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド