Thiết kế dựa trên thành phần / thực thể + Cây hành vi => làm thế nào để tích hợp?


9

Đối với dự án hiện tại của tôi, tôi đã triển khai một hệ thống dựa trên thành phần / thực thể , về cơ bản tuân theo hầu hết các thực tiễn tốt nhất có trong khu vực khá không xác định này .

Vì vậy, tôi đã (hơi mở rộng) Các đối tượng , đó là cơ bản một intID, một tên con người có thể đọc được, một std::maptrong các thành phần và một long"loại chỉ số" được sử dụng để hiển thị những gì các thành phần có mặt (Tôi có một sức mạnh của hai enumđối với tất cả các thành phần loại và bất cứ khi nào một thành phần được thêm vào Thực thể, tôi sẽ tự động thay đổi thời gian dài đó thông qua các thao tác bitwise, so sánh câu trả lời này ).

Sau đó, có các Thành phần , cũng khá đơn giản: intID, enumnhư loại thành phần, con trỏ Thực thể mẹ và một std::maptrong tất cả các thuộc tính mà thành phần này giữ.

Cuối cùng, một số Hệ thống / Người quản lý xử lý việc xử lý logic thực tế. Trước tiên, họ kiểm tra xem Thực thể hiện đang xử lý có long"chỉ báo loại" phù hợp = tất cả các thành phần cần thiết cho hệ thống đó hay không. Sau đó, nó truy cập một số thuộc tính nếu cần và trực tiếp gọi một số chức năng trong thành phần tương ứng hoặc gửi một số tin nhắn (thông qua một bộ điều phối tin nhắn).

