Tạo thực thể dưới dạng tổng hợp


10

Gần đây tôi đã hỏi về cách tách các thực thể khỏi hành vi của chúng và câu trả lời chính được liên kết đến bài viết này: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

Khái niệm cuối cùng được viết về đây là: ĐỐI TƯỢNG NHƯ MỘT HỢP ĐỒNG PURE.

Tôi đang tự hỏi làm thế nào tôi có thể tạo ra các thực thể trò chơi dưới dạng tổng hợp thuần túy bằng C #. Tôi chưa nắm bắt được khái niệm về cách thức hoạt động của nó. (Có lẽ thực thể là một mảng các đối tượng thực hiện một giao diện hoặc loại cơ sở nhất định?)

Suy nghĩ hiện tại của tôi vẫn liên quan đến việc có một lớp cụ thể cho từng loại thực thể sau đó thực hiện các giao diện có liên quan (IMovable, ICollectable, ISpeakable, v.v.).

Làm thế nào tôi có thể đi về việc tạo ra một thực thể hoàn toàn như một tập hợp mà không có bất kỳ loại cụ thể nào cho thực thể đó?


Nếu bạn vẫn quan tâm tôi có thể gửi cho bạn hệ thống thực thể nhỏ của tôi trong C #. Nó không tuyệt vời , nhưng nó hoạt động.
Vịt Cộng sản

Câu trả lời:


6

Cách tiếp cận "tập hợp thuần túy" được mô tả bởi West trong bài viết được liên kết đó tránh hoàn toàn một đối tượng "thực thể". Có những thành phần, trôi nổi trong bộ nhớ, nhưng chúng chỉ gắn kết với nhau bằng các mối quan hệ ngầm, nếu có.

Một cách để làm điều này là một cách tiếp cận được gọi là outboard . Trong một hệ thống như vậy, các thành phần được giữ bởi các hệ thống quản lý hoặc kiểm soát chúng (tôi sử dụng thuật ngữ "quản lý" ở đây, nhưng bạn không nên hiểu điều này có nghĩa là tôi đề nghị bạn có một nhóm * Trình quản lý để giữ các loại thành phần). Ví dụ, hệ thống vật lý của bạn có thể giữ một loạt những thứ đại diện cho mỗi cơ thể cứng nhắc trong thế giới mô phỏng của nó và có thể phơi bày những thứ đó dưới dạng Vật lý học. Các thành phần có thể là các đối tượng thực tế được xử lý bởi hệ thống con trong câu hỏi hoặc chúng có thể là proxy cho các đối tượng đó, khi cần thiết.

Trong một hệ thống như vậy, không nhất thiết phải có một lớp "Thực thể" để chứa một tập hợp các tham chiếu đến các thành phần bao gồm nó; thay vào đó, một thông báo được đưa ra liên quan đến việc tạo hoặc hủy một "thực thể" và mỗi hệ thống con xử lý các thành phần nhìn vào mô tả của thực thể được tạo / hủy (thường được tải từ một số dữ liệu) và xác định xem một thành phần có cần thiết cho nó không.

Một trong những lợi thế của phương pháp này là bạn có được địa phương tham khảo thực sự tốt cho từng thành phần. Thật không may, nó hơi kỳ lạ, tổng thể, và không phải là hương vị thân thiện nhất của các thực thể dựa trên thành phần mà tôi đã gặp. Đôi khi thật tiện lợi khi có một đối tượng thực sự đại diện cho một thực thể, ngay cả khi đối tượng đó làm ít hơn thì tổng hợp các tham chiếu yếu đến các thành phần vẫn được giữ bởi các hệ thống con khác (nếu không có gì khác thì nó cung cấp một cách dễ dàng để định tuyến các thông điệp giữa các thành phần) .

Có một số cách tốt để thực hiện các hệ thống đối tượng trò chơi định hướng thành phần; nó thực sự, thực sự, thực sự hữu ích nếu bạn có một ý tưởng vững chắc về các yêu cầu bạn muốn ra khỏi hệ thống của mình - bạn có thể xem các khung công tác phổ biến như Unity làm gì cho các ví dụ. Nếu không đặt ra các yêu cầu nghiêm ngặt cho bản thân, bạn có thể gặp phải vấn đề "thiết kế" hệ thống vô tận mà không bao giờ thực sự xây dựng nó, cố gắng vô ích để đạt được việc thực hiện hoàn hảo. Vì lý do gì tôi đã thấy điều này rất nhiều với các hệ thống thành phần.


3

Cách Unity thực hiện là tất cả các tập lệnh (trong trường hợp của bạn, mã trò chơi dành riêng cho một loại đối tượng trò chơi) xuất phát từ một lớp cơ sở MonoBehaviour, chính nó xuất phát từ Componentlớp trường hợp phù hợp hơn với trường hợp của bạn . Bạn không bao giờ chỉnh sửa (và không có quyền truy cập vào mã của) lớp GameObject.

Đối tượng trò chơi chịu trách nhiệm chứa tất cả những Components. Nó cũng có vẻ phụ trách việc gọi các chức năng có liên quan trên chúng (tức là Update). Unity sử dụng sự phản chiếu để xác định các chức năng cần gọi (xem phần "Các chức năng có thể ghi đè" trên trang này ), nhưng có lẽ bạn muốn biến chúng thành ảo.

Vì vậy, một trong những cơ chế mà bạn sử dụng trong Unity là nhận các thành phần trên đối tượng trò chơi hiện tại của bạn (hoặc con của nó) theo loại. Có một số thuộc tính trợ giúp bao bọc một số công cụ phổ biến. Ví dụ: nếu bạn muốn truy cập Transformthành phần của đối tượng trò chơi (để điều khiển vị trí / góc quay / tỷ lệ của đối tượng trò chơi), thông thường bạn sẽ phải làm một cái gì đó như thế this.GetComponent<Transform>().position, nhưng họ gói nó vào một this.transform.positioncuộc gọi trợ giúp . Một mô hình phổ biến khác là truy cập vào Rendererthành phần của đối tượng trò chơi hiện tại . Vì vậy, nếu bạn muốn làm một cái gì đó như thay đổi tài liệu của đối tượng trò chơi hiện tại, từ một tập lệnh khác, bạn có thể làm điều gì đó giống như this.renderer.material = someOtherMaterialvà đối tượng trò chơi của bạn cập nhật một cách thích hợp.

Một trong những cách thức này hoạt động trong Unity là trình chỉnh sửa của chúng được thiết lập sao cho bạn có thể tạo các đối tượng trò chơi trong cảnh có các thành phần đã được nối. Trong trường hợp của Unity, tất cả các đối tượng trò chơi đều có một Transformthành phần, nhưng nó cũng có thể chứa các loại tích hợp như AudioListenerhoặc Renderer, làm những gì bạn mong đợi. Hoặc bạn có thể thêm các thành phần của riêng bạn để làm bất cứ điều gì bạn muốn chúng làm. Trình chỉnh sửa cũng hiển thị các trường công khai / tuần tự hóa trên các thành phần của bạn để bạn không phải tạo các tập lệnh khác nhau nếu bạn muốn sử dụng cùng một mã cơ bản nhưng thay đổi một vài số ma thuật xung quanh.

Nhìn chung, nó khá hấp dẫn và tôi khuyên bạn nên tải xuống phiên bản Unity miễn phí và chơi xung quanh cách hệ thống kịch bản của họ được thiết lập như một bằng chứng khá hay về khái niệm bạn muốn đạt được.


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.