Как сделать БЕГ ПО СТЕНЕ в Unreal Engine | Wall Run Tutorial | Уроки для новичков

Как сделать БЕГ ПО СТЕНЕ в Unreal Engine | Wall Run Tutorial | Уроки для новичков23:36

Информация о загрузке и деталях видео Как сделать БЕГ ПО СТЕНЕ в Unreal Engine | Wall Run Tutorial | Уроки для новичков

Автор:

MakeYourGame! — Уроки Unreal Engine

Дата публикации:

10.04.2025

Просмотров:

2.3K

Транскрибация видео

Игроделы, привет!

И в сегодняшнем видео мы с вами реализуем бег по стене.

Вот, то есть таким вот образом у нас это будет выглядеть.

Мы сможем от стены в любой момент отцепляться, то есть допустим бежим, нажали, все, он отцепился.

Ну, в принципе такая стандартная система, которая работает, на мой взгляд, довольно неплохо.

Вот, поэтому прежде чем начать, подписывайтесь на канал, вступайте в закрытый телерамчат, подписывайтесь на бусти, все стандартно, чтобы получать видео уроки, которых не будет на ютубе.

Ну а мы с вами приступаем.

Итак, в первую очередь найдите анимации, которые будут использоваться.

В частности, рекомендую вам найти или, если есть возможность, сделать следующие анимации.

Непосредственно сам бег.

И самое главное, что должно быть у вас в анимации.

У вас анимации должны быть, давайте я сейчас зайду.

Ваши анимации должны выглядеть таким образом, чтобы как будто бы

ваш персонаж, он бежал на одном месте.

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

Вы, конечно, можете здесь, где enable root motion, галочку нажать, но я не думаю, что это даст вам какой-то хороший результат.

Но, тем не менее, если вы нажмете галочку, да, у вас он будет на одном месте вот так вот.

Бежать, супер, анимация подходит, все замечательно, но опять же, если оно сбежит и потом возвращается прямо в режиме просмотра, то анимация вам не подойдет.

Ну и давайте в общем-то приступать к созданию нашей вот этой вот системы.

Переходим в блюпринт вашего персонажа, BPF Person Character.

Так, давайте спускаемся куда-нибудь ниже.

И, соответственно, мы начнем с того, что нам вообще в целом нужно определять стену, по которой мы можем бежать.

Это мы будем делать с помощью трейсов.

Поэтому давайте мы создадим отдельную кнопку.

Перейдем, получается, в Input, Actions, правая кнопка мыши, Input, Input Action, EA, Move, Move Wall, давайте так назовем.

Теперь переходим в AMS Default.

Нажимаем здесь плюс.

Выбираем EA Move Wall.

И пусть это будет у меня на клавишу F, допустим.

Давайте нажимаем Shift.

Shift, я думаю, будет намного правильнее.

Итак, нажимаю сюда и Left Shift.

Если вдруг вы не знаете, как вообще с этим Enhanced Input работает, со всей этой штукой, вы можете пойти другим путем.

Вы можете перейти в персонажа, правая кнопка мыши, Left Shift.

shift таким вот образом и логику эту делать здесь да но тем не менее давайте лучше через вот эти инпуты работать и так давайте теперь создадим следующую логику правая кнопка мыши и эй move wall выбираем вот это раскрываем и нам нужно здесь эту логику тащить из старта потому что если будет триггер то у нас анимация будет себя прерывать постоянно общем-то триггер он работает каждый кадр мне это не нужно нам нужно здесь сделать старт но

Я хочу сделать таким образом, чтобы я мог бежать по стене только в тот момент, когда мой персонаж двигается.

Потому что если мы будем на месте стоять и бежать по стене, то это будет выглядеть странно.

Поэтому здесь правая кнопка мыши, получаем Get Velocity, получаем скорость нашего персонажа.

Здесь получаем вектор скорости.

Вектор Length, получаем длину нашего вектора.

И получается здесь делаем следующую проверку.

Ставим здесь больше нуля.

