Tôi đã thiết kế một hệ thống thực thể cho FPS. Về cơ bản nó hoạt động như thế này:
Chúng tôi có một "thế giới" -object, được gọi là GameWorld. Cái này chứa một mảng GameObject, cũng như một mảng của ElementManager.
GameObject giữ một mảng Thành phần. Nó cũng cung cấp một cơ chế sự kiện rất đơn giản. Bản thân các thành phần có thể gửi một sự kiện đến thực thể, được phát cho tất cả các thành phần.
Thành phần về cơ bản là thứ mang lại cho GameObject một số thuộc tính nhất định và vì GameObject thực sự chỉ là một thùng chứa của chúng, nên mọi thứ liên quan đến một đối tượng trò chơi đều xảy ra trong Thành phần. Ví dụ bao gồm ViewComponent, ChemistryComponent và LogicComponent. Nếu cần liên lạc giữa chúng, điều đó có thể được thực hiện thông qua việc sử dụng các sự kiện.
Trình quản lý thành phần chỉ là một giao diện giống như Thành phần và đối với mỗi lớp Thành phần, thường sẽ có một lớp Thành phần. Các trình quản lý thành phần này chịu trách nhiệm tạo các thành phần và khởi tạo chúng với các thuộc tính được đọc từ một cái gì đó giống như tệp XML.
ElementManager cũng đảm nhiệm việc cập nhật hàng loạt các thành phần, như PhysComponent nơi tôi sẽ sử dụng một thư viện bên ngoài (nơi thực hiện mọi thứ trên thế giới cùng một lúc).
Để cấu hình, tôi sẽ sử dụng một nhà máy cho các thực thể sẽ đọc tệp XML hoặc tập lệnh, tạo các thành phần được chỉ định trong tệp (cũng thêm một tham chiếu đến nó trong trình quản lý thành phần phù hợp để cập nhật hàng loạt) và sau đó tiêm chúng vào một đối tượng GameObject.
Bây giờ đến vấn đề của tôi: Tôi sẽ cố gắng sử dụng điều này cho các trò chơi nhiều người chơi. Tôi không có ý tưởng làm thế nào để tiếp cận điều này.
Thứ nhất: Khách hàng nên có những thực thể nào ngay từ đầu? Tôi nên bắt đầu với việc giải thích làm thế nào một công cụ một người chơi sẽ xác định những thực thể cần tạo.
Trong trình chỉnh sửa cấp độ, bạn có thể tạo "cọ" và "thực thể". Bàn chải dành cho những thứ như tường, sàn và trần nhà, về cơ bản là những hình dạng đơn giản. Các thực thể là GameObject tôi đã nói với bạn. Khi tạo các thực thể trong trình chỉnh sửa cấp, bạn có thể chỉ định các thuộc tính cho từng thành phần của nó. Các thuộc tính này được truyền trực tiếp đến một cái gì đó giống như hàm tạo trong tập lệnh của thực thể.
Khi bạn lưu mức cho động cơ tải, nó sẽ được phân tách thành một danh sách các thực thể và các thuộc tính liên quan của chúng. Các cọ vẽ được chuyển đổi thành một thực thể "worldspawn".
Khi bạn tải mức đó, nó chỉ kích hoạt tất cả các thực thể. Nghe có vẻ đơn giản nhỉ?
Bây giờ, để kết nối các thực thể tôi gặp phải nhiều vấn đề. Đầu tiên, những thực thể nào nên tồn tại trên máy khách ngay từ đầu? Giả sử rằng cả máy chủ và máy khách đều có tệp cấp độ, máy khách cũng có thể cung cấp tất cả các thực thể trong cấp độ, ngay cả khi chúng ở đó chỉ vì mục đích của quy tắc trò chơi trên máy chủ.
Một khả năng khác là máy khách kích hoạt một thực thể ngay khi máy chủ gửi thông tin về nó và điều đó có nghĩa là máy khách sẽ chỉ có các thực thể mà nó cần.
Một vấn đề khác là làm thế nào để gửi thông tin. Tôi nghĩ rằng máy chủ có thể sử dụng nén delta, nghĩa là nó chỉ gửi thông tin mới khi có gì đó thay đổi, thay vì gửi ảnh chụp nhanh đến máy khách ở mọi khung hình. Mặc dù điều đó có nghĩa là máy chủ phải theo dõi những gì mỗi khách hàng biết vào lúc này.
Và cuối cùng, mạng nên được tiêm vào động cơ như thế nào? Tôi đang nghĩ về một thành phần, NetworkComponent, được đưa vào mọi thực thể được cho là được nối mạng. Nhưng làm thế nào nên các mạng thành phần bí quyết gì biến vào mạng, và như thế nào để truy cập vào đó, và cuối cùng là như thế nào các thành phần mạng tương ứng trên máy khách nên biết làm thế nào để thay đổi các biến mạng?
Tôi đang gặp khó khăn lớn khi tiếp cận điều này. Tôi thực sự sẽ đánh giá cao nếu bạn giúp tôi trên đường. Tôi cũng mở các mẹo về cách cải thiện thiết kế hệ thống thành phần, vì vậy đừng ngại đề xuất điều đó.