Unityでゲームオブジェクトを回転させたい時はよくありますが、そんな時に軸を使って回転させたいといった事もあります。
Unityの軸と言うのが横軸のX軸、縦軸のY軸、奥行きのZ軸になります。
Y軸で回転と言うけど、どういうことだっけ?
とたまにわからなくなるので、軸の回転について見ていきたいと思います。
どういう回転をするかわからなくなった時の確認法
たまにY軸で回転と言った時パッと思い浮かばなくなる事があります。
Y軸の横に回転するのか?縦の回転するのか?何が何だか・・・・(‘_’)
で、わたくしの場合はいつも↓のような図を思い浮かべて、「ああ、こっちに回転か」と理解しています。
Unityでの軸を思い浮かべて、矢印の先から矢印が出ている根元((0, 0, 0)の座標)の方向(上の図の茶色い矢印方向)を見ていると仮定します。
X軸の回転であればX軸の矢印の先から(0, 0, 0)の方向を見ている状態での時計回りが正の回転になります。
他の軸でも同様になります。
こうすれば何軸でどっちに回転するかがわかります。
左手の親指(X軸)、人差し指(Y軸)、中指(Z軸)と見立てて指先から見て時計回り方向がその軸での正の回転の方向と覚えるとわかりやすいかも?
わたくし(他の人はどうなんだろ?)はどのように回転するか?というのが時々わからなくなるので、こういった感じで再認識しております。
回転のサンプルで理解を深める
軸の回転について分かったところで、Transform.RotateメソッドとTransform.RotateAroundを使ってサンプルを作り、さらに理解を深めてみましょう。
Transform.Rotateメソッドを使う
transformのRotateメソッドを使用するとVector3で与えた軸の回転をする事が出来ます。
またそのゲームオブジェクトのローカル軸(Space.Self)で回転させるのか?ワールド軸(Space.World)で回転させるかも指定が出来ます。
1 2 3 4 | void Update () { transform.Rotate (10f, 0f, 0f, Space.Self); } |
↑のようなスクリプトがゲームオブジェクトに設定されていると、Updateメソッドが呼び出される度にローカルのX軸で10度ずつ正の方向に回転します。
Rotateメソッドが実行されるとゲームオブジェクトが回転するので、Updateが呼び出される度に回転します。
X軸を10度にする、というわけではなく値が書き変わっていきます(10→20→30)。
ワールド軸とローカル軸についてはUnityのエディター上で表示切り替えが出来るので、ボタンを押して切り替えるとわかりやすいです。
↑のようにEthanを手動で回転させた後、LocalとGlobalボタンを押して切り替えます。
Rotateメソッドの第4引数で指定しているのがこのローカルかワールドかの指定になります。
ではEthanを回転させるサンプルを作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using UnityEngine; using System.Collections; using System; public class RotateXYZ : MonoBehaviour { public enum RotateAxis { XAxis, YAxis, ZAxis } public enum RotateMode { Local, World } // 回転軸をどこにするか public RotateAxis rotateAxis; // ローカルで回転するかワールドで回転するか public RotateMode rotateMode; // 回転値 private Space relativeTo; // 回転スピード public float rotateSpeed; // Update is called once per frame void Update () { // 選択した回転モードを設定 if (rotateMode == RotateMode.Local) { relativeTo = Space.Self; } else { relativeTo = Space.World; } // 回転処理 float rotation = Time.deltaTime * rotateSpeed; if (rotateAxis == RotateAxis.XAxis) { transform.Rotate (rotation, 0f, 0f, relativeTo); } else if (rotateAxis == RotateAxis.YAxis) { transform.Rotate (0f, rotation, 0f, relativeTo); } else if (rotateAxis == RotateAxis.ZAxis) { transform.Rotate (0f, 0f, rotation, relativeTo); } } } |
今回のサンプルは1つの軸で回転することとし、列挙型でその軸を選択出来るようにします。
またローカル回転なのかワールド回転なのかも指定出来るようにしています。
ローカル回転とワールド回転の違いがわかるように、空のゲームオブジェクトを2つ作成し、名前をYAxisLocal、YAxisWorldと変更します。
その子要素にスタンダードアセットのEthanのモデルを配置し、RotateXYZスクリプトを取り付けます。
階層としては
↑のようになり、名前も変更してあります。
ローカル軸のゲームオブジェクトは
↑のように設定し、
ワールド軸のゲームオブジェクトは
↑のように設定しました。
それぞれのEthanモデルはローカル軸とワールド軸のY軸を使って回転させる設定にしています。
それでは実行してみましょう。
ローカル軸で回転させる場合はRotationのYの値しか変わりませんが、ワールド軸で回転させる場合は他のRotationの値も変わっています。
このサンプルでは一つの軸で回転させてわかりやすくしてますが、当然X、Y、Z全ての値を変える事も出来ます。
Transform.RotateAround
TransformのRotateAroundメソッドを使用すると、ワールド座標の点を中心とした軸で回転をさせる事が出来ます。
例えば↑のように赤い点を指定し、向こう側から手前側の軸を指定すれば、紫のゲームオブジェクトを赤い点を中心にした軸で回転させる事が出来ます。
1 2 3 | transform.RotateAround (ワールド座標のVector3の点, 軸, 回転値); |
↑のように設定します。
RotateAroundを使ったサンプルを作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using UnityEngine; using System.Collections; using System; public class RotateAround : MonoBehaviour { public enum RotateAxis { XAxis, YAxis, ZAxis } // 回転軸をどこにするか public RotateAxis rotateAxis; // 回転スピード public float rotateSpeed; // 基準点 public Transform basePosition; // Update is called once per frame void Update () { Vector3 axis = Vector3.zero; if (rotateAxis == RotateAxis.XAxis) { axis = Vector3.right; } else if (rotateAxis == RotateAxis.YAxis) { axis = Vector3.up; } else if (rotateAxis == RotateAxis.ZAxis) { axis = Vector3.forward; } // 回転処理 float rotation = Time.deltaTime * rotateSpeed; transform.RotateAround (basePosition.position, axis, rotation); } } |
中心点は空のゲームオブジェクトを作成し、名前をBasePositionとし、RotateAroundスクリプトのインスペクタで設定します。
BasePositionゲームオブジェクトの位置を中心点にして、軸を指定して回転させます。
軸は点からの方向を指定します。
軸には、Vector3.right(X軸方向)、Vector3.up(Y軸方向)、Vector3.forward(Z軸方向)を指定しています。
今回の場合はワールド座標のX、Y、Z軸と同じ方向を指定していますが、もちろん別の方向を指定する事も出来ます。
↑のような階層と、RotateAroundスクリプトの設定をして回転させてみます。
BasePositionの位置を中心点、Z軸を軸に回転させる為、BasePositionの位置を移動させるとEthanの回転が変わってきます。
それでは確認してみましょう。
↑のようになりました。
中心点であるBasePositionの位置を変えるとEthanがそこを中心に回転しているのがわかりますね。