Mặc dù các định nghĩa có thể khác nhau, tôi sẽ không định nghĩa Unity3D là một công cụ Hệ thống thực thể. Khi chúng ta nói về Hệ thống thực thể, chúng ta nên theo định nghĩa của Adam Martin.
Theo ý tưởng của ông, các Hệ thống nên được lập trình viên tạo ra, trong khi trong Unity3D, "các hệ thống" được xác định trước trong công cụ và không thể mở rộng.
Đây là một cách cũ để quản lý các Thực thể và Thành phần, nó là một sự phát triển của kỹ thuật cổ xưa, nơi các đối tượng trò chơi đang giữ các con trỏ tới các thành phần tương thích với các chức năng của động cơ (như kết xuất, loại bỏ, v.v.).
Tất nhiên khi không thể mở rộng các chức năng "Hệ thống", cách duy nhất để mở rộng logic của các thực thể của chúng tôi là thêm logic bên trong Thành phần. Đây dù sao cũng là một bước tiến từ các kỹ thuật OOP cổ điển. Các định hướng thành phần (tôi gọi chúng là các thành phần Thực thể, không có Hệ thống) giống như các khung trong Unity, thúc đẩy bộ mã hóa ưu tiên Thành phần hơn Kế thừa, đây chắc chắn là một cách thực hành tốt hơn.
Tất cả logic trong Unity nên được viết bên trong MonoBehaviour tập trung. Mỗi MonoBehaviour chỉ nên có một chức năng hoặc trách nhiệm và chúng không nên hoạt động bên ngoài GameObject. Chúng nên được viết với tính mô đun trong tâm trí, theo cách mà chúng có thể được sử dụng lại một cách độc lập trên một số GameObject. Monobehaviours cũng nắm giữ Dữ liệu và thiết kế của họ rõ ràng tuân theo các khái niệm cơ bản của OOP.
Thay vào đó, thiết kế hiện đại có xu hướng tách dữ liệu khỏi logic. Xem ví dụ các mẫu MVC hoặc MVP. Dữ liệu, Khung nhìn và Logic nên được tách riêng để đạt được mô đun mã tốt hơn.
Vấn đề thực sự với thiết kế Thành phần thực thể Unity là về sự phức tạp cần thiết để đưa hai thực thể vào giao tiếp một cách hợp lý mà không dẫn đến việc sử dụng các kiểu chống khác nhau.
Unity đảo ngược sự kiểm soát việc tạo ra các thực thể, do đó, lập trình viên không có bất kỳ sự kiểm soát nào đối với việc tạo ra chúng. Đảo ngược điều khiển sáng tạo là một điều tốt, nhưng Unity không làm điều đó theo một cách thích hợp. Không thể tiêm phụ thuộc vào Thực thể là một hạn chế buộc các lập trình viên phải sử dụng các mô hình chống để khắc phục tất cả các hậu quả nội tại.
Cuối cùng, tùy chọn sạch nhất có sẵn là sử dụng Singletons để chia sẻ thông tin giữa các thực thể.
Đó là lý do tại sao khá khó để quản lý và duy trì các dự án lớn với Unity. Tôi đã viết rất nhiều về những vấn đề này trong blog của tôi. Vì vậy, nếu bạn muốn bạn có thể tiếp tục đọc những suy nghĩ của tôi ở đó:
http://www.sebaslab.com/ioc-container-for-unity3d-part-1/
http://www.sebaslab.com/ioc-container-for-unity3d-part-2/
http://www.sebaslab.com/the-truth-behind-inversion-of-control-part-i-dependency-injection/
http://www.sebaslab.com/the-truth-behind-inversion-of-control-part-ii-inversion-of-control/
http://www.sebaslab.com/the-truth-behind-inversion-of-control-part-iii-entity-component-systems/
http://www.sebaslab.com/the-truth-behind-inversion-of-control-part-iv-dependency-inversion-principl/
http://www.sebaslab.com/the-truth-behind-inversion-of-control-part-v-drifting-away-from-ioc-containers/
Trong các bài viết này, tôi thảo luận rộng rãi về các lỗi thiết kế Unity3D cản trở sự phát triển của các dự án lớn và cả khung công tác IoC container và Hệ thống thành phần thực thể như các giải pháp có thể.