transform.Rotate()
それぞれの軸に対して、回転させる角度をオイラー角で指定します。
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
- xAngle … x軸を中心に回転させる角度
- yAngle … y軸を中心に回転させる角度
- zAngle … z軸を中心に回転させる角度
- relativeTo … オブジェクトに対してローカルに回転させるか(Space.Self)、シーンに対して相対的に回転させるか(Space.World)※省略可能
指定した角度にオブジェクトを回転させるのではなく、指定した角度がオブジェクトの現在の角度にプラスされます。
そのため、Update内で書けば同じ方向に同じ角度で回転し続けます。
floatで個別に角度を指定するのではなく、Vector3でまとめて指定することもできます。
public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);
- eulers … 回転させる角度
- relativeTo … オブジェクトに対してローカルに回転させるか(Space.Self)、シーンに対して相対的に回転させるか(Space.World)※省略可能
軸と角度を別々で指定することもできます。
public void Rotate(Vector3 axis, float angle, Space relativeTo = Space.Self);
- axis … 回転させる軸
- angle … 回転させる角度
- relativeTo … オブジェクトに対してローカルに回転させるか(Space.Self)、シーンに対して相対的に回転させるか(Space.World)※省略可能
例えば、次のコードは全て同じ動きになります。
transform.Rotate(0.0f, 0.0f, 1.0f);
transform.Rotate(new Vector3(0, 0, 1));
// Vector3.forward は Vector3(0, 0, 1) と同じ
transform.Rotate(Vector3.forward, 1.0f);
Space.SelfとSpace.Worldの違い
Space.SelfとSpace.Worldの動きの違いについて、実際に動かして確認してみます。
2つのCubeを作成します。
違いが分かるようにするため、Rotationの初期値をどちらも(0, 0, 90)にしています。
指定した方向・角度に回転し続けるスクリプトを作成します。
using UnityEngine;
public class RotateTest : MonoBehaviour
{
public GameObject obj_self, obj_world;
public float x_angle, y_angle, z_angle;
void Update()
{
obj_self.transform.Rotate(x_angle, y_angle, z_angle, Space.Self);
obj_world.transform.Rotate(x_angle, y_angle, z_angle, Space.World);
}
}
スクリプトを空のオブジェクトにアタッチし、Cubeオブジェクトと各軸の回転角度を設定します。
実行してみると、Space.SelfとSpace.Worldで回転方向が異なっていることが分かります。
Selfはオブジェクトが基準になるのに対しWorldはシーンが基準になるため、同じ角度を指定しても回転方向が変わります。
Sceneビューで変形ツールのギズモハンドル位置を切り替えると違いが分かりやすいです。
コメント