移動方向を向く
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 42/63。
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が使われます。
チャレンジ
中級ミツバチは花から花へ飛びます。用意されているMoverスクリプトは、途中で上昇したり下降したりしながら直線的に飛び、各花で1秒間休みます。Moverはそのままにしておきます。ミツバチが飛ぶ方向を向くように、FaceMotionを書いてください。
- 上から見たとき、前のフレームから移動した方向を向きます。
- 姿勢を直立に保ちます。上昇中や下降中に、鼻先を上や下に向けません。
- 休んでいる間は、それまで向いていた方向を保ち、ログは何も出力されません。
コードはLateUpdate()に記述します。このフレームでは、すでにMoverがミツバチを移動させています。Playを押してから、Checkを押してください。
自分で試してみよう
using UnityEngine;
public class FaceMotion : MonoBehaviour
{
Vector3 lastPosition;
void Start()
{
lastPosition = transform.position;
}
void LateUpdate()
{
// 前のフレームからミツバチが移動した方向を向く。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。