Як я повинен реалізовувати "обізнаність" противника?


12

Я використовую Unity3d для розробки гібридної прототипової гри RTS / TD. Який найкращий підхід для «обізнаності» між підрозділами та їх ворогами? Чи розумно кожну одиницю перевіряти відстань до кожного ворога та брати участь, якщо в межах зону дії?

Підхід, на який я зараз прагну, - це спускова сфера на кожному блоці. Якщо противник потрапляє в спусковий гачок, підрозділ усвідомлює противника і починає перевірку дистанції. Чи економить це непотрібні чеки?

Яка найкраща практика тут?


Варто додати, що кількість підрозділів / ворог буде за шкалою Верховного Головнокомандувача
Філ

Відповіді:


10

Розгляньте обмежувальні ієрархії обсягу (BVH). Вони найчастіше використовуються при виявленні зіткнень, щоб зменшити кількість перевірок, необхідних при обчисленні зіткнень, або при наданні для винищення фрустуму на об'єктах. Оскільки ви вже використовуєте сфери, я б запропонував дерево сфери, хоча інші томи, такі як AABB, можуть бути ефективнішими. Я не впевнений, яку підтримку має Unity для таких речей, як я ніколи цього не використовував, але, мабуть, є щось для цього вже в межах виявлення зіткнень або надання частин двигуна.

В основному, ви хочете згрупувати ворогів, які знаходяться поруч один з одним, у декілька батьківських сфер. Коли підрозділ переміщується, ви перевіряєте його тригерну сферу проти батьківської сфери, а не кожного ворога. Якщо куля спуску перетинається з батьківською сферою, ви перевірите кожного ворога всередині. Якщо цього не відбувається, ви можете відкинути всіх ворогів, які знаходяться в ньому. Ви хочете встановити декілька рівнів сфер на основі максимального розміру сфери або кількості ворога для кожної сфери та виконати перевірку на основі сфери верхнього рівня. Тоді справа лише в тому, щоб спуститися по дереву, щоб перевірити кожного ворога, не потребуючи перевірки відстані для кожного.

Необхідні кроки для кожного кадру:

  1. Рухайте ворогів
  2. Побудуйте / оновіть BVH для нових позицій противника
  3. Перемістіть одиниці і перевірте, чи немає дерев сфери.

Це може зменшити кількість перевірок, коли ворогів багато, але накладні оновлення та зберігання дерева можуть не коштувати, коли їх не так багато. Я не знайомий з верховним командувачем, щоб знати, що ти шукаєш, тому я просто припускаю "сотні". Вам потрібно буде профайлювати в різних ситуаціях, щоб дізнатись, чи вартий буде накладний наклад.


3
+1 такий підхід буде найпростішим, хоча він матиме деякі помилки. ОП може захотіти здійснити це, а потім реалізувати щось на зразок указу. Також у більшості РТС підрозділи реагують з деякою затримкою. Насправді більшість AI в іграх обчислюється 10-30 кадрів в секунду, де гра може працювати зі швидкістю 30-60 кадрів в секунду (цифри, звичайно, наближені).
Самаурса

Дякую, саме це мені потрібно було зробити для мене на крок далі. Я перегляну BVH і як його реалізувати в Unity. Дуже педагогічний та інформативний пост! +1
Філ

Ох, і перевірити Верховного головнокомандуючого, якщо ви в RTS. Це дуже приємна гра, як і справді всі ігри Кріса Тейлора.
Філ

7

Не потрібно реалізовувати BVH, оскільки двигун зіткнення Unity по суті робить це вже для вас.

Просто приєднайте великий тригер обмежувальної сфери до кожного підрозділу (представляючи його дальність) та обробляйте зворотні OnCollisionEnter()та OnCollisionExit()зворотні дзвінки, щоб відстежувати, які вороги знаходяться в межах кожної одиниці.

Зауважте, що справа, яка вас цікавить, - це коли інша одиниця стикається зі сферою, а не тоді, коли сфера іншої одиниці стикається зі сферою.


1
Я думаю, що на це потрібно звернутись хоча б трохи вище, ніж прийняти відповідь. Прийнята відповідь корисна для вивчення, але ця відповідь повинна бути вгорі, оскільки це найбільш практичний спосіб.
Варакілекс

Я вважаю, ти маєш на увазі OnTriggerEnter()і OnTriggerExit(), правда?
Jibb Smart

1

Ще одне рішення, яке дуже добре масштабує і може бути використане для безлічі інших речей, - це карта неперевершеності. Створіть набір плитки з сітки навколо пристрою для сканування в радіусі X. Скануйте ці плитки на наявність противника, що стоїть на одному з них. Якщо ви хочете знайти найближчих ворогів, ви можете сортувати свій набір за відстані.

Це може бути найефективнішим методом, особливо якщо ви плануєте робити інші дії з картою впливу, як-от туман війни або обхід маршрутів.

Ось відео, яке я зробив, пояснюючи концепцію: https://www.youtube.com/watch?v=MEd6XV2Pecw .

А ось реалізація: https://www.youtube.com/watch?v=y_ewoxlZlgc

Я рекомендую не ініціалізувати колекцію одиниць сітки при запуску - а лише тоді, коли потрібна колекція.

Крім того, ви можете використовувати масив довжиною X, якщо знаєте, що на плитці ніколи не буде більше X одиниць.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.