Điểm mấu chốt: Cho đến đây, một hệ thống dựa trên thành phần / thực thể dựa trên sự kiện khá tiêu chuẩn kết hợp với cách tiếp cận dựa trên dữ liệu (so sánh, các thành phần không có các biến dữ liệu được mã hóa cứng, mà thay vào đó là một bản đồ chung, như (một số) thành phần / archetypes của các thành phần sau đó sẽ được đọc từ các tệp với tùy chọn thêm dữ liệu bổ sung, đó không phải là một phần của mã thành phần thực tế.

Bây giờ tôi cũng muốn giới thiệu Cây hành vi (dựa trên AiGameDev BTSK ) vào dự án đó, nhưng tôi không chắc liệu chúng có nên được liên kết với các thành phần đã có hay nói chung cách tích hợp các thiết kế đó không.

Một số ý tưởng / điểm / câu hỏi liên quan xuất hiện trong đầu:

  1. BT của tôi sẽ được đọc từ các tập tin (một lần nữa). Tôi hiện đang có một thời gian khó khăn để xem làm thế nào tốt nhất tôi có thể tạo kết nối giữa một BT Actioncây trong đó và mã hóa thực tế trong ứng dụng của tôi. Tôi có nên xây dựng một số loại bản đồ giữa các tên hành động được sử dụng trong các tệp BT và một con trỏ hàm để thực hiện logic thực tế không? Cách tiếp cận thông thường để giải quyết điều đó là gì?

  2. Tôi giả định rằng tôi sẽ phải tạo BT cho tất cả các Entityloại khác nhau của mình (vì vậy đối với mỗi tổ hợp thành phần có liên quan đến logic trò chơi / AI như được chỉ định bởi "chỉ báo loại" dài nhiều lần được đề cập của tôi). Kết quả là không có ý nghĩa gì khi đặt các BT Actiontriển khai trong các thành phần vì rất có thể nhiều thành phần sẽ được tham gia cho mỗi hành động, phải không?

  3. Vậy BT Actionlogic có nên nằm trong một / nhiều hệ thống riêng biệt (với phương thức mà bản đồ từ ý tưởng số 1 chỉ đến)? Sau đó, hệ thống sẽ kiểm tra long"chỉ báo loại" của tôi xem liệu EntityBT hiện đang được kiểm tra và được yêu cầu thực hiện một hành động nhất định (phương thức = trong hệ thống) có thực sự được phép làm như vậy (= có các thành phần cần thiết) hay không. Nhưng sau đó, nếu không (vì ví dụ, người tạo BT đã bỏ qua một tình huống cụ thể, trong đó một thành phần cần thiết có thể không được gắn vào Thực thể khi chạy nữa), sẽ không có gì xảy ra.

Câu hỏi:

  • Có những khái niệm đã được chứng minh cho loại tích hợp đó?
  • Bạn lấy gì ở 3 điểm trên của tôi?
  • Bất kỳ điều gì khác xuất hiện trong tâm trí, cũng liên quan đến thiết kế dựa trên thành phần / thực thể của tôi nói chung?

Điểm 1: Cây hành vi không gì khác hơn là DSL trực quan được sử dụng chủ yếu để tạo hành vi nhân vật. Một thành phần BehaviorTree không nên làm bất cứ điều gì nhiều hơn hoặc bất cứ điều gì ít hơn một thành phần Script sẽ làm. Điểm 3: Lý do sử dụng bản đồ trên các trường thông thường là gì?
Eric

# 1: "DSL" đại diện cho điều gì trong bối cảnh này? # 3: Xin lỗi, nhưng tôi không thể theo bạn về điều này. Quan tâm để giải thích những gì bạn có ý nghĩa?
Philip Allgaier

1
có lẽ là ngôn ngữ cụ thể của miền, tức là. một cú pháp tùy chỉnh để làm việc với một vấn đề rất cụ thể.
Patrick Hughes

Patrick là chính xác, mặc dù một ngữ nghĩa cũng là một phần của nó và "rất" có thể được loại bỏ khỏi định nghĩa này. - Re 3: Tôi xin lỗi, nên đọc: "Lý do của việc sử dụng bản đồ trên các trường thông thường trong các thành phần là gì?"
Eric

Re 3: Tôi muốn khả năng sau này tự động chỉ định các thuộc tính bổ sung bên ngoài mã C ++ (buzzword: điều khiển dữ liệu). Để đơn giản, tôi (ít nhất là bây giờ) đặt tất cả các thuộc tính trong khung chung này (sử dụng bản đồ), ngay cả những thuộc tính được sửa trong mã và do đó có thể là các trường C ++ thực. Có thể phải xem lại rằng vào một thời điểm sau, nếu nó trở thành vấn đề về hiệu suất ...
Philip Allgaier

Câu trả lời:


2

Hiện tại tôi đang gặp khó khăn khi xem làm thế nào tốt nhất tôi có thể tạo kết nối giữa Hành động BT trong cây đó và mã hóa thực tế trong ứng dụng của mình. Tôi có nên xây dựng một số loại bản đồ giữa các tên hành động được sử dụng trong các tệp BT và một con trỏ hàm để thực hiện logic thực tế không? Cách tiếp cận thông thường để giải quyết điều đó là gì?

Hãy quên các con trỏ hàm và suy nghĩ về các đối tượng. Mỗi nút trong cây hành vi (BT từ thời điểm này trở đi) sẽ lý tưởng tương ứng với một đối tượng trong mã của bạn. Những đối tượng đó sẽ có một giao diện chuẩn để cho phép bạn sắp xếp chúng thành một cái cây và để vượt qua chúng. Một tập hợp các con trỏ hàm là tốt cho hành vi nhưng nó hoàn toàn không nắm bắt được cấu trúc của cây của bạn.

Kết quả là không có ý nghĩa gì khi đưa các triển khai BT Action vào các thành phần vì rất có thể nhiều thành phần sẽ được tham gia cho mỗi hành động, phải không?

Tôi mong muốn các thực thể có một thành phần BehaviorTree duy nhất lưu trữ dữ liệu liên quan cho BT của thực thể đó. Việc thực thi BT được thực hiện bởi Thành phần BT hoặc Hệ thống con BT tùy thuộc vào cách bạn xử lý các thành phần trong hệ thống của mình. Như với hầu hết mọi thứ sử dụng các thành phần, họ sẽ phải tham khảo các thành phần khác để hoàn thành công việc, nhưng các thành phần khác đó sẽ không phải biết gì về BT.

Các hành động khác nhau có sẵn, ở mức độ đơn giản nhất, sẽ được mã hóa vào các đối tượng nút BT khác nhau. Họ có thể làm cho thực thể có liên quan hành động bằng cách thao tác các thành phần khi cần thiết, ví dụ. truy cập thành phần chuyển động để di chuyển.


Đoạn # 1: Có, chính BT sẽ là một đối tượng (như tôi đã nói giống như phiên bản từ AiGameDev). Tôi chỉ nghĩ về functor cho các hành động, nhưng Đoạn # 2 của bạn đã thay đổi điều đó. Vì một số lý do, cách tiếp cận thực sự đơn giản này không bao giờ xảy ra với tôi (Thực thể có cá thể thành viên BT riêng). Có lẽ do toàn bộ thành phần mới, tôi đã không nghĩ thẳng và đơn giản nữa, vì vậy tôi đang tìm cách trộn các thành phần với công cụ BT, nhưng thực sự điều đó không cần thiết.
Philip Allgaier

Điều chính mà tôi đã bị mất trước đây, là làm thế nào để kết nối hành động với thực thể. Bây giờ thì rõ ràng: Các hành động biết thực thể nào thông qua cây của nó mà đổi lại biết thực thể mà nó thuộc về.
Philip Allgaier

@Philip Allgaier Tôi tò mò, cuối cùng bạn đã tạo nút BT như thế nào? Bạn đã tạo nó dưới dạng 1 hành vi nút = 1 thực thể (đó sẽ là rất nhiều thực thể trên 1 đối tượng trò chơi) hoặc tạo nút như một lớp bình thường (không liên quan đến ECS) hoặc sử dụng các phương pháp khác? Cảm tạ!
cppBeginner
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.