UnityのTransformの使い方
UnityのTransformとは位置・回転・大きさを指定するコンポーネントだ。このTransformを操作する関数としてtransform、Vector3、translateなどの関数を用いることになる。
この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
if文の条件分岐
また、Unityの基礎知識や操作などがわからない場合は先に以下の記事を確認してほしい。
Unityの基礎まとめ
この記事ではtransformの使い方を紹介していく。
Transformの使い方目次
transformのコンポーネントについて移動
回転
大きさ
目次にもどる
Transformのコンポーネントについて
transformのコンポーネントは全てのゲームオブジェクトに最初からついており、取り外すことができず新たに追加することもできない。Positionが位置、Rotationが回転、Scaleが大きさを示している。ゲームオブジェクトのこれらの値をスクリプトによって受け取ったり、操作することが可能なので紹介していく。
目次にもどる
Transformの移動
以下のようにスクリプトのUpdateメソッドに書いて、ゲームオブジェクトのcube(何でも構わないが・・)にアタッチして再生しよう。斜め上方向にcubeが飛んでいくはずだ。Transform Transformrei = this.transform;と最初はなっている。
TransformreiというTransform型の変数を作成し、そこにthis.transformを代入。つまりcubeの位置、回転、大きさを格納している。
次にVector3 pos = myTransform.position;としている。Vector3(X、Y、Zの値を持ち位置や方向を表せる構造体)のposへTransformreiの値を代入している。直接Transformrei.position.x += 0.02f;といったことはできないので注意(position変数のアクセス修飾子の設定が原因である)。
続いてpos.x += 0.02fとしており、posのxの値を0.02加算している。数字の後にfをつけているのはVector3がfloat型の値を持つ構造体であるためだ。同じようにpos.y += 0.02f;、pos.z += 0.02f;としてyとzの値も加算している。
Transformrei.position = pos;として、加算後のposをTransformrei.positionに代入してやることでcubeのゲームオブジェクトのx、y、zの数値が増加する(構造体であるVector3に加算しただけではダメなので注意)。Updateメソッドによりこの処理が繰り返され、cubeが斜め上に移動していく。
translate関数は相対的な位置を指定して移動させることができる。cubeに以下のスクリプトをアタッチすればWASDで前後左右に移動が可能となる。
Input.GetKeyについてはキーの入力を受け取ることができる関数である。詳しくは以下の記事へ。
Inputの使用方法
Input.GetKeyによりキー入力された場合にifで条件分岐を行っている。
Wキーを押した際の前へ移動の分岐では中身はthis.transform.Translate(0.0f, 0.0f, 0.1f);となっている。
Translate(x, y, z);の構造であり、zの値が0.1fとなっている。よってcubeはz方向つまり前へ移動する。
他の分岐も同様の構造となっている。-の値を入力することで後ろや左への移動も行っている。
translate関数は例えば以下のようにx y zの値を入力した後、引数としてSpace.WorldやSpace.Selfの指定が可能。
引数にSpace.Worldを指定するとワールド座標での移動、引数にSpace.Selfを指定するとローカル座標での移動が可能。何も指定しなければローカル座標での移動となる。ワールド座標とローカル座標については以下の記事で紹介している。
ワールド座標とローカル座標
目次にもどる
Transformの回転
Transformrei.eulerAngles関数では指定した角度に回転が可能回転はQuaternion型として取得することも可能だが、初心者には理解が難しい。そこで理解しやすいVector3で取得して操作する方法を紹介していく。
以下のようにスクリプトのUpdateメソッドに書いて、ゲームオブジェクトのcube(何でも構わないが・・)にアタッチして再生しよう。Wキーを押すことでX軸を45度にできる。Sキーでy軸を45度にできる。Dキーでz軸を45度にできる。
移動の時と同様にTransform Transformrei = this.transform;としてcubeの位置、回転、大きさを格納。
次にVector3 kakudo = Transformrei.eulerAngles;としている。Vector3のkakudoへTransformreiの値を代入している。
続いてはif (Input.GetKey(KeyCode.W))でWキーを押した時の処理。中身はkakudo.x = 45;となっており、45という値をxに代入している。
SキーとDキーについても同様に記述している。
最後にkakudoをTransformrei.eulerAnglesに代入している。キーを押していた場合は45が代入され、xであればx軸上で45度に回転が行われる。
transform.Rotate関数では現在の角度に加算する形で回転が可能。Updateメソッドに以下のように記述しcubeにアタッチして再生しよう。Wキーを押すことでX軸を中心に回転できる。Sキーでy軸を中心に回転。Dキーでz軸を中心に回転する。
最初はif (Input.GetKey(KeyCode.W))とWキーを押した場合の条件分岐をしている。
中身はthis.transform.Rotate(2, 0, 0);となっており、cubeがX軸を中心に2度ずつ回転することになる(今の角度へ加算)。回転方向はX軸の矢印の始点から終点を見た場合に反時計周りである(-の値にすれば時計周りとなる)。
同様の記述でy軸回転とz軸回転もできるようにしている。
transform.Rotate関数は例えば以下のようにx y zの値を入力した後、引数としてSpace.WorldやSpace.Selfの指定が可能。
引数にSpace.Worldを指定するとワールド座標で回転、引数にSpace.Selfを指定するとローカル座標での回転が可能。何も指定しなければローカル座標での回転となる。
transform.RotateAround関数では指定されたゲームオブジェクトを中心に軸を決めて回転角度の分だけ回転させることができる。あらかじめ以下のようにCubeとSphereを作成してほしい。
Cubeの周りをSphereが回転するような処理を目指す。以下のようなスクリプトを書き、Sphereにアタッチしてみてほしい。
public GameObject cube;によりシリアル化を行っている。インスペクター欄でcubeの項目ができているので、cubeを選択してほしい。その状態で再生すれば、Cubeの周りをSphereが回転する。
回転の処理はtransform.RotateAround(cube.transform.position, Vector3.up, 1);の一文のみ。
RotateAround(中心の場所,軸の方向,回転角度)となっている。
cubeが中心となっているのはわかると思う。
Vector3.upは回転する軸を示している。upは上でありつまりY軸である。
回転角度は1となっており、1度ずつ回転していく。
つまりcubeのY軸を中心に1度ずつSphereが回転することになる。
transform.RotateAround関数はカメラの向き変更の記事でも使っており詳しく紹介している。様々な場面で使えるのでぜひ確認してみてほしい。
カメラ操作
目次にもどる
Transformの大きさ
以下のようにスクリプトのUpdateメソッドに書いて、ゲームオブジェクトのcube(何でも構わないが・・)にアタッチして再生しよう。Wキーを押すとX軸方向の大きさが2、Sキーを押すとY軸方向の大きさが3、Dキーを押すとZ軸方向の大きさが4となる。移動や回転の時と同様にTransform Transformrei = this.transform;としてcubeの位置、回転、大きさを格納。
次にVector3 ookisa = Transformrei.eulerAngles;としている。Vector3のkakudoへTransformreiの値を代入している。
先ほどからやっているようにキーによる条件分岐を行い、その中でVector3 ookisaのX、Y、Zに値を入力している。
Transformrei.localScale = ookisa;と代入してやることで、cubeのサイズが変更される。