Unity Term Book
コアとアーキテクチャ

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)

X → 右
Y → 上
Z → 前方
右手座標系(Unity)

ハンズオン手順

1

コードから移動する

transform.Translate()、または transform.position = new Vector3(...)

2

滑らかに回転する

transform.Rotate(Vector3.up * speed * Time.deltaTime)

3

位置を補間する(Lerp)

Vector3.Lerp(from, to, t) または Vector3.MoveTowards()

4

ターゲットを向く

transform.LookAt(target)、または Quaternion.LookRotation()

インタラクティブシミュレーター

スライダーで Position・Rotation・Scale を変え、キャンバスがリアルタイム更新されるのを確認しましょう。

0.0
0.0
1.0

Inspector

Transform
Position (0, 0, 0)
Rotation (0, 0, 0)
Scale (1, 1, 1)

🟢 緑の矢印 = 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() を使う