UnityのTransform

(2017-03-07)

https://docs.unity3d.com/jp/current/ScriptReference/Transform.html

オブジェクトの位置、スケール、回転を保持する。親子関係を持つ。

Position

positionがワールド空間の、 localPosition が親から見た相対的なローカル空間の位置。localPositionの1unitはscaleに依存する。

transform.position = new Vector3(0, 0, 0);
transform.localPosition = new Vector3(0, 0, 0);

徐々に移動するにはTranslate()を使う。 最後の引数はデフォルトでSpace.Selfになっていて、Space.Worldを指定するとワールド座標を基準にする。

Time.deltaTimeは最後のフレームを完了するのにかかった秒数。 なのでフレームレートにかかわらず同じ速度で移動させることができる。

transform.Translate(0, Time.deltaTime, 0, Space.World);
transform.Translate(Vector3.up * Time.deltaTime, Space.World); // 軸に沿って移動
transform.Translate(Time.deltaTime, 0, 0, Camera.main.transform); // 最後の引数のローカル座標を基準にする
transform.Translate(Time.deltaTime, 0, 0, Camera.main.transform);

Scale

localScale はローカル空間のスケール。ワールド空間のScaleはない。

transform.localScale = new Vector3(0.1f, 1f, 1f);

Rotation

ワールド空間の rotationと ローカル空間の localRoation

UnityはQuarternion(四元数)で回転を持っている。 実際はQuarternionそのものを自分で計算することはなく、 Quaternion.LookRotation()Quaternion.Euler()などを使う。

Vector3 relativePos;
transform.rotation = Quaternion.LookRotation(relativePos); // そのPointを向くように回転
transform.localRotation = Quaternion.Euler(0, 30, 0);

Transformを向くように回転する場合は LookAt()を使う。

Transform target;
transform.LookAt(target);

徐々に回転させるにはRotate()を使う。 最後の引数はデフォルトでSpace.Selfで、Space.Worldを指定すると回転の軸がワールドの軸になる。指定するのは角度。

transform.Rotate(0, Time.deltaTime, 0, Space.World);
transform.Rotate(Vector3.up, Time.deltaTime, Space.World);

ワールド座標のあるPointを中心として回転させる場合は RotateAround()を使う。

transform.RotateAround(Vector3.zero, Vector3.up, 20 * Time.deltaTime);

parent

親を指定する。

var fuga = GameObject.CreatePrimitive (PrimitiveType.Cube);
fuga.transform.parent = hoge.transform;
fuga.transform.parent = null; // detach

Find

子の名前で検索する。 FindChildもあるけどドキュメントに書いてないので使わない方がよさそう。

var child = transform.Find("hoge/fuga")
if(child != null){
    child.gameObject
}