Паркур и лазанье в UDK: как это сделать?

Climbing systemЕсли вы внимательно следите за игровыми новинками, то не могли не заметить тенденции к объединению в современных тайтлах всех жанров и элементов геймплея в единое целое: это и стрелялка, и увлекательное приключение с неповторимым сюжетом и историей, и рукопашные схватки, ну и, конечно, жанр Экшн (Action) подразумевает динамичную акробатику с различными трюками — паркур да и только!

Чтобы реализовать все это в едином проекте самому — жизни не хватит. Но кое-что придется сделать, иначе не дотянуть до современного уровня. В своей игре я решил реализовать систему лазания и паркура в UDK. Головокружительных трюков не планирую, но карабкаться по выступам и прыгать со стенки на стенку герой должен.

Лазанье по выступам в UDK

Везде на форумах написано, что вы нигде не найдете руководства по созданию системы лазанья или паркура в UDK на UnrealScript (Кстати сказать, можете сами поискать в Гугле по запросам climbing, ledge grabbing, parkour in UDK). Отчасти это так, потому что готовый код зависит от задач конкретной системы, но общие принципы построения систем паркура в UDK все-таки найти можно. Кто-то говорит, что такую систему можно сделать только в полной версии Unreal Engine с доступом к исходному коду, но я видел множество видео на Youtube, где похожие системы лазанья и беганья по стенам были реализованы в UDK на UnrealScript.



Существует, наверное, два подхода к реализации паркура в UDK. Первый — это когда любая поверхность может рассматриваться в качестве потенциального выступа, за который герой может зацепиться, отпрыгнуть и т.д. Особых трудностей в реализации такого подхода я не вижу (потому как не пробовал еще делать такую систему ;), однако могут возникнуть проблемы с производительностью, т.к. нужно постоянно сканировать поверхности при помощи трассировки луча в разных плоскостях, высчитывать углы наклона для определения пригодных поверхностей и т.д. Кроме того, могут возникнуть трудности на этапе дизайна уровня, ведь может случиться так, что герой сможет пролезть в те места карты, на которых он оказаться не должен. Например, просто выпадет за пределы уровня и полетит в бесконечность.

Второй подход предполагает ручную разметку элементов, за которые герой может цепляться и по которым может карабкаться. Мне как-то этот способ ближе, потому как это даст больше контроля в плане дизайна уровней. Мы всегда будем точно знать, где можно ползать, а где нельзя. Кроме того, мы сможем оптимизировать производительность, т.к. трассировка луча (Trace, Raycast) будет осуществляться только в доступных для лазанья местах.

Далее по ходу разработки я буду говорить именно о втором подходе в создании систем лазанья (climbing, ledge grabbing) и паркура (parkour) в UDK на UnrealScript. В качестве элементов разметки буду использовать свой класс, унаследованный от PhysicsVolume, т.е. специального физического объема, который будет размещаться прямо на уровне поверх основной геометрии и указывать персонажу доступные места для зацепа.

Основная идея довольно проста: когда игрок падает с некоторой высоты и входит в зону выступа (происходит коллизия с физическим объемом — Physics Volime Collision), то начинается трассировка луча (Trace, Raycast) из области самого верхнего положения рук в сторону этого объема. Когда луч попадает в объем, считаем, что персонаж зацепился за выступ (произошел так называемый на форуме UDK «ledge grabbing»), и мы переводим контроллер игрока в состояние «Climbing» («Лазанье»).

Паркур, лазанье, Climbing, ledge grabbing, parkour в UDK

В состоянии Climbing мы переключаем физику Pawn в состояние, отличное от PHYS_Falling или PHYS_Walking. Тут возможны варианты. Можно выбрать то, с чем лично вам удобнее и понятнее работать. Это может быть PHYS_Flying, PHYS_Spider или что-то еще. Далее задаем логику перемещения персонажа и самого Pawn'а в зависимости от требований к своей системе лазанья (UDK climbing system). А именно:
  • можно перемещаться влево и вправо по выступу в висячем положении, задорно дрыгая ножками
  • можно подтянуться и вскарабкаться на выступ
  • можно спрыгнуть с выступа вниз
  • можно набраться сил и сигануть вверх одним мощным рывком до следующего выступа, потратив при этом неимоверное число килокалорий
  • можно развернуться в направлении от стены и сигануть к стене напротив, чтобы уцепиться за другой выступ

По мере развития системы, возможно, придется добавить в нее дополнительную обработку отдельных случаев, как то раскачивание на веревке или перекладине уличного фонаря, скольжение по наклонной веревке и другие возможные в реальной жизни случаи. В общем, следите за обновлениями :)
  • 0
  • 23 сентября 2012, 13:52
  • dimanjy

Комментарии (2)

RSS свернуть / развернуть
+
0
хоть не юзал юдк, но в юнити использование рэйкастов и триггеров ведет прямо к падению производительности, не могли бы вы подсказать как реализовано в миррорс эдж? видел исходники, но не знаю анреал скрипт, хоть логический по именам классов и переменных можно было бы придти к каким то выводам, но я там кроме переменных ничего не понял, может декопилятор не корректно сработал, все равно разобрать ничего не смог) если взгляните на исходники и если вам не трудно могли бы вы отписаться о своём мнений на segizbaev30@gmail.com ?) заранее благодарен)
avatar

GIGABAR

  • 19 октября 2012, 17:26
+
0
Я лучше тут отвечу, дабы как-то поддержать активность на сайте :) Думаю, на любом движке такие вещи делаются при помощи трассировки в том или ином виде. Просто ее нужно хорошенько оптимизировать.

Первый этап — это расстановка триггеров, которые могут грубо подсказать место в пространстве, откуда надо начинать трассировку. Далее можно заметно снизить число трассировок, если запоминать последние координаты. Тогда если разница координат превысит некое пороговое значение, то проводить следующую трассировку, иначе — ждать, пока персонаж переместится на достаточное расстояние.

Если же проводить трассировки каждый тик, да еще на куче персонажей, то конечно производительность снизится. Хотя трассировка луча считается достаточно «дешевой» операцией с точки зрения производительности.
avatar

dimanjy

  • 20 октября 2012, 14:09

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.