То есть если наша скорость больше нуля, то есть длина нашего вектора больше нуля, значит мы в движении, значит мы можем бежать по стене.

Дальше здесь вытаскиваем, прописываем Branch.

Из Started обязательно кидаем вот сюда, не из Triggered, а из Started.

После этого здесь, где у нас True, мы выкидываем...

Sequence, секвенцию.

И теперь давайте создадим Line Trace.

Давайте я сейчас сначала создам его, а потом покажу, что мы этим всем достигли.

Так, выбирайте здесь Line Trace by Channel, не Multi Trace.

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

Потому что вы невнимательны.

Итак, смотрите, дальше здесь выбираем Mesh.

Дальше здесь вытаскиваем get world location.

Получаем локацию.

Это у нас start.

После этого мы здесь вытаскиваем, прописываем get forward vector.

Получаем передний вектор.

Здесь дальше снова из меша.

Get right vector.

После этого здесь эти все значения мы прибавляем.

Прописываем add.

Прибавляем.

И здесь тоже мы ставим плюс.

Это прибавляем.

это вот сюда и ставим drop debug type на for duration и здесь забыл саму длину трейса указать давайте я подвину здесь получается ставим multiply умножить нажимаем вот сюда правой кнопкой мыши to float и ставим здесь значение пусть будет 100 это сюда

И, в принципе, да.

Давайте скомпилируем, сохраним, покажу, что мы этим достигли.

То есть я бегу, нажимаю Shift, и вот мы видим, что у нас появляется такой вот луч.

То есть это у нас с левой стороны, и этот луч, он будет определять нашу стенку.

То есть почему он у нас именно такой как бы...

Ну, под углом, да?

Потому что если, в общем-то, мой трейс зафиксирует, он чуть-чуть идет наперед нашего персонажа.

Если он увидит трейс впереди, что пусто, нету стены, по которой можно бежать, то в таком случае все, мы как бы отменяем нашу вот эту вот анимацию движения по стене.

Поэтому вот такого трейса мы специально его и создали.

Давайте я даже здесь пропишу это.

Давайте я как-нибудь скомпоную.

Как-нибудь поближе это все сделаю.

Вообще, конечно, в идеале это все в функцию лучше бы превратить.

Ну, ладно, в общем.

Давайте вот так вот сделаем.

Выделим это.

И пусть это будет у нас называться left trace.

После этого здесь вытаскиваем branch.

Проверяем, есть ли у нас столкновение.

Дальше.

Здесь прописываем break hit result.

Нажимаем сюда.

Открываем стрелку.

И смотрите, нам нужно как бы тут уже...

зависимости от ваших целей если вы хотите вы можете чтоб он мог бежать по абсолютно любой стене до ваш персонаж пожалуйста я хочу сделать таким образом чтобы он не по каждой поверхности не по каждой стене мог бежать а по каким-то конкретным поэтому здесь где у нас архитектор я здесь прописываю actor с так и давайте здесь укажем с вами так пусть будет называться просто вол и давайте мы сейчас сделаем таким образом

Мы возьмем вот эту стенку.

Давайте мы ее как-нибудь сплющим.

Вот так вот.

Ну, давайте я вытащу.

Вот так вот поставлю где-нибудь здесь.

Дальше.

Я выберу вкладку Details здесь.

В поиске я пропишу тег, выбрав опять же эту стенку.

И здесь где Actor, Text, я здесь этот тег пропишу.

То есть я возьму, пропишу здесь тоже Wall.

Так, все, сохраним здесь все это дело.

Переходим сюда.

И здесь тоже делаем проверку.

Прописываем Branch.

Это вот сюда.

То есть если у нас столкновение со стеной, по которой мы можем бежать, то делай соответствующую логику.

Что за логика?

Смотрите, нам нужно получить нормаль нашего...

объекта с которым мы столкнулись и нам нужно в общем-то прописываем rotation from x вектор выбираем и нам нужно устанавливать поворот нашего актора в зависимости от поворота нашего этого нашего объекта с которым мы как бы соприкоснулись для этого нажимаем здесь правая кнопка мыши сплит но я не буду сейчас сильно на этом останавливаться долго объяснять и здесь мы

