03. Thiết Lập Va Chạm (Collisions)

Trong hầu hết các tựa game 3D, nhân vật, quái vật hoặc đạn đạo cần phải va chạm với sàn nhà và các bức tường. Do đó, các ô khối trong MeshLibrary cần được tích hợp sẵn các thể vật lý va chạm (Physics Bodies & Collision Shapes).


🛠️ Hai cách thiết lập va chạm cho Mesh

Cách 1: Thiết lập thủ công

Bạn có thể tự tạo thủ công bằng cách: 1. Thêm một node StaticBody3D làm con trực tiếp của node MeshInstance3D. 2. Thêm một node CollisionShape3D làm con của StaticBody3D. 3. Trong bảng Inspector của CollisionShape3D, chọn hình dạng tương ứng (như BoxShape3D cho sàn hoặc tường vuông).

Cách 2: Tự động sinh từ menu Mesh (Khuyên dùng)

Godot Engine cung cấp công cụ tự động phân tích hình học của Mesh để sinh nhanh thể va chạm mà không tốn công căn chỉnh:

  1. Chọn node MeshInstance3D trên cây Scene.
  2. Trên thanh công cụ phía trên khung nhìn 3D Viewport, nhấp vào menu Mesh:

Tự động tạo Collision Body từ menu Mesh


⚖️ Lựa chọn giữa Convex và Trimesh

Trong menu Mesh, bạn sẽ thấy hai tùy chọn quan trọng:

Tùy chọn Đặc điểm & Khuyên dùng Hiệu năng
Create Simplified Convex Collision Sibling (Khối lồi đơn giản) Tạo ra một hình dạng bao lồi khép kín quanh vật thể. Phù hợp nhất cho các vật thể đặc, dạng khối hộp, tường phẳng, cột trụ. ⚡ Rất nhanh & tối ưu
Create Trimesh Static Body (Khối đa giác tam giác) Tạo ra hình dạng va chạm khớp chính xác đến từng mặt tam giác của mô hình. Cần thiết khi vật thể có lỗ rỗng ở giữa (như khung cửa vòm, cầu thang xoắn rỗng ruột). ⚠️ Tốn tài nguyên hơn
💡 Mẹo hay

Luôn ưu tiên dùng Convex cho các khối địa hình cơ bản để game duy trì chỉ số FPS cao nhất. Chỉ dùng Trimesh khi hình học của ô bắt buộc phải có lỗ rỗng để người chơi đi xuyên qua.


⚠️ Lưu ý quan trọng về vị trí node va chạm

Sau khi Godot sinh tự động node StaticBody3D, nó thường được đặt nằm ngang hàng (Sibling) với MeshInstance3D.

❗ Quan trọng

Bạn bắt buộc phải kéo thả node StaticBody3D vừa sinh ra vào bên trong để biến nó thành node con trực tiếp của MeshInstance3D tương ứng!

Cấu trúc hoàn chỉnh sẽ trông giống như hình dưới đây:

Cây node sau khi đã gán StaticBody3D làm con của MeshInstance3D