Skip to main content

Collision Detection

Khái niệm

  • Cách Unity/PhysX (3D) hoặc Box2D (2D) xác định hai collider có chạm nhau trong bước mô phỏng.
  • Mục tiêu: tránh “xuyên vật” (tunneling) khi vật thể di chuyển nhanh hoặc collider mỏng.

Rigidbody 3D

Chế độ

Mô tả

Dùng khi

Discrete

Mặc định. Kiểm tra tại các mẫu thời gian rời rạc (mỗi bước physics). Nhanh nhất nhưng có thể xuyên nếu quá nhanh/mỏng.

Hầu hết vật thể di chuyển chậm/trung bình.

Continuous

Kiểm tra swept giữa hai vị trí (last→new) để giảm xuyên qua static colliders.

Vật thể di chuyển nhanh, va tường mỏng.

Continuous Dynamic

Nâng cấp của Continuous cho Rigidbody động nhanh va vào đối tượng continuous khác.

Tốn chi phí hơn.

Đạn/vật thể rất nhanh, va chạm động–động.

Continuous Speculative

Dự đoán va chạm (speculative) ở bước kế tiếp. Ổn định, chi phí vừa, hiệu quả với vật nhỏ/nhanh.

Vật thể nhỏ, tốc độ cao, cần chi phí hợp lý.

Continuous/Continuous Dynamic tốn hiệu năng hơn Discrete; chỉ bật cho vật thể thật sự cần.

Rigidbody 2D

Chế độ

Mô tả

Dùng khi

Discrete

Mặc định, rẻ. Có thể xuyên khi rất nhanh.

Vật thể chậm/trung bình.

Continuous

Giảm xuyên qua bằng kiểm tra swept 2D.

Vật thể nhanh hoặc collider mỏng.

Trigger vs Collision

Loại

Dùng cho

Callback

Collision (va chạm)

Vật thể chặn nhau (phản lực, ma sát…)

OnCollisionEnter/Stay/Exit

Trigger

Không chặn, chỉ để bắt sự kiện

OnTriggerEnter/Stay/Exit

Best Practice

  • Vật nhanh/nhỏ: dùng Continuous/Continuous Dynamic (3D) hoặc Continuous (2D).
  • Giữ collider đơn giản (hộp/cầu/capsule) để giảm chi phí và ổn định tiếp xúc.
  • Di chuyển Rigidbody bằng physics (AddForce, MovePosition) — tránh transform.Translate để không bỏ qua mô phỏng.
  • Interpolate (Rigidbody Interpolate) chỉ mượt hình ảnh, không thay đổi va chạm.
  • Kiểm soát va chạm bằng Layer Collision Matrix; tắt những lớp không cần để tiết kiệm.
  • Nếu vẫn bị “xuyên”: tăng Fixed Timestep (mô phỏng dày hơn), giảm tốc độ đỉnh, hoặc tăng độ dày collider.