прибавляем и прописываем минус минус 90 до чтобы он точно бежал по нашей стене после этого права кнопка мыши сет актор сет актор rotation true кидаем вот сюда правая кнопка мыши сплетим и получается это подаем вот сюда вот взят и соответственно если мы уже бежим по стене то я не хочу чтобы я снова там мог прыгать или еще что то поэтому сделать где здесь variable с нажимаем плюс и пусть будет называться у нас это переменная by can

в пол давайте так ран волк перетаскиваем это вот сюда ставим здесь сет и давайте здесь еще раз сделаем так вот вытащим это только уже здесь get вытаскиваем прописываем branch и

Это получается вот сюда, и это получается вот сюда.

То есть если мы уже бежим по стене, то в таком случае не беги по стене еще раз.

С этим мы потом разберемся, то есть пока что оставляем таким образом.

И нам нужно здесь указать, что это у нас левый трейс, поэтому нажимаем здесь плюс и прописываем b, left, left, left.

таким образом вытаскиваем это делаем сет это вот сюда галочку здесь ставим то что мы бежим по левой как бы по левой стороне и нам здесь нужно поставить такую вещь как lounge

То есть нам нужно запускать нашего персонажа, когда мы начинаем бежать, чтобы его как бы так вот пульнуло.

Нажимаем здесь правой кнопкой мыши, сплитим.

И здесь Launch Velocity Z мы можем поставить, допустим, 850.

Давайте поставим.

И еще момент.

Дело в том, что если мы оставим таким образом, потом когда все сделаем, то когда он будет бежать у нас по стене, я буду крутить мышкой, то мой персонаж будет тоже крутиться вслед за мышкой.

То есть он, по сути, будет от стены отцепляться.

Поэтому, чтобы этого не было, мы берем здесь Character Movement.

И здесь прописываем Set, точнее Orient, Rotation to Movement.

Да, вот берем Set, Orient, Rotation to Movement.

Это выделяем и галочку здесь отключаем.

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

Теперь мы берем вот это вот все дело.

Получается, да, берем все, вот это вот выделяем до вот этой секвенции.

Ctrl-C, спускаемся ниже.

получается мы теперь это тянем вот сюда единственно что мы здесь меняем так получается где у нас здесь меняем минус 90 на 90 и еще мы здесь инвертируем вот эти вот векторы дам то есть чтобы у нас шло в другую сторону то есть у нас левый 3 сейчас нужно это все сделать право 3 поэтому мы берем get forward вектор

Ставим умножить.

Правая кнопка мыши.

To float.

И ставим здесь минус 1.

То есть, по сути, там, где у нас было 1, там у нас станет минус 1.

Так, это теперь вот сюда просовываем.

Так, идем с вами дальше.

И здесь left wall.

Мы здесь это удаляем.

Получается, давайте вот это вот нажмем.

Ctrl D. И пусть будет называться B.

Right Wall, таким образом.

Вытаскиваем, ставим Set, это вот сюда, галочку ставим, это сюда.

И давайте теперь спустимся чуть-чуть пониже, ну давайте вот здесь, где у нас Move Wall, правая кнопка мыши, Event On, Landed вызовем.

То есть я хочу, чтобы когда я приземлился, уже после того, как я там пробежал по стене, либо когда я просто на земле,

Чтобы я мог делать бег по стене.

Потому что если я сейчас этого не сделаю, то я даже пока буду бежать по стене и нажму еще Shift, он будет еще выше, выше подниматься.

В общем-то логика у нас будет поломана.

Поэтому здесь получается мы Left Wall ставим в Set.

Так, дальше Right Wall тоже берем, вытаскиваем, ставим тоже Set.

И пока мы на стене, нам нужна вот эта вот Beacon Wall Run.

Берем Set и здесь галочку с вами ставим.

И еще буквально момент.

Мы берем здесь вот этот Orient Rotation to Movement, Ctrl-C.

