Как мне сделать персонажа способным ходить по стенам?

34

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

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

Я изучил различные компоненты Unity 2D, но с небольшим успехом. :(

Большинство границ моего столкновения в мире отмечены компонентами Collider 2D (которые прекрасно работают с простым шаром, на который влияет гравитация, но в меньшей степени с этим персонажем-пауком).

pyko
источник
1
Эта игра: youtube.com/watch?v=ga4Zqq1tXa8 («Паук» на PS1, я играл в нее давным-давно) может быть источником вдохновения.
tigrou

Ответы:

43

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

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

Я хожу по лучам, о-о!

Хитрость - это радиопередачи . Они позволяют вашему коду сканировать линию на предмет столкновения.

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

Из каждого объекта RaycastHit2D можно получить вектор нормали, указывающий перпендикулярно поверхности (пурпурные и зеленые линии). Усредняя нормали по двум ударам, вы получаете подходящую ориентацию для вашего персонажа, которая достаточно отражает основную местность (голубая линия).

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

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

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

Команда Asteroid Base также выпускает короткий луч в направлении движения Уокера (не показано), который перекрывает луч на той стороне, если он попадает на местность. Это гарантирует, что ходок не застрянет при ходьбе в 90-градусный вогнутый угол.

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

Д.М.Григорий
источник
Я могу подтвердить, что 2D Raycast обнаружит коллайдеры, которые содержат начальную точку Raycast. Это может быть легко отфильтровано, так как это первое обнаружение всегда возвращается с расстоянием 0 и нормалью, противоположной направлению лучевой передачи.
XenoRo
2

Вам понадобится специальный код для этого.

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

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

karmington
источник
2
Вот очень хорошая ссылка, не уверенная, подходит ли она именно к вашему случаю, но, может быть, может быть ... gamasutra.com/blogs/AdamWinkels/20140220/211306/…
karmington