Cấu trúc đơn vị trò chơi RTS


18

Tôi muốn có một cách để tạo ra nhiều đơn vị khác nhau mà không phải lập trình các công cụ như hành động moveTo và Attack nhiều lần

Cách tôi nhìn thấy, có 2 cách tôi có thể làm điều này.

  1. Một lớp Đơn vị chung duy nhất có các cờ xác định những gì nó có thể / không thể làm (sau đó tạo các thể hiện trong một mảng tĩnh và lấy chúng khi cần)
  2. Lớp đơn vị trừu tượng với các phương thức trừu tượng cho các hành động dành riêng cho Đơn vị như (Tấn công, Thu hoạch, Tuần tra), sau đó tất cả cần phải được thực hiện trong các lớp con , ngay cả khi đơn vị thực sự không thể thu hoạch được gì.

cách đầu tiên để làm điều này có vẻ đơn giản nhất, nhưng cuối cùng tôi sẽ có rất nhiều mã không được sử dụng cho phần lớn các đơn vị.

cách thứ hai cũng có thể làm việc. Nhưng nếu tôi quyết định có hai đơn vị khác nhau có thể thu hoạch tài nguyên, tôi sẽ có cùng một mã chính xác trong hai lớp khác nhau, điều này dường như không phải là cách đúng đắn để làm điều đó.

Đây có phải là cách tiếp cận đúng cho vấn đề này?
Trong một trò chơi như AoE, mọi đơn vị đều có, tôi đoán là gì, một loại Danh sách Hành động / Đơn hàng nào đó, tôi thực sự muốn biết làm thế nào để đạt được thứ gì đó tương tự, trong đó tôi chỉ có thể mã hóa mỗi Hành động / Đặt hàng một lần và sau đó đưa nó cho tất cả các đơn vị cần nói Hành động.

Nếu tôi không rõ ràng (rất có lý) hoặc bạn cần thêm thông tin về chính xác những gì tôi đang tìm kiếm, chỉ cần hỏi tôi trong một nhận xét.

Câu trả lời:


25

Một cách tiếp cận phổ biến là có một cách tiếp cận dựa trên thành phần trong đó "Đơn vị" lớp cơ sở chỉ thực hiện các khía cạnh cơ bản nhất mà tất cả các đơn vị đều có, trong khi mỗi đơn vị sau đó có một danh sách nhiều đối tượng thành phần cho biết nó có thể làm gì và làm thế nào nó làm điều đó

Ví dụ, một chiếc xe tăng có thể có các thành phần Mobile, Destructible, Attacker, một bất động duy nhất tháp pháo Destructible, Attackervà một máy gặt đập Mobile, Destructible, Harvester. Các lớp này sau đó sẽ bao gồm tất cả các mã cần thiết để thực hiện các hành vi này. Tương tác giữa các thành phần ( Attackerchỉ có thể làm hỏng những gìDestructible ) có thể được thực hiện bằng cách kiểm tra thành phần nếu đơn vị khác có thành phần cần thiết và sau đó tương tác trực tiếp với thành phần đó.

Ưu điểm so với kế thừa lớp cổ điển là bạn có thể dễ dàng kết hợp các khả năng. Ví dụ, khi bạn muốn có một máy gặt đập cũng có thể tấn công, vận chuyển bộ binh và bay, bạn chỉ cần thêm các thành phần cần thiết. Bạn cũng có thể dễ dàng thêm và xóa các tính năng mới dưới dạng các thành phần mới mà không cần phải làm mờ lớp Đơn vị cơ bản.

Unity hỗ trợ bạn trong một kiến ​​trúc như vậy, bởi vì toàn bộ công cụ đã dựa trên thành phần. Vì vậy, các thành phần logic trò chơi như thế này có thể được thêm vào dưới dạng các kịch bản.


Vì vậy, trong sự thống nhất, sau đó tôi sẽ vô hiệu hóa và kích hoạt các thành phần khi cần thiết?.
Daniel Holst

@DanielHolst Không, bạn sẽ thêm và xóa chúng khi cần. Bạn có thể làm điều đó trong trình soạn thảo Unity hoặc với các đoạn mã bằng gameObject.AddComponentgameObject.RemoveComponent.
Philipp

ah được, nhưng nói cho một hành động / trật tự "di chuyển". Làm thế nào để đơn vị biết khi nào đơn hàng được thực hiện?, và tôi sẽ xếp hàng như thế nào?
Daniel Holst

2
@DanielHolst Tôi nghĩ bạn đã hiểu nhầm điều gì đó. Thành Movingphần này có nghĩa là "đơn vị này thường có khả năng di chuyển". Thành phần được gắn vĩnh viễn với nó, bất kể đơn vị có di chuyển hay không. Nó không có nghĩa là nó đang di chuyển ngay bây giờ . Mặc dù bạn cũng có thể làm theo cách này bằng cách thêm một MoveOrderthành phần vào nó và yêu cầu thành phần đó tự xóa khỏi đơn vị khi đơn hàng được thực hiện hoặc hủy bỏ.
Philipp

1
@DanielHolst Bây giờ bạn đang trôi dạt vào hướng của đơn vị AI, đó là một con giun hoàn toàn khác. Một cách tiếp cận khả thi sẽ là có một thư viện các thành phần AIScript, giả sử rằng một số thành phần nhất định có mặt hoặc thay đổi hành vi của chúng tùy thuộc vào thành phần nào mà đơn vị đang có. Nhưng đó thực sự là một chủ đề quá phức tạp để xử lý trong một bình luận.
Philipp

4

Rất nhiều trò chơi sử dụng hệ thống dựa trên thành phần cho các thực thể , trong đó có thể thêm một loạt các hành vi và khả năng vào một loại đơn vị chung chung hơn thay vì được mã hóa như một phần của lớp thực thể (hoặc tương đương).


điều này sẽ cực kỳ khó thực hiện?
Daniel Holst

Các mẫu như thế này được sử dụng để thực hiện tổng thể dễ dàng hơn. Nếu bạn không thể quyết định cách tiếp cận nào, thì nên bắt đầu đơn giản nhất có thể và phát triển sự lựa chọn của bạn khi bạn có nhiều chức năng hơn. Khi bạn đã cảm nhận được vấn đề nhiều hơn, bạn có thể cấu trúc lại hoặc viết lại theo cách tiếp cận phù hợp với tình huống của bạn hơn.
Ross Taylor-Turner

1
@DanielHolst Tôi nhận thấy câu hỏi của bạn có Unitycờ. Unity đã có một hệ thống thành phần tích hợp và đặc biệt ủng hộ thành phần hơn sự kế thừa . Một phương pháp đơn giản sẽ là tạo một MonoBehaviourcho từng loại hành động của bạn, sau đó đính kèm vào từng loại đơn vị tiền tố hành động mà nó có thể thực hiện (tùy chỉnh các trường hợp hành động với các chi tiết theo từng loại như giá trị thiệt hại & chi phí). Điều này giữ cho việc tạo đơn vị của bạn dựa trên dữ liệu, do đó bạn có thể dễ dàng tạo nhiều loại đơn vị tùy chỉnh.
DMGregory

@DanielHolst Điều đó phụ thuộc vào định nghĩa của bạn về "cực kỳ khó khăn". Câu trả lời của tôi đi vào chi tiết hơn về cách thực hiện điều này.
Philipp
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.