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)
Hướng dẫn thực hành
Di chuyển bằng code
transform.Translate() hoặc gán transform.position = new Vector3(...)
Xoay mượt
transform.Rotate(Vector3.up * speed * Time.deltaTime)
Nội suy vị trí (Lerp)
Vector3.Lerp(from, to, t) hoặc Vector3.MoveTowards()
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.
Inspector
🟢 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ảnusing 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 caousing 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()