Làm cách nào tôi có thể sử dụng nhiều mắt lưới cho mỗi thực thể mà không phá vỡ một thành phần của một loại cho mỗi thực thể?


11

Chúng tôi chỉ chuyển từ một công cụ trò chơi dựa trên phân cấp sang công cụ trò chơi dựa trên thành phần. Vấn đề của tôi là khi tôi tải một mô hình có phân cấp các mắt lưới và theo cách tôi hiểu, là một thực thể trong một hệ thống dựa trên thành phần không thể có nhiều thành phần cùng loại, nhưng tôi cần một "lướiComponent" cho mỗi mô hình lưới trong một mô hình. Vì vậy, làm thế nào tôi có thể giải quyết vấn đề này.

Trên trang này, họ đã triển khai một công cụ trò chơi dựa trên Thành phần: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


Tôi nghĩ rằng điều này là quá cục bộ.
jcora

4
Tôi nghĩ đó là một câu hỏi chung. Một đối tượng trò chơi có thể có nhiều phiên bản của cùng một thành phần không?
Mathias Hölzl

Vâng, nó đã có thể , nếu nó được hỏi như vậy. Đối với tôi có vẻ như anh ta đang tìm kiếm một câu trả lời cho một vấn đề rất cụ thể.
jcora

4
"... thực thể trong một hệ thống dựa trên thành phần không thể có nhiều thành phần cùng loại ..." - tại sao không?
Den

Tôi không nghĩ nó quá cục bộ. Ví dụ trong UE3, SkeletalMeshActorchỉ có một SkeletalMeshComponent. Đây là một vấn đề phổ biến có thể được giải quyết theo nhiều cách khác nhau.
sam hocevar

Câu trả lời:


13

Thành phần Vị trí của bạn có thể có logic "cha mẹ / con cái", trong đó bất kỳ Thực thể nào có Vị trí đều có thể có cha mẹ và vị trí của họ có liên quan đến cha mẹ của họ. Thay vì có nhiều lưới trên cùng một thực thể, bạn có thể tạo nhiều hơn một thực thể, mỗi lưới có lưới riêng và liên kết chúng lại với nhau. Bạn thậm chí có thể làm cho các thực thể con lắng nghe các sự kiện cha mẹ của chúng (hoặc bất kỳ hệ thống nào bạn có để liên lạc giữa các thực thể) và phản ứng tương ứng.


Vì vậy, tôi có một hệ thống phân cấp của các thực thể và các thực thể này có sự đồng bộ và được liên kết với nhau. Có phải nó vẫn là một công cụ trò chơi dựa trên Thành phần =)
Mathias Hölzl

@ MathiasHölzl đó là một câu hỏi? Kiểu phân cấp này không giống với hệ thống phân cấp có vấn đề trong OOP. Đây chỉ là một hệ thống phân cấp đồ họa, trẻ em Các thực thể sẽ không thừa hưởng chức năng từ cha mẹ của chúng và gây rắc rối cho bạn, điều này thường được thực hiện bằng mọi cách (có một cây công cụ để kết xuất). Bạn cũng có thể đi với câu trả lời của Asakeron cho vấn đề của bạn, có một danh sách các Lưới, tôi không thấy vấn đề đó như thế nào. Có lẽ tôi không hiểu câu hỏi của bạn?
Luke B.

-1 Không chắc chắn nếu đó thực sự là con đường để đi. Nếu những gì bạn cần là một thành phần xử lý một hệ thống phân cấp các lưới, tại sao không có ModelComponentmột phân cấp chứa các lưới? Chia tách một thực thể chỉ cho âm thanh đó là giải pháp sai cho vấn đề. Xem câu trả lời của Asakeron và Byte56.
Laurent Couvidou

@LaurentCouvidou Tôi không hiểu tại sao sử dụng nhiều hơn một Thực thể sẽ sai, có vẻ như đó là một giải pháp tốt cho tôi. Tôi chỉ muốn đưa ra một giải pháp khác để có một danh sách các lưới, mặc dù tôi đồng ý rằng một danh sách các lưới cũng sẽ là một giải pháp tốt.
Luke B.

@LukeB. Bởi vì nhóm lưới này có thể tương ứng với toàn bộ một thực thể, với các thành phần phụ thuộc vào điều này, ví dụ như AI, âm thanh, vật lý ... Bằng cách này, bạn kết thúc với một biểu đồ cảnh và tất cả các quirks của nó.
Laurent Couvidou

8

GridComponent của bạn có thể chứa một danh sách các mắt lưới. Tôi không chắc chắn cách bạn đang thực hiện công cụ của mình, nhưng một hệ thống có thể dễ dàng lặp lại trên tất cả các mắt lưới và chỉ cần vẽ chúng.


