Хороший спосіб обробляти AI з екрана?


16

Наприклад заради:

  • Скажімо, у світі є 10 номерів.
  • Скажімо, світ населений 10 сутностями.
  • І кожне підприємство має свій "розпорядок дня", коли воно виконує певні дії в кімнаті, а також може пересуватися між кімнатами.

Зважаючи на те, що гравець може перебувати лише в одній кімнаті за один раз, який хороший спосіб відстежувати дії, які інші суб'єкти виконують в інших екранах за межами екрану?

  1. Найпростіший варіант - це перевірити кожну з 10 сутностей на кожному кадрі, перевірити їх положення / стан та визначити, чи повинна особа знаходитися в кімнаті, де знаходиться гравець у будь-який момент часу. (Це, однак, вважає, що ресурс дуже важкий, особливо, коли кількість кімнат / об'єктів збільшується.)
  2. Інший варіант - відстежувати час, що минув з початку гри, тоді кожен із суб'єктів перевіряє, чи перетинається його візерунок з кімнатою, на якій грає, і чи це він перевіряє на час, чи ні Суб'єкт повинен знаходитися в одній кімнаті в цей конкретний час, суб'єкти, чиї зразки не перетинаються з поточною кімнатою, в якій знаходиться гравець, не роблять нічого, поки гравець не ввійде в кімнату, в якій перетинається їхня картина, і лише в цей момент підраховують, чи ні вони повинні винести. (Але якщо вони взаємодіють із кімнатою, то їм доведеться завжди перевіряти стан кімнат, які перетинають їхній маршрут, щоб визначити їхнє розташування в той момент часу, що не так вже й велико.)

  3. Третім варіантом, до якого я прийшов, було б, перш за все, лише подивитися на маршрути, які перетинають місце розташування гравця (як описано раніше), по-друге, зайшовши в кімнату, перевірте, чи грає в цій кімнаті, якщо ні, то лише перевірити стан кімнати та скільки часу буде потрібно, щоб перейти до наступної кімнати. Наприклад, двірник NPC заходить у приміщення, перевіряє стан кімнати, бачить, що є розлив, зроблений гравцем, обчислює, скільки часу знадобиться, щоб очистити його та скільки часу пройде шлях тощо. І поки згадане Час належить вступити до наступної кімнати, ми лише перевіряємо, чи грає в кімнаті. Точне розташування NPC для цілей рендерінгу буде розраховано лише тоді, коли гравець заходить до кімнати.

Після деякого мозкового штурму я прийшов до третього варіанту, але мені було цікаво, чи, можливо, існує відомий чи кращий спосіб поводження з такими речами?


1
Це питання нагадує мені дев-блог, який я читав для гри під назвою Project Zomboid.
Sumurai8

Відповіді:


12

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

У вашому прикладі приміщення, в якому знаходиться плеєр, може отримати найвищу точність (AI оновлює кожен кадр, повне дозвіл). Приміщення сусідніх приміщень може отримати наступну найвищу точність (оновлення кожні 10 кліщів, видалення згладжування контуру та анімації). Усі інші кімнати можуть отримати найнижчу точність (оновлення щосекунди, пошук шляху з низькою роздільною здатністю, усунення несуттєвих взаємодій NPC-NPC).

Більш масштабні та складні ігри можуть (і використовували) подібні підходи. Вони можуть спростити бойові обчислення, символи телепорту, а не пошук шляхів, коли їм потрібно рухатись тощо.

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

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


1

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

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

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

Таким чином, вам потрібно буде постійно оновлювати поточну кімнату та кімнати, які мають заплановане оновлення на той момент, оновлення інших номерів просто необов’язково (але рекомендується, якщо у вас є AI, який оновлюється, коли гравець рухається чи робить щось) .

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