Khi thiết kế một hệ thống thành phần thực thể cho động cơ của tôi, tôi đã gặp một chút trở ngại trong cách lưu trữ và truy xuất một loại thành phần cụ thể.
Trước tiên, hãy để tôi thiết lập một chút thuật ngữ tôi sẽ sử dụng trong câu hỏi này:
- Tôi gọi " Thành phần " là cấu trúc dữ liệu lưu trữ dữ liệu liên quan cho một hệ thống cụ thể.
- Tôi gọi " Hệ thống " là tổng hợp các phương thức và cấu trúc dữ liệu sử dụng Thành phần để cập nhật trạng thái / giao diện trò chơi với người dùng.
- " Thực thể " về cơ bản chỉ là một ID được sử dụng để truy xuất các thành phần cụ thể và sửa đổi dữ liệu của chúng trong logic trò chơi.
Mỗi hệ thống sở hữu một mảng (ánh xạ ID) thuộc loại Thành phần (Ví dụ: Vật lý-> Vật lý, AI-> AIComponent, Rendering-> RenderingComponent), để nó có thể lặp lại hiệu quả trên dữ liệu.
Tuy nhiên, không phải tất cả các thành phần được sở hữu đặc biệt bởi một hệ thống. Ví dụ, thành phần Transform lưu trữ vị trí, góc quay và tỷ lệ của đối tượng. Đây là một trong những phần quan trọng nhất của một thực thể (Unity làm cho nó bắt buộc, thậm chí), vì nó được sử dụng bởi rất nhiều hệ thống, ví dụ: Vật lý, AI, Kết xuất, v.v.
Đây là vấn đề tôi gặp phải. Do Transform được sử dụng bởi rất nhiều hệ thống khác, tôi nên lấy về một hệ thống để sử dụng cho từng Thành phần như thế nào? Một giải pháp khả thi tôi thấy là làm cho mỗi Thành phần lưu trữ ID thực thể của riêng mình. Thật dễ dàng để lấy bất kỳ thành phần nào như thế này, nhưng nó sẽ không hiệu quả và nó cũng đi ngược lại khái niệm Thành phần như một gói dữ liệu độc lập và độc lập, không biết đến bất kỳ thành phần nào khác.
Có một cách thích hợp để giải quyết vấn đề này? Biến đổi thậm chí có nên là một thành phần?