1
Một lưới cũng có các thành phần như biến đổi, vật lý, đồ họa ...
Mathias Hölzl

1
Vì vậy, một lưới là một thực thể? Hay tất cả mọi thứ là một thành phần? Cách tôi nhìn thấy nó, biến đổi, vật lý và đồ họa nên là các thành phần trong thực thể không nằm trong lưới, lưới chỉ là một mô tả về các đỉnh.
Luke B.

1
Vâng, nó phải là một thành phần nhưng các thành phần không thể có các thành phần nên khó thực hiện phân cấp của mô hình.
Mathias Hölzl

1
Tôi tin rằng bạn nên cung cấp thêm thông tin về cách bạn dự định xây dựng công cụ của mình để có câu trả lời tốt hơn. Hệ thống thành phần thực thể có thể được thực hiện theo nhiều cách, kiểm tra câu trả lời này của Kylotan để biết thêm thông tin về điều đó.
Asakeron

4

Tôi sẽ tạo thành phần lưới của mình với một danh sách các đối tượng lưới. Mỗi đối tượng lưới có dữ liệu lưới cùng với phần bù. Khi vẽ, hệ thống vẽ lấy vị trí từ thành phần vị trí, sau đó vẽ từng lưới trong thành phần lưới ở vị trí + bù.

Bạn có thể có nhiều mắt lưới bên trong thành phần lưới của mình, trong khi vẫn nói với một thành phần lưới duy nhất cho mỗi thực thể.


1

TLDR: Bằng cách làm cho thành phần bao gồm nhiều mắt lưới để bắt đầu.

Tôi đồng ý với Asakeron / Byte56 / Laurent rằng cần có một mức độ gián tiếp khác giữa các cặp lưới / vật liệu và chính thực thể. Thay vì xem GraphicsComponent là các đỉnh và vật liệu, hãy nghĩ về nó như một đốm pixel trên raster cuối cùng - làm thế nào nó / chúng có được một chi tiết triển khai và không có gì nữa.

Tôi đã nghĩ về điều này rất nhiều cho dự án của mình và tôi nghĩ giải pháp tối ưu là biến GraphicsComponent thành một thành phần cấp cao hơn nhiều, bao gồm nhiều chức năng của đối tượng 'Model' truyền thống - bởi vì chức năng này không phải là tùy chọn! Để hiển thị các đa giác đó nhiều hơn chỉ là dữ liệu bộ đệm và trình đổ bóng là cần thiết, chẳng hạn như:

  • Vị trí mà bạn đã đề cập
  • Dữ liệu skinning / Animation
  • Pass hiện tại (ví dụ: nếu sử dụng hai pass alpha)
  • Thông tin đúc bóng (nếu bạn đang làm nó)
  • Thông tin về cách thức và thời điểm cập nhật tài liệu
  • Chức năng Culling

Và đó chỉ là tài sản 3D, không xem xét các hệ thống hạt, bảng quảng cáo, v.v. Nhưng tất cả chúng chỉ phù hợp với mã đồ họa / kết xuất - nó không ảnh hưởng đến vật lý, âm thanh hoặc kịch bản, vì vậy nó có ý nghĩa thành phần Đồ họa / Kết xuất.

Tôi đã kết thúc với:

Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore     //This is the 'game object' - it is passed to the GraphicsController
    ModelComponent : GraphicsComponent                      //This is the actual graphics component, used by the GraphicsController in the context of the game object.
        ModelComponentPart : GraphicsComponent              //This is also a graphics component
            Mesh                                        //These are implementation details
            Material
        ModelComponentPart : GraphicsComponent
            Mesh
            Material
    Skeleton
    Animations

Trong này:

  • Mô hình là bất kỳ tài sản trò chơi nào có thành phần đồ họa.

  • ModelComponent tương tự như Model truyền thống và trên thực tế, là dành cho các tài sản 3D. Bộ điều khiển GraphicsComponent (nếu bạn sử dụng mẫu Model-View-Controller) chịu trách nhiệm tìm ra loại tài sản đồ họa đó và vẽ chính xác (lưu ý rằng ModelComponent là một lớp con của GraphicsComponent).

Ngoài ra còn có một số thỏa hiệp trong tôi vì đơn giản và tính tương thích ngược, chẳng hạn như mỗi GraphicsComponent cũng là một Thực thể và Entity lưu trữ dữ liệu Vị trí trực tiếp để nó chỉ được tính ở một nơi, nhưng ý tưởng là như nhau: GraphicsComponent xử lý những gì cần thiết để vẽ vật phẩm - tất cả những gì cần thiết - không chỉ những gì đến từ người điều hành.

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.