ИСТРЕБИТЕЛИ БАГОВ: ПЛОХО РАБОТАЮЩАЯ ТУРЕЛЬ

В этом эпизоде есть всё: состояния турелей, повторения анимаций и предварительный взгляд на Anvil Hurricane. На этой неделе в новом выпуске «Истребителей багов» Марк Эйбент продолжает свой вечный спуск по реке под названием «Не работает».

Всем привет. Мы здесь, на моем небольшом забавном тестовом уровне Марка, и сегодня смотрим на Hurricane. У нас тут небольшой баг с турелью, поступивший от команды технического дизайна. Учтите, что она пока не завершена – мы еще работаем над ее сборкой. Когда мы заходим в эту турель, запускаются некоторые состояния анимаций. Как вы можете видеть, все это еще находится в разработке. Однако мы добрались до такого момента, когда анимация останавливается, и я полностью… ну, ломаюсь. Не очень веселая штука.

Что же здесь происходит? Мы пытаемся разделить состояния анимаций на этапы, чтобы часть из них можно было повторно использовать на других кораблях. Сейчас из-за давнего-давнего наследия у нас есть состояние входа, состояние бездействия и состояние выхода. В данном случае состояние входа – это когда турель опускается, вы садитесь, затем она поднимается. После этого вы переходите к состоянию бездействия. Недавно мы разбили анимацию на части, и теперь первым идет состояние развертывания, когда турель опускается. За ним наступает состояние входа – когда вы садитесь в кресло. После него следует сворачивание, когда вы поднимаетесь на турели вверх. Наконец, вы переходите к фазе выбора и бездействию. На текущем этапе мы успешно реализовали подъем, вход и развертывание, но как вы можете видеть, сейчас мы не добрались до развертывания – мы застряли в состоянии сворачивания. Оно бесконечно висит и никогда не завершается, так что мы никогда не переходим к фазе выбора. Вы просто поднимаетесь, после чего застреваете.

Что же здесь в действительности происходит на уровне кода? Переключимся на него. Он как бы берет игрока, берет кресло и связывает их вместе, чтобы они синхронизировали свои анимации. Конкретно в этой области кода функция ждет, пока игрок завершит свои анимации, после чего она переходит к следующему состоянию. Однако игрок непрерывно анимируется, потому что он зациклен. Код не принимает во внимание тот факт, что анимация игрока может навсегда зациклиться. Он думает: «О, кресло завершило анимацию. Теперь дождемся игрока.» Но игрок никогда не закончит анимацию, потому что он зациклен. На самом деле, когда вы находитесь в процессе сворачивания, игрок как бы ждет кресло,  чтобы подняться. Но его анимация ожидания повторяется снова и снова и никогда не завершается. В общем, нам нужно прервать его анимацию.

Итак, в эту небольшую забавную секцию обновления мы собираемся добавить проверку, зациклена ли анимация. Если да, нам, по сути, нужно будет сказать системе, что сиденье завершило анимацию, и мы тоже завершили анимацию. Всякий раз, когда мы разворачиваемся или сворачиваемся, нам нужно видеть, находится ли анимация актера в зацикленном состоянии. У кресла в параметре слота SScopeSlot хранится небольшой объем информации. Тут у нас целая группа таких слотов. Тут есть актер, приборная панель, транспортное средство и еще синхронизированный актер, потому что у нас две его реализации. В общем случае нам нужна информация о синхронизированном актере. Если мы находимся в состоянии синхронизации для актера, и у нас есть анимация для него, мы выполним проверку, относится ли эта суб-анимация к зависимому действию.

ScopeAction – это зависимое действие диапазона, которое на самом деле больше чем просто анимация. Это может быть анимация со звуком, перемещение и еще куча всяких вещей в одном действии. Мы рассматриваем его как анимацию, потому что, в принципе, это и есть анимация, но оно также может включать в себя всякие дополнительные элементы. Однако из этого действия нам в действительности нужно получить анимацию, если вас такое объяснение не слишком ввело в замешательство. Мы как бы спрашиваем: «Скажи нам, какая у тебя есть анимация?»

