# Collision Detection

### Khái niệm

- <span style="white-space: pre-wrap;">Cách Unity/PhysX (3D) hoặc Box2D (2D) xác định </span>****hai collider có chạm nhau****<span style="white-space: pre-wrap;"> trong bước mô phỏng.</span>
- <span style="white-space: pre-wrap;">Mục tiêu: </span>****tránh “xuyên vật”****<span style="white-space: pre-wrap;"> (tunneling) khi vật thể </span>****di chuyển nhanh****<span style="white-space: pre-wrap;"> hoặc collider </span>****mỏng****.

### Rigidbody 3D

<table id="bkmrk-ch%E1%BA%BF-%C4%91%E1%BB%99m%C3%B4-t%E1%BA%A3d%C3%B9ng-khid"><colgroup><col style="width: 119px;"></col><col></col><col></col></colgroup><tbody><tr><th>Chế độ

</th><th>****Mô tả****

</th><th>****Dùng khi****

</th></tr><tr><td>****Discrete****

</td><td><span style="white-space: pre-wrap;">Mặc định. Kiểm tra tại </span>****các mẫu thời gian rời rạc****<span style="white-space: pre-wrap;"> (mỗi bước physics). Nhanh nhất nhưng có thể xuyên nếu quá nhanh/mỏng.</span>

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

</td></tr><tr><td>****Continuous****

</td><td><span style="white-space: pre-wrap;">Kiểm tra </span>****swept****<span style="white-space: pre-wrap;"> giữa hai vị trí (last→new) để giảm xuyên qua </span>****static colliders****.

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

</td></tr><tr><td>****Continuous Dynamic****

</td><td><span style="white-space: pre-wrap;">Nâng cấp của Continuous cho </span>****Rigidbody động nhanh****<span style="white-space: pre-wrap;"> va vào </span>****đối tượng continuous****<span style="white-space: pre-wrap;"> khác. </span>

Tốn chi phí hơn.

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

</td></tr><tr><td>****Continuous Speculative****

</td><td>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.

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

</td></tr></tbody></table>

<p class="callout warning"><span style="white-space: pre-wrap;">Continuous/Continuous Dynamic </span>****tốn hiệu năng****<span style="white-space: pre-wrap;"> hơn Discrete; chỉ bật cho vật thể thật sự cần.</span></p>

### Rigidbody 2D

<table id="bkmrk-ch%E1%BA%BF-%C4%91%E1%BB%99m%C3%B4-t%E1%BA%A3d%C3%B9ng-khid-1"><colgroup><col style="width: 102px;"></col><col></col><col></col></colgroup><tbody><tr><th>Chế độ

</th><th>****Mô tả****

</th><th>****Dùng khi****

</th></tr><tr><td>****Discrete****

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

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

</td></tr><tr><td>****Continuous****

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

</td><td>Vật thể nhanh hoặc collider mỏng.

</td></tr></tbody></table>

### Trigger vs Collision

<table id="bkmrk-lo%E1%BA%A1id%C3%B9ng-chocallback"><colgroup><col></col><col style="width: 335px;"></col><col></col></colgroup><tbody><tr><th>Loại

</th><th>Dùng cho

</th><th>Callback

</th></tr><tr><td>****Collision (va chạm)****

</td><td><span style="white-space: pre-wrap;">Vật thể </span>****chặn nhau****<span style="white-space: pre-wrap;"> (phản lực, ma sát…)</span>

</td><td>`<span class="editor-theme-code">OnCollisionEnter/Stay/Exit</span>`

</td></tr><tr><td>****Trigger****

</td><td>****Không chặn****, chỉ để bắt sự kiện

</td><td>`<span class="editor-theme-code">OnTriggerEnter/Stay/Exit</span>`

</td></tr></tbody></table>

### Best Practice

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