The problem with falling

Good afternoon. I’m making a ladder and decided that the player will use it, at least for now, without active interaction. I created a Line Trace that checks for a collision with a ladder, after which the player goes into climbing mode. And the problem is that there is a piece of code that moves the player to the stairs exactly so that his hands are on the handrails, however, I noticed that this section of the code does not work if the player jumps onto the stairs or a line collision occurs in a fall. I have not been able to find the reason for this, so I ask for advice on what this bug may be related to.


For reference. This is a collision check. I’m not sure what might be useful, but just in case. It works completely correctly.


Accordingly, here is the code for linking to the stairs.
For reference. I noticed that the code breaks on the “Is Valid?” node when it crashes. If this node is removed from the chain, then when hooked on a ladder in a fall, the player is teleported to certain coordinates. Coordinates that are not even close to the stairs, that is, some kind of crap is happening.

Yes, the ladder is an actor, but it’s called that because it has transformation settings.
If it’s important, I’m making a Side scroller.

Попробуйте использовать для нахождения лестницы вместо Line Trace - Hit Event капсулы персонажа или Sphere Trace . Line Trace очевидно не срабатывает во всех случаях как нужно.

Опробовал и сферу, и Event Hit. Проблема осталась. Не срабатывает Valid только при падении на лестницу.

А на прочие объекты оно вообще реагирует?
Для Hit Event нужно включить Simulation Generates Hit Events в лестнице и капсуле персонажа.
Sphere Trace может сталкиваться с чем-то что находится перед лестницей и дальше не идти, нужно настроить ему игнор лишнего, или использовать Multi Sphere Trace и проверять массив всего что попало в капсулу.

Так суть то в том, что проверяется только тег. Если в объекте который попал в Line Trace есть тег Ladder, то только тогда игрок переходит в режим зацепления. Если эта проверка касается всего остального, то пишется что это не лестница и ничего не происходит. Код дальше идёт на проверку паркура, которая к этому не относится.

Да, я тоже подумал, что возможно меркурий посылает какие-то помехи из-за чего трассировка лагает и подумал, что я замудрил и можно просто через саму лестницу сделать Box Collision, которая при перекрытии передаст персонажу, что нужно зацепиться, но проблема одна и та же. Всё работает корректно, но если игрок цепляется в падении, то по неизвестной причине - код для изменения положения игрока не выполняется. Вернее, при падении Is Valid считает, что лестница вовсе не лестница, поэтому не выполняется код.

Можно скрин содержимого Line Trace From Chest?

А где сетится Ladder Target? Он же по идее после всех проверок должен сетится новым значением из Line Trace-а. :thinking:


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

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

Ну а раз проблема решена, хотел спросить на счёт оптимизации.

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

Предположу, что у вас есть второй вариант использования лестницы - когда вы подходите и нажимаете кнопку, и в этот момент устанавливается значение Ladder Target. Без этой ссылки - чуда не произойдет (с), поэтому логично что вам нужно задать ее значение другим способом, если вы хотите начать взаимодействовать с лестницей другим способом.

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

И как я сказал выше, устанавливайте Ladder Target после Line Trace и ПОСЛЕ всех проверок (проверки тега).
И вероятно стоит изменить тип переменной Ladder Target с Actor на BP_ProceduralLadderOnLine.

Касаемо оптимизации - настоятельно рекомендую делать только один Line Trace, затем сохранить его результат в переменную, и затем проверять все значения из переменной. Не нужно заново делать Line Trace при проверке лестницы, паркура и т.п.
Line Trace не самая дешевая операция, и в данном случае достаточно одного раза.

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

2 Likes

А вы проницательны.
Но на самом деле проблема с этим таргетом была ещё проще. Эта конкретная лестница нигде не записывалась, кроме интерфейса, который привязан к общему актёру. То есть, да, мне стоило пересмотреть что я вообще сделал, чтобы понять в чём ошибка.

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

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

Ещё раз спасибо за помощь.