滑らかに回転する
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 45/71。
transform.rotationを新しい回転に直接設定すると、オブジェクトは1フレームで回転します。Quaternion.RotateTowards(current, goal, maxDegrees)は、currentをgoalに向けて最大maxDegreesだけ回転させた値を返し、目標を通り越すことはありません。ステップにturnSpeed * Time.deltaTimeを使うと、オブジェクトは一定の速度で回転し、位置に対するMoveTowardsと同様に、目標位置でぴったり止まります。このヒマワリは、1秒あたり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)と書くと、毎フレーム、残りの角度の一部だけ回転します。最初は速く、目標に近づくにつれて徐々に遅くなり、一定の速度にはならず、目標に完全に到達することもありません。このような滑らかな動きは、カメラや頭の回転に適しています。大砲が1秒あたり60度回転する場合のように、ゲーム内で回転速度が決められているときは、RotateTowardsを使いましょう。
チャレンジ
中級フクロウが各矢印の指す方向へ滑らかに向きを変えるようにしましょう。
Quaternion goal;を追加し、Start()でtransform.rotationに設定します。- 各矢印キーの
Input.GetKeyDownでgoalを設定します。例:goal = Quaternion.LookRotation(Vector3.right);:上 +z、右 +x、下 -z、左 -x。 - 毎フレーム、
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);を設定します。
「プレイ」を押して、矢印キーを押します。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// 上、右、下、左:turnSpeed 度/秒の速さで、それぞれ +z、+x、-z、-x の方向を向くように回転する。
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド