Tôi nên thực hiện nhận thức kẻ thù của đơn vị như thế nào?


12

Tôi đang sử dụng Unity3d để phát triển trò chơi nguyên mẫu lai RTS / TD. Cách tiếp cận tốt nhất cho "nhận thức" giữa các đơn vị và kẻ thù của họ là gì? Có phải là lành mạnh để mọi đơn vị kiểm tra khoảng cách với mọi kẻ thù và tham gia nếu trong phạm vi?

Cách tiếp cận tôi sẽ thực hiện ngay bây giờ là có một quả cầu kích hoạt trên mỗi đơn vị. Nếu kẻ địch đi vào cò súng, đơn vị sẽ nhận ra kẻ thù và bắt đầu kiểm tra khoảng cách. Điều này có lưu một số kiểm tra không cần thiết?

Thực hành tốt nhất ở đây là gì?


Tôi nên nói thêm rằng số lượng đơn vị / quân địch sẽ ở trong quy mô của Chỉ huy tối cao
Phil

Câu trả lời:


10

Nhìn vào hệ thống phân cấp khối lượng giới hạn (BVH). Chúng thường được sử dụng nhất trong phát hiện va chạm để giảm số lượng kiểm tra cần thiết khi tính toán va chạm hoặc trong kết xuất để thực hiện loại bỏ sự thất vọng trên các đối tượng. Vì bạn đã sử dụng hình cầu, tôi đề nghị một cây hình cầu mặc dù các khối khác như AABB có thể hiệu quả hơn. Tôi không chắc Unity có hỗ trợ gì cho những thứ như tôi chưa từng sử dụng, nhưng có lẽ có thứ gì đó đã có trong bộ phận phát hiện va chạm hoặc kết xuất của động cơ.

Về cơ bản, bạn sẽ muốn nhóm các kẻ thù ở gần nhau thành nhiều quả cầu cha mẹ. Khi một đơn vị được di chuyển, bạn sẽ kiểm tra quả cầu kích hoạt của nó so với quả cầu mẹ thay vì kiểm tra từng kẻ thù. Nếu quả cầu kích hoạt giao với quả cầu cha, bạn sẽ kiểm tra từng kẻ thù bên trong. Nếu không, bạn có thể loại bỏ tất cả kẻ thù bên trong nó. Bạn sẽ muốn thiết lập nhiều cấp độ hình cầu dựa trên kích thước hình cầu tối đa hoặc số lượng kẻ thù cho mỗi hình cầu và thực hiện kiểm tra dựa trên hình cầu cấp cao nhất. Sau đó, chỉ là vấn đề đi xuống cây để kiểm tra từng kẻ thù mà không cần thực hiện kiểm tra khoảng cách cho từng người.

Các bước cần thiết cho từng khung:

  1. Di chuyển kẻ thù
  2. Xây dựng lại / cập nhật BVH cho các vị trí kẻ thù mới
  3. Di chuyển các đơn vị và kiểm tra chống lại cây hình cầu.

Điều này có thể làm giảm các kiểm tra cần thiết khi có nhiều kẻ thù nhưng chi phí cập nhật và lưu trữ cây có thể không có giá trị khi không có nhiều. Tôi không quen với Chỉ huy tối cao để biết bạn sẽ theo đuổi điều gì, vì vậy tôi chỉ giả sử 'hàng trăm'. Bạn sẽ cần phải lập hồ sơ trong các tình huống khác nhau để tìm hiểu xem chi phí chung có xứng đáng với bạn không.


3
+1 cách tiếp cận này sẽ đơn giản nhất mặc dù nó sẽ có một số lỗi. OP có thể muốn thực hiện điều này và sau đó thực hiện một cái gì đó như một octree. Ngoài ra, trong hầu hết các RTS, các đơn vị phản ứng với một số độ trễ. Trên thực tế, hầu hết AI trong các trò chơi được tính 10-30 khung hình mỗi giây trong đó trò chơi có thể chạy ở tốc độ 30-60 khung hình mỗi giây (tất nhiên là các con số xấp xỉ).
Samaursa

Cảm ơn bạn, đây chính xác là những gì tôi cần để đưa tôi thêm một bước nữa. Tôi sẽ tra cứu BVH và cách triển khai trong Unity. Bài viết rất sư phạm và nhiều thông tin! +1
Phil

Ồ và kiểm tra Chỉ huy tối cao nếu bạn tham gia RTS. Đây thực sự là một game rất hay, cũng như tất cả các game Chris Taylor thực sự.
Phil

7

Không cần thực hiện BVH, vì động cơ va chạm của Unity về cơ bản đã làm điều đó cho bạn.

Chỉ cần gắn một kích hoạt hình cầu giới hạn lớn cho mỗi đơn vị (đại diện cho phạm vi của nó) và xử lý OnCollisionEnter()OnCollisionExit()gọi lại để theo dõi kẻ thù nào nằm trong phạm vi của mỗi đơn vị.

Lưu ý rằng trường hợp bạn quan tâm là khi một đơn vị khác va chạm với quả cầu, chứ không phải khi quả cầu của đơn vị khác va chạm với quả cầu.


1
Tôi nghĩ rằng điều này cần phải được nâng cấp lên ít nhất là ngay trên câu trả lời được chấp nhận. Câu trả lời được chấp nhận là tốt cho việc học tập, nhưng câu trả lời này nên được đặt lên hàng đầu vì đây là cách thiết thực nhất.
Varaquilex

Tôi tin rằng bạn có ý nghĩa OnTriggerEnter()OnTriggerExit(), phải không?
Jibb Smart

1

Một giải pháp khác có tỷ lệ rất tốt và có thể được sử dụng cho vô số thứ khác là bản đồ siêu nhỏ. Tạo một tập hợp các ô lưới xung quanh đơn vị để quét trong bán kính X. Quét những viên gạch này để tìm kẻ thù đứng trên một trong số chúng. Nếu bạn muốn có được những kẻ thù gần nhất, bạn có thể sắp xếp tập hợp của mình theo khoảng cách.

Đây có thể là phương pháp hiệu quả nhất, đặc biệt nếu bạn dự định làm những việc khác với bản đồ ảnh hưởng như sương mù chiến tranh hoặc tìm đường.

Đây là video tôi đã giải thích về khái niệm này: https://www.youtube.com/watch?v=MEd6XV2Pecw .

Và đây là một triển khai: https://www.youtube.com/watch?v=y_ewoxlZlgc

Tôi khuyên bạn không nên khởi tạo bộ sưu tập đơn vị của ô lưới khi khởi động - mà chỉ thay vào đó khi bộ sưu tập là cần thiết.

Ngoài ra, bạn có thể sử dụng một mảng có độ dài X nếu bạn biết sẽ không bao giờ có nhiều hơn đơn vị X trên một ô.

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.