Skip to content

Latest commit

 

History

History
34 lines (25 loc) · 4.62 KB

File metadata and controls

34 lines (25 loc) · 4.62 KB

Dựa trên việc phân tích cấu trúc và một số tệp mã nguồn chính, đây là một số vấn đề tiềm ẩn và các điểm có thể cải thiện trong dự án của bạn:

1. Vấn đề về Kiến trúc và Thiết kế mã nguồn

  • Lạm dụng Singleton: Các lớp quan trọng như GameManager, WaveManager, ObjectPooler, UIManager đều đang sử dụng mô hình Singleton (truy cập thông qua .Instance). Điều này tạo ra sự phụ thuộc chặt chẽ giữa các thành phần, khiến mã khó bảo trì, khó mở rộng và đặc biệt là rất khó để viết unit test.
    • Gợi ý: Sử dụng Dependency Injection hoặc các hệ thống sự kiện (events) để giao tiếp giữa các hệ thống một cách linh hoạt hơn.
  • Hard-coded Values (Giá trị được gán cứng):
    • Tên các scene (cảnh) như "MainMenu", "WorldMap" được gán cứng trong mã. Nếu bạn đổi tên file scene, game sẽ bị lỗi.
    • Các tag của đối tượng ("Player", "Bullet", "EnemyBullet") được so sánh bằng chuỗi ký tự. Điều này dễ gây lỗi nếu gõ sai và khó quản lý.
    • Các cấp độ vũ khí trong PlayerController.cs được xử lý bằng một khối switch-case khổng lồ và lặp lại.
    • Gợi ý: Sử dụng ScriptableObject để định nghĩa dữ liệu cho level, vũ khí, kẻ địch. Điều này giúp bạn thay đổi thông số game mà không cần sửa đổi mã nguồn.
  • Lớp (Class) và phương thức (Method) quá lớn:
    • Lớp Enemy.cs xử lý logic cho cả kẻ địch thường và Boss, làm cho lớp này trở nên phức tạp.
    • Phương thức Shoot() trong PlayerController.csUpdate() trong Enemy.cs quá dài và phức tạp.
    • Gợi ý: Tách logic của Boss ra một lớp riêng kế thừa từ Enemy. Sử dụng các mẫu thiết kế như State Pattern hoặc Strategy Pattern để xử lý các kiểu di chuyển khác nhau của kẻ địch.

2. Vấn đề về Quản lý Dự án và Git

  • Thư mục Build trong Git: Thư mục CompleteGame/Build đang không được liệt kê trong tệp .gitignore. Điều này có nghĩa là các tệp build (thường rất lớn và được tạo tự động) đang được đưa vào repository, làm tăng kích thước kho chứa một cách không cần thiết.
  • Sử dụng PlayerPrefs để lưu game: GameProgress.cs sử dụng PlayerPrefs để lưu màn chơi hiện tại. PlayerPrefs rất dễ bị người dùng chỉnh sửa, không phù hợp để lưu các dữ liệu quan trọng.
    • Gợi ý: Cân nhắc mã hóa dữ liệu trước khi lưu hoặc sử dụng một hệ thống lưu trữ tệp nhị phân an toàn hơn.

3. Vấn đề về Kỹ thuật và Tối ưu hóa trong Unity

  • Sử dụng các gói (package) pre-release: Tệp manifest.json cho thấy bạn đang sử dụng các phiên bản "pre-release" của một số gói Unity (ví dụ: com.unity.ai.assistant). Các phiên bản này có thể không ổn định và chứa lỗi.
  • Lỗi logic trong Object Pooling: Trong ObjectPooler.cs, hàm SpawnFromPool đã đưa đối tượng trở lại pool ngay sau khi lấy ra (Enqueue ngay sau Dequeue). Điều này làm cho pool không hoạt động đúng mục đích, vì cùng một đối tượng sẽ được tái sử dụng liên tục trong khi những đối tượng khác không bao giờ được dùng.
  • Sử dụng goto: Trong PlayerController.cs có một lệnh goto. Đây là một cấu trúc lệnh không được khuyến khích trong lập trình hiện đại vì nó làm cho luồng chương trình khó theo dõi.

4. Chất lượng mã nguồn chung

  • Ngôn ngữ bình luận (comment): Toàn bộ bình luận trong mã nguồn đều bằng tiếng Việt. Điều này có thể gây khó khăn nếu dự án có sự tham gia của các lập trình viên không nói tiếng Việt trong tương lai.
  • Các phương thức rỗng: Một số tệp có phương thức Start() rỗng, có thể được xóa đi cho mã nguồn gọn gàng hơn.

Tóm lại, dự án có vẻ hoạt động được nhưng có nhiều điểm có thể được cải thiện để trở nên chuyên nghiệp, dễ bảo trì và mở rộng hơn. Việc tái cấu trúc (refactor) lại các vấn đề về kiến trúc sẽ là bước quan trọng nhất để nâng cao chất lượng dự án.