こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「RotateTowardsメソッドについて知りたい!」
「RotateTowardsでどんなことができるの?」
というお悩みの方に向けた内容となっています。
Unityでは、RotateTowardsメソッドを使うことで、オブジェクトの回転を少しずつ行うことで滑らかな回転処理を作ることができます。
このRotateTowardsとは、現在のQuaternionと目標とするQuaternionを指定することで、フレーム毎に少しずつその目標に近づけたQuaternionを返してくれるメソッドです。
また、他にもUnityでは滑らかな処理を行うメソッドがありますが、RotateTowardsは回転角度を値で指定することができるという特徴があります。
そこで、このページでは、UnityのRotateTowardsメソッドについて、どんなメソッドなのか、また使い方までをまとめていきます。
RotateTowardsとは?
まずは、RotateTowardsメソッドがどんなメソッドなのかについて紹介していきます。
目標となる回転に徐々に近づけていくメソッド
RotateTowardsメソッドは、Quaternion構造体で定義されているメソッドで、現在の回転値と目標とする回転値を指定することで、その目標に到着するまで、徐々に近づく回転値をQuaternionで返してくれるメソッドです。
例えば、オブジェクトなどを回転させる際に、目標とする回転値でそのまま設定してしまうと、以下のように急に向きが変わることになってしまいます。

そこで、RotateTowardsメソッドを使って、フレーム毎に少しずつ目標に近づけた回転値を使うことで、オブジェクトを滑らかに回転させることができるようになります。

フレーム毎に回転させる角度を指定できる
Unityには、同じように滑らかに回転処理を行えるメソッドがありますが、RotateTowardsメソッドの特徴として、フレーム毎に回転させる角度を指定することができます。
例えば、滑らかな回転処理を行う際に、Quaternion.Slerpメソッドがよく使われます。
このSlerpメソッドは、球面線形補間という処理を行うメソッドで、始点と終点を繋ぐ球面上の線があると想定し、その線の間の補間値を使って滑らかな回転処理を行います。

このSlerpメソッドを使う場合は、球面の線上における位置(割合)を指定することで、フレーム毎にその値が返ってくるという処理になっています。

一方で、RotateTowardsメソッドの場合は、同じように目標となる回転に近づけていきますが、回転させる角度を指定することで、フレーム毎にその指定した角度分で回転が行われていくことになります。

そのため、RotateTowardsとSlerpは、同じように滑らかな回転処理を行いますが、少し挙動が異なることになります。
RotateTowardsの使い方
ここからは、RotateTowardsメソッドの使い方について紹介していきます。
引数で現在の回転と目標の回転を設定する
RotateTowardsを使う際は、以下のように引数で現在の回転、目標となる回転、そしてフレーム毎に回転させたい角度を指定していきます。
Quaternion.RotateTowards(from, to, maxDegreesDelta);
from:現在の回転の値(Quaternion型)
to:目標の回転の値(Quaternion型)
maxDegreesDelta:最大となる回転角度(float型)
第1引数に、現在の回転をQuaternion型で指定します。
現在の回転は、多くの場合でそのオブジェクトの「transform.rotation」を指定することで、フレーム毎に値が更新されていくことになります。
第2引数に、目標とする回転をQuaternion型で指定します。
そして、第3引数に最大となる回転角度をfloat型で指定します。
フレーム毎にこの角度分の回転が行われますが、目標の回転に近づいた場合は、その角度以下の回転になることがあります。
なお、RotateTowardsメソッドは、Vector3型でも定義されており、その場合は、現在のベクトルと目標とするベクトルをVector3型で指定することで、ベクトルの回転処理が行われます。
オブジェクトの回転処理を作る
ここでは、実際に以下のキューブオブジェクトを回転させる処理として、RotateTowardsメソッドを使ってみます。

このオブジェクトに以下のスクリプトをアタッチしてみます。
using UnityEngine;
public class Test : MonoBehaviour
{
float angle = 0.1f; // 回転させる角度
Quaternion target; // 目標となるQuaternionの変数
void Start()
{
target = Quaternion.AngleAxis(90, Vector3.up); // 目標の回転値を作成
}
void Update()
{
transform.rotation = Quaternion.RotateTowards(transform.rotation, target, angle); // 回転処理を行う
}
}
10行目で目標となる回転値を、AngleAxisメソッドを使って作成しています。
そして、15行目でtransform.rotationに、RotateTowardsメソッドの値を代入しています。
引数で現在の回転に「transform.rotation」を入れて、目標の回転に先ほど作成した値をセットします。
また、今回は、最大の回転角度を0.1度に直接指定しているので、呼び出されるたびに0.1度回転される処理が行われます。
実際にゲームを実行してみると、

上記のように少しずつ目標となる回転に向かい、目標の回転に到達したら停止されるようになりました。
まとめ
このページでは、UnityのRotateTowardsメソッドについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?
RotateTowardsメソッドは、目標の回転となるまで、指定された角度で徐々に回転されたQuaternionを取得することができるメソッドです。
このRotateTowardsで取得した値を、transform.rotationに入れてあげることで、オブジェクトの回転処理を滑らかに行うことができます。
Unityで滑らかな処理を行えるメソッドはいくつかありますが、RotateTowardsは回転角度を指定して値を取得できるのが特徴です。
最後までお読みいただきまして、ありがとうございました!
コメント