Хороші прийоми для синхронізації ігрових дій з певними таймінами анімації?


10

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

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

Ось кілька простих прикладів того, про що я говорю в різних видах ігор:

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

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

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

Справді, мій конкретний випадок найбільше схожий на другий приклад , в якому я створив анімацію, коли мій покроковий персонаж вискакує вперед під час нападу, і я хочу, щоб шкода була нанесена саме в той момент, коли анімація, здається, контактує . Оскільки моя гра з використанням покрокової системи (уявіть щось на кшталт Final Fantasy або Fire Emblem) я хочу пошкодження / загоєння / магії / тощо. застосовуватись у потрібний час під час кожної анімації символів, хоча я насправді не використовую зіткнення / хітокси.

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

Чесно кажучи, це працює зараз, але це просто не так - наче я тут пропускаю частину більшої картини! Частина причини, по якій цей метод відчуває себе неправильно, полягає в тому, що він поєднує логіку гри з активами анімації; якщо мій ресурс анімації забуде включити подія / зворотний виклик ExecuteCommand (), команда не буде виконуватись належним чином і потрібен додатковий код, щоб перевірити, чи закінчена анімація команд без виконання команди. Це безладно, і це означає, що мій геймплей має дивну залежність від його активів. Звичайно, я хочу, щоб ушкодження траплялися в певний момент під час моєї анімаційної атаки, але я відчуваю себе дуже дивно, як називати ігровий код всередині анімаційних активів.

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

Редагування: Для уточнення, це не специфічне для двигуна питання, і я не шукаю конкретні конструкції / методи двигуна. Мене цікавлять загальні методи синхронізації анімації / ігор, які можна використовувати у ваших ігрових проектах незалежно від використовуваних технологій.


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

Я хочу, щоб деякі елементи гри були синхронізовані з анімацією. Однак синхронізація між двома речами не завжди означає залежність, правда? Мене цікавлять деякі методи, якими користуються люди, щоб синхронізувати анімацію зі своїм ігровим процесом. Я сказав, що я намагався, і що зараз роблю, щоб досягти цього, і тому моє питання полягає в тому, чи є інша / краща / альтернативна методика, яку можна використати, чи це така активи) стандартним способом? Це ви використовуєте у своїх проектах?
MrKatSwordfish

Відповіді:


5

Для синхронізації вам потрібно вирішити, хто (ваш код, анімація чи ні) не є авторитетом часу - "битвом", на який всі "танцюють".

Різні домовленості підходять для різних ігор:

  • Анімації є повноваженнями часу (ваша поточна установка)

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

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

    Інструменти для анімації Blender (3D) та Spine (2D) дозволяють аніматору визначати події, на які може підписатися ігровий код.

  • Код є повноваженням

    Зворотне вище: Події, що відбуваються в ігровому світі (наприклад, гравець, який вирішив перезавантажити зброю), спричиняють запуск анімації та передачу параметрів (наприклад, час до завершення перезавантаження). Кожна анімація використовує надані параметри для зміни способу її вигляду (наприклад, запуск анімації з відповідною швидкістю, щоб "перезавантажена частина" траплялася, коли вказано).

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

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

    Overgrowth характер анімації «s в значній мірі структуровані таким чином: Девід Розен пояснює це в своїй GDC 14 розмови (див специфічно рух і рух Продовження сегментів).

  • Непрямі терміни (зовнішні повноваження)

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

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

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


0

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

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

Анімація відповідає лише за візуальне, і стан обробляє ігрову певну логіку для цієї дії.

У моїй бойовій грі стан - це об'єкт, який успадковується від класу BaseState і має метод Update (). Кожен символ має колекцію станів, але одночасно може бути призначений лише один. І метод Update () поточного стану викликається один раз на кадр.

Це всередині оновлення () стану, в якому я виконую всю цю логіку: встановлюю швидкість символу на конкретний кадр, приріст / зменшення здоров'я тощо.

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