Получим от него контекст диапазона. Это такая штука… скажем, в Photoshop у меня есть слои. Корневой диапазон – это как корневой слой на слое верхнего уровня. То есть слой, который сейчас проигрывается. Мы хотим получить от него самую верхнюю анимацию… и технически мы здесь зацикливаемся. Добавим указатель на указатель. У нас есть анимация, которая зациклена. Затем нам, по сути, нужно задать логической переменной значение «True». И теперь, если мы находимся в фазах развертывания или сворачивания, и у игрока в этот момент проигрывается зацикленная анимация, мы, фактически, спускаемся по коду ниже и запускаем проверку условия. Текущее состояние еще не завершено, мы все еще обрабатываем код. Однако на самом деле мы уже завершили фазу и находимся в зацикленной анимации. Собственно, в этом случае мы скажем: «Всё, мы закончили», и программа перейдет к следующему состоянию. Первая строчка здесь выполнится только в том случае, если все зависимые действия завершены, и мы не зациклены. Но если мы все же зациклены, и при этом мы завершили фазу, значит мы перейдем на следующий слой. Тут очень много условий.

Пересоберем код и вернемся в игру. Как вы можете видеть, анимация завершилась. Программа выполнила анимацию выбора, и теперь актер находится в бездействии. Если я покину кресло, он проиграет все анимации. Давайте проделаем все это в замедленном вдвое режиме. Заходим в волшебную турель. Анимация запустилась, поэтому мы снизим скорость. Персонаж сцепился с креслом. Вот мы в состоянии сворачивания, когда кресло поднимается. Затем следует состояние выбора и состояние бездействия. И все, мы закончили. Очевидно, что этот код просто задает порядок состояний, чтобы переход от одного к другому выполнялся корректно. Понадобится проделать еще много работы над инверсной кинематикой и наборами анимаций входа, но здесь вы можете наблюдать, как кипит работа.

Как вы могли видеть, у нас был небольшой забавный баг с разделением анимаций. Из-за того, что анимация игрока была зациклена, он застревал во время фазы сворачивания. Пришлось дописать немного кода, чтобы выполнялось условие: если кресло завершило свою анимацию, а игрок все еще зациклен во время стадий развертывания или сворачивания, мы говорим, что всё хорошо, и можно переходить к следующей стадии. После чего персонаж сможет ухватиться за свой джойстик и заняться делом. Как вы могли видеть, у нас тут еще многое набросано в общих чертах, потому что работа над Hurricane продолжается. Однако теперь я могу отправить результаты дизайнерам, чтобы они продолжили свою работу. Надеюсь вам понравилось. До скорого.

Источник: https://star-citizen.ru

ПОХОЖИЕ СТАТЬИ

«ОБЗВАНИВАЯ РАЗРАБОТЧИКОВ» — ГОНКИ, NPC-ТОРГОВЦЫ И ДОРОЖНАЯ КАРТА

"ОБЗВАНИВАЯ РАЗРАБОТЧИКОВ" - ГОНКИ, NPC-ТОРГОВЦЫ И ДОРОЖНАЯ КАРТА

В очередном эпизоде еженедельных вопросов-ответов Джаред расспросил разработчиков про небоевой летный ИИ, шкафчики и оружейные стойки, гоночные трассы, кастомные маркеры на картах, а также про дорожную карту. Джаред Хаккаби (ДХ):Всем добро пожаловать на очередной выпуск «Обзванивая...

Путеводитель по галактике система Elysium

Путеводитель по галактике система Elysium

Привет, путешественник. Существует огромное число достопримечательностей во Вселенной, которые стоило бы увидеть хотя бы раз в жизни. Наша команда здесь, чтобы убедиться, что вы получите наилучшие впечатления от путешествия. Система Элизиум имеет отличительную особенность в длительной...

Путеводитель по галактике система Kallis

Путеводитель по галактике система Kallis

Собственность: научное снабжение UEE Планет: 9 Период вращения планет: Kalis IV-322 SED Импорт: иследовательское оборудование, предметы роскоши Экспорт: редкие металлы Уровень криминала: низкий Черный рынок: отсутствует Стратегический уровень UEE: серый Система Kallis достаточно...

Оставить комментарий