Unity Term Book
Physics

Collider

Collider là hình dạng vô hình bao quanh GameObject — xác định ranh giới va chạm vật lý mà không cần hình học Mesh chính xác cho từng điểm tiếp xúc trong scene.

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

Collider giống như bong bóng bảo vệ quanh vật thể. Một nhân vật phức tạp với hàng nghìn đa giác không thể để game tính va chạm từng tam giác — quá chậm. Thay vào đó, Unity bao nhân vật bằng một hình đơn giản (hộp, cầu, viên nang) để tính toán. Đó chính là Collider. Bóng bảo vệ không nhìn thấy được, nhưng mọi va chạm đều "cảm nhận" qua nó.

Khái niệm chi tiết

Collider là Component định nghĩa hình dạng vật lý của GameObject trong Unity Physics. Nó tách biệt hoàn toàn khỏi Mesh Renderer — một object có thể có Collider mà không cần hình ảnh (vùng ẩn), hoặc có hình ảnh mà không cần Collider (vật trang trí). Unity hỗ trợ 4 loại Collider 3D chính: BoxCollider, SphereCollider, CapsuleCollider, và MeshCollider.

Về hiệu năng, thứ tự ưu tiên từ nhanh đến chậm là: Sphere → Box → Capsule → Mesh. MeshCollider sao chép đúng hình dạng Mesh nhưng rất tốn kém — chỉ dùng khi cần độ chính xác tuyệt đối cho địa hình hoặc vật thể tĩnh. Đối với nhân vật di chuyển, CapsuleCollider là lựa chọn tối ưu vì khớp với thân người và xử lý cầu thang mượt mà.

Collider có thể được đặt ở chế độ Trigger (bật isTrigger = true) để phát hiện va chạm mà không tạo phản ứng vật lý. Khi Collider không phải trigger, nó tạo phản lực vật lý thực sự. Nhiều Collider trên cùng một object hoặc object con được gọi là Compound Collider — kỹ thuật phổ biến để xấp xỉ hình dạng phức tạp mà không cần MeshCollider.

Từ Unity 6 trở đi, Physics Shapes 2DPhysics Material đều gắn trực tiếp vào Collider để kiểm soát ma sát và độ nảy tại từng bề mặt.

Các loại Collider

BoxCollider

Hộp chữ nhật. Nhanh, dùng cho tường, sàn, hộp.

SphereCollider

Hình cầu. Nhanh nhất, dùng cho đạn, trái cây, tảng đá tròn.

CapsuleCollider

Viên nang. Tối ưu cho nhân vật đứng thẳng.

MeshCollider

Khớp Mesh chính xác. Chậm nhất, chỉ dùng cho vật tĩnh.

Compound Collider

Kết hợp nhiều Collider đơn giản (Box + Sphere...) trên cùng object/object con để xấp xỉ hình dạng phức tạp — nhanh hơn MeshCollider nhưng vẫn chính xác hơn dùng 1 hình.

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

1

Chọn loại Collider phù hợp

Add Component → Physics → chọn Box/Sphere/Capsule/MeshCollider dựa vào hình dạng object.

2

Điều chỉnh kích thước trong Inspector

Nhấn "Edit Collider" (icon bút chì) để chỉnh trực quan, hoặc thay đổi Center, Size, Radius trong Inspector.

3

Kiểm tra màu Gizmo

Collider hiển thị màu xanh lá khi không va chạm, màu đỏ khi đang chạm. Bật Gizmo trong Scene View để thấy.

4

Thêm Physics Material (tuỳ chọn)

Create → Physics Material → gán vào slot Material của Collider để điều chỉnh ma sát và độ nảy.

5

Đặt Layer cho Collision Matrix

Project Settings → Physics → Layer Collision Matrix: kiểm soát layer nào va chạm với layer nào, tối ưu hiệu năng.

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

Chọn loại Collider và thả hình dạng để xem cách chúng va chạm với sàn và nhau.

SHAPE:
Chọn hình dạng và nhấn "Thả xuống"

Ví dụ Code

Cơ bản

Truy cập và chỉnh sửa Collider qua script tại runtime.

using UnityEngine;

public class ColliderExample : MonoBehaviour
{
  void Start()
  {
      // Lấy Collider đang gắn trên object này
      Collider col = GetComponent<Collider>();

      // Kiểm tra bounds (hộp bao quanh) của Collider
      Debug.Log("Kích thước: " + col.bounds.size);
      Debug.Log("Tâm: " + col.bounds.center);

      // Bật/tắt Collider
      col.enabled = false; // Tạm vô hiệu hoá va chạm
      col.enabled = true;

      // Truy cập BoxCollider cụ thể để đổi kích thước
      BoxCollider box = GetComponent<BoxCollider>();
      if (box != null)
          box.size = new Vector3(2f, 1f, 2f);
  }
}

Ví dụ Code

Nâng cao

Tạo vùng phát hiện bằng OverlapBox — không cần Rigidbody.

using UnityEngine;

// Phát hiện tất cả vật thể trong vùng hộp mà không cần va chạm vật lý
public class AreaDetector : MonoBehaviour
{
  public Vector3 detectionSize = new Vector3(5f, 5f, 5f);
  public LayerMask targetLayer;

  void Update()
  {
      // OverlapBox: tìm tất cả Collider trong hộp, không cần Rigidbody
      Collider[] hits = Physics.OverlapBox(
          transform.position,
          detectionSize / 2f,
          transform.rotation,
          targetLayer
      );

      foreach (Collider hit in hits)
      {
          Debug.Log("Phát hiện: " + hit.name);
      }
  }

  // Vẽ vùng phát hiện trong Scene View để debug
  void OnDrawGizmosSelected()
  {
      Gizmos.color = new Color(0.2f, 1f, 0.2f, 0.3f);
      Gizmos.DrawCube(transform.position, detectionSize);
      Gizmos.color = new Color(0.2f, 1f, 0.2f, 1f);
      Gizmos.DrawWireCube(transform.position, detectionSize);
  }
}

📌 Ghi nhớ nhanh

  • Sphere nhanh nhất, Mesh chính xác nhất nhưng chậm nhất
  • CapsuleCollider là chuẩn cho nhân vật người
  • Compound = nhiều Collider đơn thay cho MeshCollider
  • isTrigger=true → phát hiện mà không tạo phản lực
  • Layer Collision Matrix kiểm soát ai-chạm-ai

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

  • ❌ Dùng MeshCollider Convex=false cho vật di động

    Non-convex MeshCollider không thể dùng với Dynamic Rigidbody, gây lỗi

    ✅ Bật Convex hoặc dùng Compound Collider thay thế

  • ❌ Collider quá nhỏ so với mesh nhìn thấy

    Người chơi thấy đạn chưa chạm nhưng đã chết — trải nghiệm tệ

    ✅ Bật Gizmo, kiểm tra kích thước Collider khớp mesh