Hệ thống thực thể Unity3D hoạt động như thế nào?


7

Tôi đã thấy Hệ thống thành phần thực thể Java Artemis và nghĩ về hệ thống thực thể trong Unity3D.

Ví dụ, trong Artemis bạn chỉ có thể thêm một loại thành phần cho mỗi thực thể và logic không có trong thành phần.

Trong Unity3D thì hoàn toàn khác. Ai đó có thể giải thích cho tôi cách hệ thống thực thể trong unity 3d hoạt động không?

Ý tôi là, Unity3D là một hệ thống thực thể thực sự, hay nó là cái gì khác?


1
Một câu hỏi cho mỗi bài viết xin vui lòng. Hơn nữa, câu hỏi của bạn là khá rộng. Có lẽ bạn có thể thu hẹp phạm vi một chút bằng cách đặt câu hỏi cụ thể về hệ thống? Làm thế nào nó hoạt động trên một tổng thể quá rộng.
MichaelHouse

Chỉ một phần trong trò đùa, câu trả lời của tôi cho tiêu đề câu hỏi sẽ là "khủng khiếp". Unity có một số kiến ​​trúc khung gầm, rất nhiều điều cơ bản về đồ thị cảnh của nó được thực hiện tốt. Nó bị xáo trộn khủng khiếp và các cơ chế truy cập liên thành phần thực sự hút. Nhưng để mỗi riêng của mình.
Kỹ sư

Câu trả lời:


5

Vâng, nó vẫn là một hệ thống thực thể. Không có định nghĩa chặt chẽ nào về cách một hệ thống thực thể hoạt động, vì vậy, nó khác với Artemis. Cả hai vẫn có các thực thể bao gồm các thành phần.

Mục tiêu của một hệ thống thực thể là tránh xa các thiết kế dựa trên sự kế thừa. Hệ thống của Unity hoàn thành mục tiêu này.

Tương tự như Artemis, bạn có thể thêm các thành phần vào một thực thể để tạo một đối tượng mới. Thay đổi dữ liệu trong các thành phần có thể, ở cấp độ bề mặt, thay đổi mạnh mẽ đối tượng được tạo ra. Một số khác biệt chính là nơi lưu trữ logic và cách các thành phần được nhóm để xử lý . Mặc dù những khác biệt này có vẻ kịch tính, nhưng chúng không quá khác biệt. Cả hai cách tiếp cận có thể được sửa đổi để thậm chí giống nhau hơn. Ví dụ: bạn có thể tạo các thành phần chỉ bằng dữ liệu trong Unity và tạo "hệ thống" tìm tất cả các đối tượng trò chơi với các thành phần cụ thể và xử lý chúng.

Dù bằng cách nào, bạn sẽ có các thành phần và thực thể. Trường hợp các thực thể không xuất phát từ một danh sách dài các lớp được kế thừa. Điều này làm giảm sự sao chép mã, loại bỏ mã và dữ liệu không cần thiết và cung cấp cho bạn một cách dễ dàng để suy nghĩ về cách các đối tượng được tạo.


1

Unity3D hoạt động trên mô hình GameObject-Thành phần. Nó khác rất nhiều so với Hệ thống Thành phần Thực thể. Theo kinh nghiệm của tôi, điều đó tệ hơn bởi vì khi bạn muốn mã hóa một số logic, nó được đưa vào Thành phần tập lệnh, thay vì Hệ thống. Nó khác với mô hình OOP như thế nào? Unity3D GameObject chứa dữ liệu và logic - giống như trong OOP, các thành phần đó không thể tái sử dụng (đó là một trong những lý do để không thực hiện OOP). Tất nhiên, bạn có thể thực hiện một số quy ước chống đạn giúp bạn không trộn lẫn dữ liệu và logic nhưng có thể là một công việc khá khó khăn để thực hiện liên tục.

Phụ thuộc. Khi bạn làm việc trong ECS, mọi Hệ thống đều có một khía cạnh (nó mô tả các thành phần mà nó quản lý). Nhờ vào khía cạnh, các Thành phần của bạn được phụ thuộc bởi Hệ thống chứ không phải bởi các Thành phần khác. Tôi đã thấy mã trong đó một vài Thành phần đang tham chiếu lẫn nhau. Khi thứ tự thực hiện không được đặt đúng, thì ... tổng số hỗn độn. Khi bạn cấu trúc lại các phụ thuộc Thành phần (logic), tốt hơn là thực hiện ở MỘT vị trí, như Hệ thống, thay vì một vài vị trí (Thành phần).

Một nhược điểm lớn khác của mô hình được sử dụng trong Unity3D là vấn đề quản lý các đối tượng có cùng khía cạnh (bộ thành phần). Theo tôi, tốt nhất là đi theo con đường ECS ​​nếu có thể hoặc một cái gì đó gần gũi hơn với nó. Để thực hiện phương pháp đó trong Unity3D, hãy xem câu trả lời @ Byte56.



"Mô hình GameObject-Thành phần" là gì? Tôi chưa bao giờ nghe về điều đó và nó khác với "Hệ thống thực thể" như thế nào? Tôi nghĩ rằng bạn không thực sự trả lời câu hỏi, chỉ nói về sự thống nhất.
bummzack

Hãy xem các liên kết tài nguyên sau đây. Trên thực tế, bằng cách đưa ra một điểm trừ, bạn nên bình luận về lý do tại sao bạn không nghĩ rằng tôi không trả lời câu hỏi - hãy nghiêm túc. "Trò chơi lập trình trò chơi 6" - Chương 4.6 "Hệ thống thành phần đối tượng trò chơi" nói thêm về "Hệ thống đối tượng trò chơi dựa trên thành phần" thảo luận thú vị trên Wiki
Namek

Không cần phải tấn công ở đây. Tôi biết làm thế nào một kiến ​​trúc dựa trên thành phần hoạt động. Đó là một mô hình thường được sử dụng trong gamedev. "Mô hình thành phần đối tượng trò chơi" giống như "hệ thống thành phần thực thể". Và tôi đã từ chối vì câu hỏi là: "Hệ thống thực thể Unity3D hoạt động như thế nào?". Và câu trả lời của bạn tập trung vào: Đừng sử dụng sự thống nhất, đó là một mớ hỗn độn ... không hữu ích và không trả lời câu hỏi.
bummzack

1
thật là mỉa mai khi đăng bài đó
jhocking

1

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ể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.