The problem I see with this approach is that the AI module cannot be easily decoupled from the components attached to the entities. To evaluate a tree or run a state machine, it needs to know information from the entity being used so it actually needs to pull information like the inventory, the weapons available, the position, etc from the actual components.
Quan sát bất kỳ động vật nào: hệ thống thần kinh của nó được điều chỉnh theo nhiệm vụ của nó. Chim có thị lực sắc bén để tìm kiếm thức ăn và các mối đe dọa, và khả năng điều chỉnh tư thế của chúng và đạt được lực nâng khi rơi, theo bản năng. Và tâm trí con người có dây để nhận thức rất rõ về khả năng của chính cơ thể mình, mức độ khỏe mạnh, đói, lạnh, chưa kể đến sự hiện diện hay vắng mặt của chân tay ... bạn sẽ bị trôi dạt. Nếu chúng ta sử dụng RL làm cơ sở cho mô hình hóa đối tượng, sẽ không có lỗi trong việc trí tuệ / AI nhận thức được các khía cạnh như vị trí, tư thế, sức khỏe, vật phẩm, khả năng, v.v. Những gì bạn có thể làm là vũ khí tên lửa trừu tượng được xử lý như một loại chung chung. Điều này dẫn đến logic AI trừu tượng đẹp nhưif holding missile weapon in hand, attempt to fire
. Một bộ não trong một cái bình, OTOH, chính xác là như vậy - miễn là nó biết nó bị thất sủng, nó cũng biết rằng cố gắng trèo ra khỏi cái lọ là vô ích. Đó là: kiểm tra AI cho null
các thành phần và tiến hành tương ứng.
I thought about diverging from the pure ECS pattern of keeping components as data containers only and actually implement those methods in the components themselves so that I can have a base AIControlledComponent
I thought I could refactor the code splitting it up based on the kind of enemy (aka an enemy that has a Weapon won't be able to Charge and vice versa) but then I'd have to have a base AIControlSystem and inherit from that and specialize it based on the components attached to the entities. This would result in pretty much one new system per enemy kind and it doesn't really look like a good solution.
Giữ chúng như các mục dữ liệu thuần túy hay không không phải là vấn đề quan trọng; nhưng hệ thống kiểm soát của bạn là, và trong vấn đề đó, phương pháp "thuần túy" thường được đẩy là "thực hành âm thanh". Trong thực tế, nó làm cho rất ít sự khác biệt cho dù logic là trên this
hoặc trên một cái gì đó khác (như bộ điều khiển cấp cao hơn). Chỉ cần đừng để phương thức không thuần túy biến mã của bạn thành spaghetti. (Theo kinh nghiệm của tôi, cách tiếp cận thuần túy có nhiều mã nguyên khối hơn và khiến cho việc mắc lỗi ở đối tượng địa phương không đồng ý với các cơ chế kiểm soát toàn cầu trở nên khó khăn hơn - Tôi luôn tìm cách tiếp cận từ trên xuống rõ ràng nhất.)
Một số người sẽ không đồng ý, nhưng nói chung, toàn bộ ý tưởng đằng sau ECS là thành phần đối tượng so với kế thừa. Tôi không nói rằng bạn không thể sử dụng tính kế thừa trên một số loại thành phần của mình, nhưng tôi sẽ tránh điều đó càng tốt.
Based on the mental state, this systems adds a set of actions to a queue. Then the queue is being consumed and evaluated. An action like "Attack" is actually calling a method of the system that checks whether the entity has a WeaponComponent attached and fires, or if there's a ChargeComponent it charges at the player.
Tôi nghĩ rằng đây là trung tâm của cuộc khủng hoảng của bạn. Thành phần trí tuệ AI của bạn, nên biết toàn bộ trạng thái của cơ thể mình và các bộ phận liên quan của môi trường bên ngoài, không bao giờ xếp hàng "Tấn công" trừ khi hoàn cảnh lý tưởng ở nơi đầu tiên. Ví dụ, hãy tưởng tượng bạn đột nhiên nhận ra rằng bạn không có một khẩu súng trường trong tay, mà là một cây bút. Bạn vẫn sẽ tấn công và tấn công, đặc biệt là nếu kẻ thù đều được trang bị súng? Tôi nghi ngờ điều đó. Về mặt chiến thuật rất khác biệt và trong mã hiện tại của bạn, sự khác biệt đó không được tạo ra bởi thành phần AI của bạn trước khi xếp hàng hành động được đề cập.
whether the entity has a WeaponComponent attached and fires, or if there's a ChargeComponent it charges at the player
Điều này cũng hoàn toàn sai với tâm trí của tôi. Tại sao là Charge
một Component
? Chắc chắn đó chỉ là một động từ, một loại hành động mà bất kỳ AI nào cũng có thể chọn thực hiện, ngay cả khi nó có vũ khí tên lửa trong tay? Chắc chắn điều duy nhất ngăn chặn một khoản phí là tốc độ / sự đóng gói và đó là những yếu tố được xử lý trong quyết định của AI về những hành động cần thực hiện, dựa trên trạng thái vật lý của chính thực thể? Nhưng ... OK.
Hai đoạn cuối cung cấp cho bạn ý chính của các vấn đề của bạn: bạn đang để lại những gì quan trọng, quyết định AI (!) Hạng nhất được đưa ra trước khi xếp hàng xảy ra, để trở thành phút cuối, quyết định của lớp thứ hai được đưa ra vào lúc mà thực thể của bạn nên được kích hoạt hoặc chạy cho cuộc sống của nó. Nghe có vẻ không quyết định lắm đối với tôi và tôi có thể tưởng tượng điều gì xảy ra với những người lính thực sự chiến đấu theo cách này. Ngoài ra, tôi thậm chí không chắc chắn liệu AI có tham gia vào giai đoạn "đoán thứ hai" của bạn hay không, hay đó chỉ là những thành phần khác đưa ra những quyết định cuối cùng về việc có nên hành động hay không ... nếu sau này , bạn cần thay đổi điều đó thành xử lý quyết định AI một pha và các hành động xếp hàng dựa trên các xác nhận.
Đề nghị bạn hợp nhất xử lý AI của bạn để xảy ra hoàn toàn trước khi bắt đầu xếp hàng. Các vấn đề ở đây là tất cả trong chiến lược AI của bạn chứ không phải trong cách sử dụng ECS của bạn, trong chừng mực mà tôi có thể thấy.