Вставляем это вот сюда, но здесь галочку уже ставим.

Это вот сюда.

И теперь я хочу, чтобы пока я бегу по стене, чтобы я не мог ходить там влево, вправо.

Это будет максимально странно.

Поэтому поднимаемся, где у вас здесь movement input, где у вас управление вашим персонажем.

Давайте это куда-нибудь сюда оттащим.

Здесь вытаскиваем, прописываем sequence.

Далее здесь я достаю branch.

Бросовываю это вот сюда.

и просовываю это теперь вот сюда.

И здесь получается be can run walk, я просовываю здесь.

Так, давайте пока что оставим это таким образом, то есть тут, наверное, что-то нам нужно будет поменять, но давайте так пока сделаем, если что, к этому вернемся.

Итак, возвращаемся теперь обратно, где у нас здесь move wall, и нам нужно как бы возможность, чтобы пока мы бежим,

Ну, если мы отпустим клавишу Shift, чтобы мы останавливали наше движение и чтобы персонаж наш как бы падал, да.

Поэтому здесь, получается, берем Left Wall.

get, right wall, get, соответственно здесь прописываем or boolean, это вот сюда, и получается здесь где cancelled, прописываем branch, completed тоже, то есть это опять же два таких пина, когда мы отменяем наше действие, то что-то должно происходить, соответственно это вот сюда, если мы в процессе бега по стене, то есть мы бежим по левой, либо по правой стене,

И в таком случае, если мы бежим и отпускаем кнопку, то мы здесь прописываем stop movement immediately, останови движение незамедлительно.

И нужна новая переменная, давайте нажимаем здесь плюс, пусть будет называться b, stop wall run.

Галочку здесь, ну точнее вытаскиваем, ставим здесь set.

Это вот сюда.

Галочку здесь ставим.

После этого вытаскиваем это теперь вот сюда.

То есть, чтобы у нас потом, когда мы прекратим, ну отменим действие, да.

Чтобы мы могли снова по нашей стене бежать.

Поэтому давайте мы вот это чуть-чуть тоже берем, отодвигаем.

Как-нибудь вот так вот.

И если мы отменяем это все дело, в общем, берем B, Stop Wall Run, Set, это вот сюда в True, галочку здесь не ставим, и просовываем это сюда.

Давайте, в общем-то, посмотрим, как это у нас выглядит, скомпилируем, сохраним.

Давайте мы вот эту вот стенку тоже возьмем, продублируем, Ctrl-D как-нибудь вот так вот.

Давайте пол я тоже как-нибудь извращу, чтобы прям вот, давайте, это вот сюда как-нибудь, да, дальше Ctrl-D.

Вот так вот сделаем.

Давайте проверим.

Запускаем.

Так, у меня пока что, да, у меня какая-то проблема здесь.

Да, у меня проблема с управлением.

Давайте это все дело решаем.

Нажимаем Escape, переходим в BP for Person Character.

Во-первых, нам нужно, где у нас здесь B, Can Walk Run.

чтобы мы по умолчанию могли бегать, да, то есть, когда мы начинаем игру, нажимаем здесь галочку, и давайте еще раз проверим, скомпилируем, переходим, запускаем, да, управление у нас тоже еще до сих пор какое-то сломанное, давайте переходим в BP for person character снова, здесь где у нас секвенс, то, что мы делали, да, все-таки нам тогда нужен вот этот forward-backward, берем, давайте его как-нибудь вниз сюда вот поставим, и где у нас здесь секвенс,

Это просунем вот сюда, то есть чтобы у нас здесь вот этой вот связи, условно говоря, вот этой, да, чтобы у нас вот так вот не было, да, то есть мы эту связь отключаем, ставим здесь, таким вот образом.

Давайте скомпилируем.

переходим так управление у нас теперь есть если я нажимаю shift мы видим то что у нас работает два трейса которые определяют нашу стенку теперь давайте подходим нажимаем shift и вот мы видим то что нашего персонажа начинает таким вот образом запускать опять же это не я прыгаю это мой персонаж его самостоятельно так вот запускает в принципе то что и нужно если вы хотите регулировать гибко получается

