Unity Term Book
Core & Architecture

Transform

Transform là Component bắt buộc trên mọi GameObject — quản lý bộ ba Vị trí, Góc quay và Tỷ lệ, đồng thời xác định vị trí object trong hierarchy của Scene.

Hãy tưởng tượng...

Transform giống như tờ khai địa chỉ và hồ sơ thân phận của một vật thể. Nó ghi rõ tôi đang ở đâu (Position), nhìn về hướng nào (Rotation), và to/nhỏ cỡ nào (Scale). Không có Transform, Unity không biết vẽ vật thể đó ở đâu trên màn hình.

Khái niệm chi tiết

Transform lưu dữ liệu theo hai hệ tọa độ: World Space (tuyệt đối từ gốc Scene) và Local Space (tương đối với Parent). transform.position là World; transform.localPosition là Local.

Góc quay được lưu nội bộ dưới dạng Quaternion — tránh “gimbal lock”. Bạn thường thao tác qua transform.eulerAngles (x, y, z độ). Để xoay dần dần, dùng Quaternion.Slerp() hoặc transform.Rotate().

Về hiệu năng: di chuyển vật thể có vật lý (Rigidbody) bằng cách gán trực tiếp transform.position sẽ bỏ qua Physics Engine, gây xuyên tường. Thay vào đó, dùng Rigidbody.MovePosition() hoặc AddForce().

World vs Local Space

📍

Position

Vector3(x, y, z)

🔄

Rotation

Quaternion / euler

⚖️

Scale

Vector3(1, 1, 1)

X → Phải
Y → Lên
Z → Phía trước
Hệ tọa độ tay phải (Unity)

Hướng dẫn thực hành

1

Di chuyển bằng code

transform.Translate() hoặc gán transform.position = new Vector3(...)

2

Xoay mượt

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

3

Nội suy vị trí (Lerp)

Vector3.Lerp(from, to, t) hoặc Vector3.MoveTowards()

4

Nhìn về phía mục tiêu

transform.LookAt(target) hoặc dùng Quaternion.LookRotation()

Trình mô phỏng tương tác

Kéo các thanh trượt để thay đổi Position, Rotation và Scale — quan sát trực tiếp trên canvas.

0.0
0.0
1.0

Inspector

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

🟢 Mũi tên xanh = Forward

🔴 Mũi tên đỏ = Right

🟡 Chấm vàng = gốc tọa độ (0,0,0)

Ví dụ Code

Cơ bản
using UnityEngine;

public class TransformBasics : MonoBehaviour
{
  [SerializeField] private float moveSpeed   = 5f;
  [SerializeField] private float rotateSpeed = 90f;  // độ/giây

  void Start()
  {
      // Đặt vị trí World Space tuyệt đối
      transform.position = new Vector3(0f, 1f, 0f);

      // Xoay về góc 45° trục Y
      transform.eulerAngles = new Vector3(0f, 45f, 0f);

      transform.localScale = Vector3.one; // (1,1,1) = kích thước gốc
  }

  void Update()
  {
      // Dịch chuyển về phía trước — nhân Time.deltaTime để độc lập FPS
      transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

      // Xoay liên tục quanh trục Y
      transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime);
  }
}

Ví dụ Code

Nâng cao
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;

      // Di chuyển mượt về phía target, không overshoot
      transform.position = Vector3.MoveTowards(
          transform.position,
          target.position,
          followSpeed * Time.deltaTime
      );

      // Xoay mượt nhìn về target bằng 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
          );
      }

      // Chuyển World Position → Local Space của object này
      Vector3 localPos = transform.InverseTransformPoint(target.position);
      // localPos.x > 0: target đang ở bên phải
  }
}

📌 Ghi nhớ nhanh

  • Transform bắt buộc, không thể xóa khỏi bất kỳ GameObject nào
  • .position = World, .localPosition = Local
  • Rotation lưu Quaternion, thao tác qua .eulerAngles
  • Luôn × Time.deltaTime để di chuyển độc lập FPS

⚠️ Lỗi thường gặp

  • ❌ Quên nhân Time.deltaTime

    120 FPS sẽ di chuyển nhanh gấp đôi 60 FPS

    ✅ Luôn × Time.deltaTime trong Update()

  • ❌ Dùng transform.position cho vật thể có Rigidbody

    Bỏ qua vật lý, gây xuyên tường và collision sai

    ✅ Dùng Rigidbody.MovePosition() hoặc AddForce()