07. Quy Chuẩn Định Dạng MeshLibrary (MeshLibrary Format)

Hệ thống GridMap được thiết kế và tối ưu hóa cực kỳ đặc biệt: nó không phải là một công cụ tổng quát để đặt bất kỳ loại node nào lên lưới, mà là một hệ thống chuyên dụng, siêu nhẹ nhằm hiển thị hàng loạt các khối mô hình 3D kết hợp va chạm và tìm đường.

Chính vì lý do đó, Godot áp dụng một bộ quy chuẩn phân cấp (Hierarchy) rất nghiêm ngặt đối với Scene nguồn dùng để xuất ra MeshLibrary. Bất kỳ node nào nằm sai vị trí hoặc sai kiểu dữ liệu đều sẽ bị trình xuất bỏ qua.


📐 Cấu trúc cây Node chuẩn mực

Dưới đây là sơ đồ chuẩn của một scene nguồn MeshLibrary hoàn chỉnh:

Cấu trúc Node
Node3D (Root của Scene)
├── MeshInstance3D (Ô khối thứ nhất, ví dụ: Floor)
│   ├── StaticBody3D (Dùng cho va chạm vật lý)
│   │   └── CollisionShape3D
│   └── NavigationRegion3D (Dùng cho tìm đường AI)
│       └── [Các node hình học hỗ trợ Bake]
├── MeshInstance3D (Ô khối thứ hai, ví dụ: Wall)
│   └── StaticBody3D
│       └── CollisionShape3D
└── MeshInstance3D (Ô khối thứ ba, ví dụ: Pillar)
    └── StaticBody3D
        └── CollisionShape3D

📋 Bản tóm tắt các yêu cầu bắt buộc

Mỗi node con trực tiếp của node gốc Node3D phải tuân thủ đúng 4 điều kiện sau:

  1. Phải là MeshInstance3D: - Đây là đối tượng đại diện cho phần hình ảnh của ô khối. - Chỉ duy nhất mesh hiển thị này được xuất vào thư viện.
  2. Vật liệu (Material): - Phải được gán bên trong các rãnh vật liệu của chính tài nguyên Mesh gốc (Mesh.material), không phải trong rãnh ghi đè của MeshInstance3D.
  3. Va chạm (Collision - Tối đa 1 node): - Có thể chứa tối đa 1 node con kiểu StaticBody3D. - Node StaticBody3D này chứa một hoặc nhiều node CollisionShape3D bên dưới.
  4. Điều hướng (Navigation - Tối đa 1 node): - Có thể chứa tối đa 1 node con kiểu NavigationRegion3D. - Node NavigationRegion3D này chứa tài nguyên NavigationMesh đã được Bake sẵn.

🚫 Những điều cần tránh

  • Không đặt các loại node khác làm con trực tiếp của Root: Các node như Area3D, Camera3D, PointLight3D hay CharacterBody3D sẽ không được nhận diện và không được xuất vào MeshLibrary.
  • Không gắn Script lên các node trong scene nguồn: GridMap gom các khối lại để render thông qua MultiMesh, do đó các script gắn trên từng khối riêng lẻ trong scene nguồn sẽ không thực thi khi các ô được vẽ vào GridMap.
  • Nếu bạn cần một khối có logic tương tác phức tạp (như cánh cửa mở ra khi bấm nút, rương kho báu, bẫy gai tự động...), hãy tạo chúng dưới dạng các Scene riêng rẽ và khởi tạo (Instance) chúng lên màn chơi thay vì nhồi nhét vào GridMap.