滑らかに回転する
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 43/63。
transform.rotationを新しい回転に直接設定すると、オブジェクトは1フレームで回転します。Quaternion.RotateTowards(current, goal, maxDegrees)は、currentからgoalの方向へ最大maxDegreesだけ回転した値を返し、目標を通り越すことはありません。ステップにturnSpeed * Time.deltaTimeを使うと、オブジェクトは一定の速度で回転し、位置に対するMoveTowardsと同様、目標地点で正確に停止します。このヒマワリは毎秒30度で太陽を追います。
public Transform sun;
public float turnSpeed = 30f;
void Update()
{
Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}90度離れた太陽を追うには、ヒマワリは3秒かかり、1秒ごとに30度回転します。最短方向に回転し、目標は毎フレーム再計算されるため、動いている太陽も追いかけます。
Quaternion.Slerp(a, b, t)は、点に対するVector3.Lerpと同様に、aからbまでの回転のうち、割合tだけ進んだ回転です。Update()内でSlerp(transform.rotation, goal, 5f * Time.deltaTime)と書くと、各フレームで残りの角度の一部だけ回転します。最初は速く、目標に近づくほどだんだん遅くなり、一定の速度にはならず、目標に完全に到達することもありません。このような滑らかな動きは、カメラや頭を回転させる場合に適しています。大砲が毎秒60度回転する場合のように、回転速度がゲームのルールで決まっているときは、RotateTowardsを使いましょう。
チャレンジ
中級フクロウは、指し示した方向を見るように向きを変えます。各矢印キーで向く方向が変わります。上は +z、右は +x、下は -z、左は -x です。キーを押すと、その方向に向かって毎秒 turnSpeed (180) 度の一定速度で回転を始め、キーを離した後も回転を続け、新しい方向にぴったり向いて止まります。
Play を押し、矢印キーを押してから、Check を押してください。
自分で試してみよう
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// 上、右、下、左:turnSpeed の速度(度/秒)で、それぞれ +z、+x、-z、-x の方向を向くように回転する。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。