насколько далеко ваш персонаж может запуляться, то вам нужно, получается, где у нас здесь «Launch Character», вот этого дела вам нужно здесь устанавливать.

Теперь давайте поработаем над анимациями.

Давайте мы нажмем, где у нас «Mesh».

Перейдем вот сюда.

Выбираем наш анимационный блюпринт.

Опять же, у меня это шаблонный проект, я выбираю BP Manny, потому что Queen наследуется от Manny, поэтому выбираем это нашего Manny, потому что здесь вся логика, и эта логика, она в том числе распространяется еще и на Queen, на нашего персонажа.

Вы заходите в своего персонажа.

Опять же, это базовые вещи, я про них неоднократно говорил.

Итак, здесь все, что нам нужно сделать, это получается Cast to Character.

Здесь это удаляем и прописываем здесь

получается Cast to BP, Fair Person Corrector.

Вы делаете каст на вашего персонажа.

Нажимаем вот сюда, просовываем это сюда, это вот сюда, это вот сюда.

Давайте это мы немножко так вот подвинем.

Так, это получается вот сюда.

Ну и нам здесь нужно достать несколько переменных.

Во-первых, write wall, get write wall.

Давайте превратим это в переменную.

Вытаскиваем, promote to variable, оставляем таким образом.

Здесь, где у нас секвенция, нажимаем вот сюда.

Это получается.

Просовываем здесь.

То есть, где у вас здесь Update Animation, мы это все дело подаем вот сюда.

Дальше.

Отсюда мы вытаскиваем то же самое.

Left.

Wall.

Вытаскиваем.

Тоже делаем Promote to Variable.

Это вот сюда.

Единственное, чтобы не путаться, у нас здесь один RightWall, это идет из нашего блюпринта нашего персонажа, второй LeftWall тоже из нашего персонажа, а это уже переменные, которые внутри анимационного блюпринта.

Поэтому давайте мы, чтобы как-то не было путаницы, мы где у нас RightWall, мы здесь пропишем ABP, AnimationBlueprint, да?

Дальше нажимаем сюда.

И здесь мы прописываем тоже ABP Left Wall.

Просто чтобы мы как-то это все дело разграничивали.

И теперь тоже отсюда вытаскиваем.

Давайте пропишем Wall.

Я уже не помню там все переменные.

Да, берем Get Stop Wall Run.

И тоже Promote to Variable.

И давайте назовем это получается ABP Stop Wall Run.

ран таким образом и это вот сюда все то есть такая конструкция должна получиться имейте ввиду да давайте вот еще так вот покажу что вы здесь ничего не перепутали компилируем сохраняем теперь переходим получается в анимграф после этого переходим в мейн стоит то есть где у вас состояние там прыжка где у вас состояние там ходьбы и прочее прочее то есть опять же это

шаблонный проект у вас есть какой-то свой персонаж то имейте ввиду то что я думаю то что у вас уже вот эти вот все штучки они у вас есть да то есть которые смешиваются между собой там ходьба бег и прочее прочее после этого я здесь достаю мою анимацию бега по левой стене вот сюда закидываю даже несмотря на то то что он там показывает якобы ошибка ничего страшного в этом нету переходим теперь сюда два раза и здесь мы выбираем loop animation нажимаем вот сюда и

Компилируем, сохраняем.

Так, переходим обратно в States.

Теперь сюда кидаем уже R, то есть Right по правой стене.

Делаем то же самое, переходим сюда.

Так, получается здесь то же самое.

Ставим Loop Animation, галочку.

Компилируем, сохраняем тоже.

Переходим теперь обратно сюда.

Давайте это вот сюда как-нибудь пониже.

Это тоже как-нибудь вот сюда.

Теперь тащим это вот сюда в Jump.

это вот сюда после этого это в лент это тоже тащим вот сюда в лент после этого переходим вот сюда где у нас смена состояний здесь left wall кидаем вот сюда компилируем возвращаемся обратно нажимаем теперь вот сюда здесь у нас right wall это кидаем здесь компилируем тоже переходим обратно теперь переходим вот сюда здесь правая кнопка мыши прописываем

