この記事はUnityのコンポーネントのTransformについて解説しています。
- <Transformとは>
- <Transformのインスペクター>
- <Transformのスクリプトの使い方>
- childCount
- eulerAngles
- forward
- hasChanged
- hierarchyCapacity
- hierarchyCount
- localEulerAngles
- localPosition
- localRotation
- localScale
- localToWorldMatrix
- lossyScale
- parent
- position
- right
- root
- rotation
- up
- worldToLocalMatrix
- DetachChildren
- Find
- GetChild
- GetSiblingIndex
- InverseTransformDirection
- InverseTransformPoint
- InverseTransformVector
- IsChildOf
- LookAt
- Rotate
- RotateAround
- SetAsFirstSibling
- SetAsLastSibling
- SetParent
- SetPositionAndRotation
- SetSiblingIndex
- TransformDirection
- TransformPoint
- TransformVector
- Translate
<Transformとは>
ゲームオブジェクトの位置、回転、大きさを表すクラスです。
ゲームオブジェクトを作成するとデフォルトでついてきます。取ることはできません。ゲームオブジェクトには必ずこのTransformかこれを継承したコンポーネントがつきます。
また、このコンポーネントはMonoBehaviourを継承していれば変数としてtransformという名前で保持しています。
<Transformのインスペクター>
ローカルとはついてませんが、全てローカルでの値になっているので注意が必要です。
ローカルが何かわからない方は↓の記事を参考にしてみてください。
・Position・・・このゲームオブジェクトのローカルでの位置を表します。
・Rotation・・・このゲームオブジェクトのローカルでのオイラー角での回転を表します。(スクリプト上ではクォータニオンなので注意が必要です)
・Scale・・・このゲームオブジェクトのローカルでの大きさを表します。
インスペクター上ではどのパラメータもVector3型なのですが、Rotationはスクリプトで扱う際にはQuaternion型になります。
Vector3とQuaternionの解説は↓の記事で行っていますので、使う際には参考にしてみてください。
<Transformのスクリプトの使い方>
名前空間 | UnityEngine |
型 | class |
継承 | Component |
childCount
このゲームオブジェクトについている子の数です。
孫の数は含みません。読み取り専用です。
型 int型
○ 使い方
子の数を取得したい時に使います。
if(transform.childCount > 0) { Debug.Log("子供がいる"); }
eulerAngles
このオブジェクトの姿勢をオイラー角で表したものです。
型 Vector3型
○ 使い方
オブジェクトの姿勢を変える時や、現在の姿勢の数値を知りたい時などに使います。
transform.eulerAngles = new Vector3(1.1f,1.1f,1.1f); //姿勢のオイラー角を指定する
forward
ローカル座標でのZ座標がプラスである方向をワールド座標であわらしたベクトルです。
ちなみに、backは無いので後ろ方向を求めたかったらtransform.forward * -1すれば求められます。
読み取り専用なように見えますが、変更することが可能です。変更した場合、オブジェクトの向きが変わります。
型 Vector3型
○ 使い方
現在のオブジェクトの正面方向を取得したい場合や、正面方向の向きを指定したい場合に使用します。
transform.forward = new Vector3(1.1f,1.1f,1.1f); //正面の方向を指定する(グローバル)
hasChanged
自分がfalseを指定してからTransformの値が変更されたかどうかの真偽です。
デフォルトでtrueなので、自分でfalseにしてあげる必要があります。
型 bool型
○ 使い方
オブジェクトの位置、姿勢、大きさが変更されたのかどうか検知したい時に使います。Start等でfalseにしてあげましょう。
if(transform.hasChanged) { Debug.Log("変更された"); transform.hasChanged = false; }
hierarchyCapacity
親子構造の数の容量です。
親だろうが、子だろうが、その階層全ての数をさします。
親と子の大量に作ったり消したりする場合、あらかじめ容量を調整しておくことでパフォーマンスを向上させることができます。何も指定していない場合、現在の総数になります。
型 int型
○ 使い方
例えば、大量のエフェクトを出して、消すみたいな事をする時に使います。1度でなく何度でも発生する場合、一々メモリを確保し直すのは大変なのでこれを使用します。
transform.hierarchyCapacity = 1; //予め用意しておく子の数を指定する
hierarchyCount
親子構造の数。親だろうが、子だろうが、その階層全ての数をさします。読み取り専用です。
型 int型
○ 使い方
階層全ての数を取得したい時に使います。childCountがあるのであまり使用どころはありませんが、出すオブジェクトの限界値取り決めて、限界値以上出ないようにする時など色々な使い方ができます。
if(transform.hierarchyCount > 0) { Debug.Log("自身も含むので絶対通る"); }
localEulerAngles
このオブジェクトの姿勢を親から見た相対的なオイラー角で表したものです。
型 Vector3型
○ 使い方
オブジェクトの姿勢を変える時や、現在の姿勢の数値をオイラー角で知りたい時などに使います。ローカル空間での数値になるので親オブジェクトの姿勢を加味したい場合などに有効です。
transform.localEulerAngles = new Vector3(1.1f,1.1f,1.1f); //姿勢のオイラー角を指定する(ローカル)
localPosition
このオブジェクトの位置を親から見た相対的な座標で表したものです。
型 Vector3型
○ 使い方
オブジェクトの位置を変える時や、現在の位置を知りたい時などに使います。ローカル空間での数値になるので親オブジェクトの位置を加味したい場合などに有効です。
transform.localPosition = new Vector3(1.1f,1.1f,1.1f); //移動したい位置を指定する(ローカル)
localRotation
このオブジェクトの姿勢を親から見た相対的な回転をQuaternionで表したものです。
型 Quaternion型
○ 使い方
オブジェクトの姿勢を変える時や、現在の姿勢の数値をクォータニオンで知りたい時などに使います。ローカル空間での数値になるので親オブジェクトの姿勢を加味したい場合などに有効です。
transform.localRotation = Quaternion.Euler(new Vector3(1.1f,1.1f,1.1f)); //姿勢を指定する(ローカル)
localScale
親から見た相対的な大きさです。
型 Vector3型
○ 使い方
オブジェクトの大きさを変える時や、現在の大きさの数値を知りたい時などに使います。ローカル空間での数値になるので親オブジェクトの大きさを加味したい場合などに有効です。
transform.localScale = new Vector3(1.1f,1.1f,1.1f); //大きさを指定する
localToWorldMatrix
ローカル座標をワールド座標に変換するのに使用する4×4の行列です。
読み取り専用です。この行列は自身から見たそのオブジェクトの行列なので自分自身の情報を知りたいなら親の行列が必要になります。
型 Matrix4x4型
○ 使い方
指定したローカル座標がワールド座標ではどの位置になるのかを取得するのに使います。変更後の位置情報ではなく変換行列が得られる為、計算による様々な表現ができるかもしません。(例えば変換行列をさらに回転させる行列を掛けてみたり、シェーダーに渡してみたりするなど)
//自身のワールド座標を取得する
Vector3 worldPos = transform.parent.localToWorldMatrix.MultiplyPoint(transform.localPosition);
lossyScale
オブジェクトのグローバルでの大きさです。
読み取り専用です。
型 Vector3型
○ 使い方
オブジェクトの大きさをグローバルな値で取得したい時に使用します。
Vector3 v = transform.lossyScale; //オブジェクトの現在の大きさを取得します(グローバル)
parent
自分自身の親の情報です。
この変数に新たな親をセットした場合、ワールド座標が維持された状態でその親にセットされます。型はGameObjectではなくTransformなので注意が必要です。
型 Transform型
○ 使い方
自分自身の親の情報が欲しい時や、自分自身の親を指定したい場合に使用します。
transform.parent = GameObject.Find("親にしたいオブジェクト").transform; //親を設定します
position
自分自身のグローバル座標です。
型 Vector3型
○ 使い方
自分自身の位置を指定したい場合や、今の位置を取得したい場合などに使用します。
transform.position = new Vector3(1.1f,1.1f,1.1f); //移動したい位置を指定します(グローバル)
right
ローカル座標でのX座標がプラスである方向をワールド座標であわらしたベクトルです。
ちなみに、leftは無いので左方向を求めたかったらtransform.right * -1すれば求められます。
読み取り専用なように見えますが、変更することが可能です。変更した場合、オブジェクトの向きが変わります。
型 Vector3型
○ 使い方
現在のオブジェクトの右方向を取得したい場合や、右方向の向きを指定したい場合に使用します。
transform.right = new Vector3(1.1f,1.1f,1.1f); //右の方向を指定する(グローバル)
root
このオブジェクトの親子関係の中で一番上にいる親を取得します。
読み取り専用です。また、自分自身が一番上の親だった場合、自分自身が返ってきます。
型 Transform型
○ 使い方
一番上の親を取得したい場合に使用します。階層をいじる挙動を行う時に役に立ちますが、デバッグ用にどのルートのオブジェクトがログを吐いたのかを特定するのにも便利です。
Transform t = transform.root; //一番上の親を取得します。
rotation
このオブジェクトの回転をQuaternionで表したものです。
ワールド空間での値です。
型 Quaternion型
○ 使い方
オブジェクトの姿勢を変える時や、現在の姿勢の数値をクォータニオンで知りたい時などに使います。
transform.rotation = Quaternion.Euler(new Vector3(1.1f,1.1f,1.1f)); //姿勢を指定する(グローバル)
up
ローカル座標でのY座標がプラスである方向をワールド座標であわらしたベクトルです。
ちなみに、downは無いので下方向を求めたかったらtransform.up * -1すれば求められます。
読み取り専用なように見えますが、変更することが可能です。変更した場合、オブジェクトの向きが変わります。
型 Vector3型
○ 使い方
現在のオブジェクトの上方向を取得したい場合や、上方向の向きを指定したい場合に使用します。
transform.up = new Vector3(1.1f,1.1f,1.1f); //上の方向を指定する(グローバル)
worldToLocalMatrix
ワールド座標をローカル座標に変換するのに使用する4×4の行列です。
読み取り専用です。この行列は自身から見た行列なので自分自身の情報を知りたいなら親の行列が必要になります。
型 Matrix4x4型
○ 使い方
指定したワールド座標がこのオブジェクトのローカル座標ではどの位置になるのかを取得するのに使います。変更後の位置情報ではなく変換行列が得られる為、計算による様々な表現ができるかもしません。(例えば変換行列をさらに回転させる行列を掛けてみたり、シェーダーに渡してみたりするなど)
//自身のローカル座標を取得する Vector3 localPos = transform.parent.worldToLocalMatrix.MultiplyPoint(transform.position);
DetachChildren
すべての子オブジェクトを親オブジェクトから切り離します。
なし
なし
○ 使い方
子をたくさん持っているオブジェクトを消したい時などに使用します。直接子を移動させる事の方が多いのであまり使い所はないかもしれません。
transform.DetachChildren(); //子オブジェクトを解放します
Find
1. 探したい子オブジェクトの名前 : string型
スラッシュで区切ることで更に深い階層を探すことができます。
例 transform.Find(“ko/mago/himago/yashago”);
一致したGameObject : GameObject型
一致するものがないとnullが返ってきます。
このオブジェクトの子オブジェクトの中から指定した名前と一致する子オブジェクトのTransformを返します。
無ければnullが返ってきます。
○ 使い方
名前で指定した子オブジェクトを取得したい時に使用します。少し重いので子オブジェクトを頻繁に使うのならキャッシュしておきましょう。
GameObject g = transform.Find("ko/mago/himago/yashago"); //指定の子オブジェクトを取得します。
GetChild
指定した番号の子の情報を取ってきます。
孫は含まないので注意してください。番号は0スタートです。その番号の子がいない場合はエラーが返ってくるので注意してください。
1. 子の番号 : int型
指定した番号の子情報 : Transform型
○ 使い方
子オブジェクトを番号指定で取得する事ができます。主な使い方はforループで順番に子オブジェクトに対して何かをしたい場合などです。
for(int i = 0; i < transform.childCount; ++i) { Transform t = transform.GetChild(i); //子オブジェクトを番号順に取得する }
GetSiblingIndex
このオブジェクトの同じ階層での番号を返します。
0スタートです。
これはヒエラルキー上での上からの番号と一致します。
なし
同じ階層での番号 : int型
○ 使い方
主に階層順序が重要になってくるUGUIで使用される事が多いです。自身の番号をみて、順序を入れ替えるなどの処理を行います。
int myIndex = transform.GetSiblingIndex(); //同じ階層内での自分自身の番号を取得します
InverseTransformDirection
ワールド座標で表されたベクトルをローカル座標に変換します。
位置ではなく方向を変換するものです。
スケールに関係なく元々の大きさで表されます。
1. ワールド座標でのベクトル : Vector3型
ローカル座標で表されたベクトル : Vector3型
○ 使い方
子オブジェクトをある方向に向かせたい時などに便利です。首の向きを指定したい時など色々な使い方があります。
Vector3 localForward = transform.InverseTransformDirection(transform.forward);
//ローカル座標での前なので絶対に結果は(0,0,1)になります。
InverseTransformPoint
ある地点のワールド座標を自身のローカル座標に変換します。
1. ワールド座標での位置 : Vector3型
指定したワールド座標を自身のローカル座標に変換した座標 : Vector3型
○ 使い方
あるオブジェクトを自身子オブジェクトにする時に前もって位置情報を確認したい場合などに使用します。
//指定したワールド座標を自身のローカル座標に変換します。 Vector3 localPos = transform.InverseTransformPoint(new Vector3(1.1f,1.1f,1.1f));
InverseTransformVector
ワールド座標で表されたベクトルをローカル座標に変換します。
位置ではなく方向を変換するものです。
スケールの影響を受けた値が返ってきます。
1. ワールド座標でのベクトル : Vector3型
ローカル座標で表されたベクトル : Vector3型
○ 使い方
スケールの影響を受ける為、方向+大きさを加味した計算に使用されます。方向と距離を同時に使用したい場合に使うといいかもしれません。
Vector3 localForward = transform.InverseTransformVector(transform.forward);
IsChildOf
自身が指定したオブジェクトの子に含まれるかどうかを返します。
1階層目の子だけではなく、更に深い階層の子も含まれます。つまり自身が指定したオブジェクトの孫でもひ孫でもtrueが返ってきます。
1. 調べたいゲームオブジェクト : Transform型
自身が指定したゲームオブジェクトの子オブジェクトかどうか : bool型
○ 使い方
親を調べたい時に使用します。
if(transform.IsChildOf(調べたいゲームオブジェクト.transform)) { Debug.Log("このオブジェクトは調べたいゲームオブジェクトの子だ"); }
LookAt
このオブジェクトを指定した方向へ向けます。
1. 向きたい目標 : Transform型
2. 目標のどの方向を上としてみるか : Vector3型 (デフォルト引数 Vector3.up)
自身のY軸のプラスの方向を引数2で指定した方向に向けるようになります。
なし
○ 使い方
オブジェクトの向きを指定した方向に向けたい時に使用します。首の向きなど向く角度に制限を持たせたい時などはこれではなくQuaternion.LookRotationを使うといいと思います。
Camera.main.transform.LookAt(transform.position,transform.up); //カメラを自分の方に向けます。
Rotate
このオブジェクトを指定したオイラー角で回転させます。
デフォルトでローカル基準で回転させます。
1. オイラー角 : Vector3型
2. ワールド基準かローカル基準か : Space型(デフォルト引数 Space.Self)
なし
○ 使い方
オブジェクトを回転させたい時に使用します。オイラー角なので直感的に回転する事ができます。瞬間的ではなく普通の動作のように回転させたい時はUpdate内でVector3にTime.deltaTimeをかければいいと思います。
public float speed = 100.0f; void Update() { transform.Rotate(Vector3.one * speed * Time.deltaTime); //斜めに回ります。 }
RotateAround
このオブジェクトを指定した2点を結ぶベクトルを基準にして回転させます。
左ネジの方向に回るようです。
1. 基準としたい軸の始点 : Vector3型
2. 基準としたい軸の終点 : Vector3型
3. 角度 : float型
なし
○ 使い方
回転軸を直感的に指定できる為、ある軸に対して回転させたい時に便利です。
public float speed = 100.0f; void Update() { //縦に回ります。 transform.RotateAround(transform.right, transform.right * -1, speed * Time.deltaTime); }
SetAsFirstSibling
このオブジェクトと同じ階層のオブジェクトの中での番号を0番目にします。
↑これを呼んだオブジェクトがその階層の0番目になります。
なし
なし
○ 使い方
主にUGUIで使用する事の多い関数です。階層の0番目になる為、World Camera以外のCanvasの中にあるUIを一番奥に表示したい時に使います。
transform.SetAsFirstSibling(); //自分が階層の0番目になります。
SetAsLastSibling
↑のSetAsFirstSiblingとは逆でこのオブジェクトと同じ階層のオブジェクトの中での番号を最後の番号にします。
なし
なし
○ 使い方
主にUGUIで使用する事の多い関数です。階層の一番最後になる為、World Camera以外のCanvasの中にあるUIを一番手前に表示したい時に使います。
transform.SetAsLastSibling(); //自分の階層を一番最後にします。
SetParent
このオブジェクトに親を設定します。
変数のparentに直接突っ込む場合との違いは第二引数をfalseに指定する場合です。何も指定しない場合はどちらも同じ意味です。
1. 設定する親 : Transform型
2. ワールド座標を保持するか : bool型 (デフォルト引数 true)
引数2でfalseを指定した場合、ローカル座標の値を保持したまま親を設定します。すなわち、新しい親の座標が昔の親と違う場合、このオブジェクトの位置が変わります。
なし
○ 使い方
親を変更する場合などに使用します。ちなみに、インスタンシェードした瞬間に親を設定したい場合はこれでは無くGameObject.Instantiateの第二引数に親のTransformを入れてあげた方がいいです。
transform.SetParent(親にしたいゲームオブジェクト.transform);
SetPositionAndRotation
オブジェクトの位置と回転を指定します。
これは変数のpositionとrotationを設定するのと同じです。利点としては1行に収められることです。
1. 新しい位置(ワールド座標) : Vector3型
2. 新しい回転(ワールド基準) : Quaternion型
なし
○ 使い方
オブジェクトの位置と回転を同時に指定したい場合に使用します。
// 自分自身の位置と姿勢を変更します。 transform.SetPositionAndRotation(new Vector3(1.1f,1.1f,1.1f), Quaternion.Euler( new Vector3(1.1f,1.1f,1.1f));
SetSiblingIndex
このオブジェクトと同じ階層のオブジェクトの中での番号を指定します。
1. 番号 : int型
なし
○ 使い方
主にUGUIで使用する事の多い関数です。階層の番号を指定できる為、World Camera以外のCanvasの中にあるUIを好きな表示順にする事ができます。UIの重なり方を動的にいじりたい時にもよく使われます。
transform.SetSiblingIndex(1); //自分自身を同階層の1番目にする
TransformDirection
このオブジェクトのローカル座標で表されたベクトルをワールド座標に変換します。
位置ではなく方向を変換するものです。スケールに関係なく引数で指定したそのままの大きさで表されます。
1. ローカル座標でのベクトル : Vector3型
ワールド座標で表されたベクトル : Vector3型
○ 使い方
ローカル座標からワールド座標を取得したい時などに使われます。位置では無く方向を表すものなので、方角が変わらなければどの位置にいても同じ値が返ってきます。
// このオブジェクトの前方の方角(ワールド座標)を取得します。これはスケールの影響を受けません。 Vector3 worldForward = transform.TransformDirection(transform.forward);
TransformPoint
ある地点の自身のローカル座標からワールド座標に変換します。
1. ローカル座標での位置 : Vector3型
ワールド座標での位置 : Vector3型
○ 使い方
ローカル座標からワールド座標を取得したい時に使います。似たようなローカルとワールド関連の関数がたくさんありますが、この関数が一番スタンダードに使用するので覚えておくといいと思います。
//ローカル座標からワールド座標を求めます。 Vector3 worldPos = transform.TransformPoint(new Vector3(1.1f,1.1f,1.1f));
TransformVector
ローカル座標で表されたベクトルをワールド座標に変換します。位置ではなく方向を変換するものです。スケールの影響を受けた値が返ってきます。
1. ローカル座標でのベクトル : Vector3型
ワールド座標で表されたベクトル : Vector3型
○ 使い方
ローカル座標からワールド座標を取得したい時などに使われます。位置では無く方向を表すものなので、方角が変わらなければどの位置にいても同じ値が返ってきます。スケールの影響を受ける為、物体の周りに何かを置く時などに便利です。
// このオブジェクトの前方の方角(ワールド座標)を取得します。これはスケールの影響を受けます。 Vector3 worldForward = transform.TransformDirection(transform.forward);
Translate
このオブジェクトを指定したベクトル分移動させます。ベクトルは方向と大きさなので、移動方向と移動速度を表現するのに便利です。
引数
1. 向かわせたいベクトル(Vector3)
2. ワールド基準かローカル基準か(Space)(デフォルト引数 Space.Self)
ワールド座標で表されたベクトル : Vector3型
○ 使い方
ベクトルで方向を指定できる為、オブジェクトを移動させたい場合などに便利です。コライダーがついているオブジェクトはこれでは無く、Rigidbodyを使いましょう。
public float speed = 10f; void Update() { //オブジェクトが前に進みます transform.Translate(transform.forward * speed * Time.deltaTime); }
変数や関数がよくわからない方は↓の記事を参考にしてみてください