TransformでGameObjectを移動する (4/4)
作成:2014-08-30 12:16
更新:2014-08-30 12:16
更新:2014-08-30 12:16
■rotationとQuaternionクラス
GameObjectの向き(角度)を扱うためにTransformに用意されているのは、「rotation」というプロパティです。これもpositionと同様に、値を取り出したり変更したりしてGameObjectの向きを操作することができます。
ただし! 注意したいのは、「このrotationの値は、Vector3ではない」という点です。これは、「Quaternion」というクラスのインスタンスが設定されています。
このQuaternionは、ゲームオブジェクトの回転角度を扱うために用意されている専用のクラスです。オブジェクトの向きをX, Y, Zの各軸の角度によって設定するというのは、実は意外と難しいのです。だって、3方向の角度を同時に変更することはできないでしょう? X軸に回転させると、もうY軸とZ軸の向きは変化しています。このため、3つの軸の角度をただ指定しただけでは、正しい方向を示せない場合があるんです。
そこで、Quaternionです。これは以下のようにしてインスタンスを作成します。
じゃあ、どうするのか。それぞれの値を指定してQuaternionインスタンスをnewするのは大変なので、実際の利用の際には「Eular」というメソッドを利用するのがいいでしょう。
リスト欄に、実際の利用例を挙げておきましょう。ここではnumの値を1ずつ増やしながら、その値を元にQuaternion.Eulerを呼び出しインスタンスを作成しています。実際にやってみるとわかりますが、Rotateメソッドで各方向の角度を均等に回転させていった場合と比べると、図形の回転の仕方が明らかに違っています。オブジェクト自身から見た角度を変更するのと、ワールド座標から換算した角度を設定していくのでは、このように動きがまったく異なるのです。
ただし! 注意したいのは、「このrotationの値は、Vector3ではない」という点です。これは、「Quaternion」というクラスのインスタンスが設定されています。
このQuaternionは、ゲームオブジェクトの回転角度を扱うために用意されている専用のクラスです。オブジェクトの向きをX, Y, Zの各軸の角度によって設定するというのは、実は意外と難しいのです。だって、3方向の角度を同時に変更することはできないでしょう? X軸に回転させると、もうY軸とZ軸の向きは変化しています。このため、3つの軸の角度をただ指定しただけでは、正しい方向を示せない場合があるんです。
そこで、Quaternionです。これは以下のようにしてインスタンスを作成します。
変数 = new Quaternion ( X値, Y値, Z値, W値 );
こんな形で角度を指定することができます。ただし! この4つの値は、ゲームオブジェクトのインスペクターにあるRotationの値ではない、という点を理解する必要があります。単純に3方向の角度を指定するものではないんですね。じゃあ、どうするのか。それぞれの値を指定してQuaternionインスタンスをnewするのは大変なので、実際の利用の際には「Eular」というメソッドを利用するのがいいでしょう。
変数 = Quaternion.Eular( X値, Y値, Z値 );
このように3軸の角度を指定することで、その方向を示すQuaternionインスタンスを作成します。この3つの引数は、インスペクターのRotationの値そのままでOKです。リスト欄に、実際の利用例を挙げておきましょう。ここではnumの値を1ずつ増やしながら、その値を元にQuaternion.Eulerを呼び出しインスタンスを作成しています。実際にやってみるとわかりますが、Rotateメソッドで各方向の角度を均等に回転させていった場合と比べると、図形の回転の仕方が明らかに違っています。オブジェクト自身から見た角度を変更するのと、ワールド座標から換算した角度を設定していくのでは、このように動きがまったく異なるのです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
using UnityEngine; using System.Collections; public class myscript : MonoBehaviour { private float num; // Use this for initialization void Start () { num = 1.0f; } // Update is called once per frame void Update () { Quaternion q = Quaternion.Euler(num, num, num); transform.rotation = q; num++; } }
※関連コンテンツ