Transform
Transform はすべての GameObject に必須の Component です。Position・Rotation・Scale を持ち、Scene Hierarchy 上での位置関係を定義します。World と Local、Quaternion、物理オブジェクトの正しい動かし方の基礎を学べます。
想像してみてください...
Transform はオブジェクトの住所カード兼 ID のようです。どこにいるか(Position)、どちらを向いているか(Rotation)、どれくらい大きいか(Scale)を記録します。Transform がなければ、Unity は画面上のどこに描画すべきか分かりません。
概念の詳細
Transform は 2 つの座標系でデータを保持します:World Space
(Scene 原点からの絶対座標)と Local Space(Parent からの相対座標)。
transform.position は World、transform.localPosition は Local です。
Rotation は内部的に Quaternion で保存され、ジンバルロックを避けます。
普段は transform.eulerAngles(x, y, z 度)経由で扱います。滑らかに回すなら
Quaternion.Slerp() や transform.Rotate() を使います。
パフォーマンス:物理オブジェクト(Rigidbody)を
transform.position の直接代入で動かすと Physics Engine をスキップし、壁をすり抜け得ます。
代わりに Rigidbody.MovePosition() や AddForce() を使ってください。
World vs Local Space
Position
Vector3(x, y, z)
Rotation
Quaternion / euler
Scale
Vector3(1, 1, 1)
ハンズオン手順
コードから移動する
transform.Translate()、または transform.position = new Vector3(...)
滑らかに回転する
transform.Rotate(Vector3.up * speed * Time.deltaTime)
位置を補間する(Lerp)
Vector3.Lerp(from, to, t) または Vector3.MoveTowards()
ターゲットを向く
transform.LookAt(target)、または Quaternion.LookRotation()
インタラクティブシミュレーター
スライダーで Position・Rotation・Scale を変え、キャンバスがリアルタイム更新されるのを確認しましょう。
Inspector
🟢 緑の矢印 = Forward
🔴 赤の矢印 = Right
🟡 黄色い点 = 原点 (0,0,0)
コード例
基本using UnityEngine;
public class TransformBasics : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5f;
[SerializeField] private float rotateSpeed = 90f; // degrees per second
void Start()
{
// Set absolute World Space position
transform.position = new Vector3(0f, 1f, 0f);
// Rotate 45° around the Y axis
transform.eulerAngles = new Vector3(0f, 45f, 0f);
transform.localScale = Vector3.one; // (1,1,1) = original size
}
void Update()
{
// Move forward — multiply by Time.deltaTime so speed is FPS-independent
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
// Spin continuously around Y
transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime);
}
}コード例
上級using UnityEngine;
public class TransformAdvanced : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private float followSpeed = 3f;
[SerializeField] private float rotateSpeed = 5f;
void Update()
{
if (target == null) return;
// Smoothly approach the target without overshooting
transform.position = Vector3.MoveTowards(
transform.position,
target.position,
followSpeed * Time.deltaTime
);
// Smoothly look at the target with Slerp
Vector3 dir = (target.position - transform.position).normalized;
if (dir != Vector3.zero)
{
Quaternion lookRot = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(
transform.rotation, lookRot,
rotateSpeed * Time.deltaTime
);
}
// Convert World Position → this object's Local Space
Vector3 localPos = transform.InverseTransformPoint(target.position);
// localPos.x > 0: the target is to the right
}
}📌 要点
- ▸Transform は必須——どの GameObject からも削除できない
- ▸
.position= World、.localPosition= Local - ▸Rotation は Quaternion;普段は
.eulerAnglesを編集 - ▸必ず ×
Time.deltaTimeで FPS 非依存にする
⚠️ よくあるミス
❌ Time.deltaTime を掛け忘れる
120 FPS だと 60 FPS の 2 倍速で動く
✅ Update() 内では常に × Time.deltaTime
❌ Rigidbody 付きオブジェクトで transform.position を使う
物理をスキップ——壁貫通や衝突不良
✅ Rigidbody.MovePosition() または AddForce() を使う