fallen дальше здесь у нас обе писток вал ран тоже get здесь прописываем or буллин контролом это вот сюда и

Здесь над, в общем-то мы просто задаем логику, что если мы, как бы, давайте над буллин, это вот сюда, если мы отменяем действия, и в таком случае, как бы, ну, делай логику приземления.

Давайте это вот сюда, компилируем, переходим теперь обратно в main states, теперь это вот сюда, здесь сделаем то же самое, правая кнопка мыши.

is get is fallen здесь также прописываем над буллинг дальше stop will run get здесь прописываем or буллинг давайте контролом это вот сюда это вот сюда это сюда компилируем сохраняем переходим обратно в main states и тут есть небольшая ошибка нам вот это вот нужно скопировать

Давайте переходим обратно.

Альтом это отключаем.

То есть, у нас, видите, связь идет отсюда, вон туда в джамп.

Нам это не нужно, поэтому это удаляем.

Это вот сюда.

То есть, наоборот, в эту сторону заходим.

Вставляем это сюда.

Дальше компилируем, сохраняем.

В принципе, да.

Так, давайте еще раз сюда нажму.

Убедитесь, что у вас вот такие вот связи здесь состоят.

Потому что, если что-то у вас здесь будет неправильно, то, ну, соответственно...

Будет не очень хороший результат.

Давайте переходим, запускаем, проверим, как это все у нас теперь будет работать.

Нажимаю Shift, вот он, соответственно, бежит.

Я отпустил кнопку, все отлично.

Давайте теперь с этой стороны, тоже Shift, все отлично, все хорошо.

Давайте единственное, что я теперь вот эти вот, вот эту немножко платформу подвину.

Давайте так сделаем.

Все, нажимаю Shift, он бежит.

Но теперь видим проблему, что у нас что-то с управлением.

Давайте это сейчас решим.

Нажимаем Escape, переходим в BP First Person Character.

И нам нужно здесь, где получается Event On Landed, галочку здесь включить.

Нажимаем, компилируем, сохраняем.

Переходим в игру, давайте проверим.

Вот бежим.

Все отлично.

Давайте теперь по этой стороне.

Да, тоже все хорошо.

Единственное, что да, мы видим то, что у нас немного рука, как будто бы она проваливается.

Проваливается через нашу вот эту вот стенку.

Давайте тоже решим.

Переходим в BP Person Character.

Соответственно, если мы бежим по стене, давайте мы...

получается найдем получается что мы стену нашу обнаружили выберем здесь получается капсул компонент посмотрим по умолчанию у нас здесь получается радиус 35 давайте вопрос скопирую и здесь я пропишу сет капсул радиус давайте поставим я щас проверю просто давайте капсул компонент и

Давайте поставим какой-нибудь такой вот толстый, ну, давайте 60 поставим, Ctrl-Z, переходим обратно, здесь ставим, получается, 60.

Просовываю это теперь вот сюда.

Это вот сюда.

Так, если же мы отпускаем эту кнопку, то нам в таком случае, давайте так вот сделаем, нам нужно, давайте, в общем-то, тоже вытащим наш этот капсул-компонент.

Set.

SetRadius.

Здесь поставим значение 35.

Это вот сюда.

Это вот сюда.

Это вот сюда.

Так, и получается нам нужно вот это все взять.

Ctrl-C. И перетащить теперь это тоже вот сюда.

Давайте это сюда.

Это вот сюда.

Давайте проверим, скомпилируем.

Запустим.

Проверим, как это будет работать.

Да, вот мы видим то, что теперь у нас

Да, то, что теперь у нас нормально, рука, она цепляется туда, куда мне необходимо.

Поэтому на этом у меня все, не забывайте подписываться на канал, вступайте в закрытый телеграм-чат, подписывайтесь на бусти, все стандартно.

Ну а мы с вами увидимся в следующем видео и до новых встреч.