Я собирался опубликовать ссылку на блог базы астероидов на врага Уокера, когда заметил, что Кармингтон уже связался со статьей Гамасутры в комментарии.
Вероятно, стоит дать этому немного больше наглядности и объяснения в качестве самостоятельного ответа.
Хитрость - это радиопередачи . Они позволяют вашему коду сканировать линию на предмет столкновения.
Чтобы Уокер хорошо выровнялся по поверхности, они выпускают два луча вниз по местности, один с левой стороны Уокера, а другой - с правой (красные и желтые линии выше).
Из каждого объекта RaycastHit2D можно получить вектор нормали, указывающий перпендикулярно поверхности (пурпурные и зеленые линии). Усредняя нормали по двум ударам, вы получаете подходящую ориентацию для вашего персонажа, которая достаточно отражает основную местность (голубая линия).
Вы можете применить силу вниз вдоль этой линии ориентации, чтобы персонаж застрял на местности (хотя это может привести к некоторому скольжению, если трение низкое), или вручную расположить персонажа в средней точке пересечения луча, как это делается с Уокером.
Вам нужно постепенно смешивать ориентацию персонажа, чтобы персонаж не вибрировал или не выглядел роботизированным (посмотрите, как резко меняется нормаль, когда Уокер пересекает угол, но тело движется плавно).
Если у вас есть острые углы на местности, вы, вероятно, захотите немного повернуть эти лучи внутрь - так, чтобы, если паук прошел мимо края утеса в 90 градусов, нависающий луч попал на поверхность утеса.
Команда Asteroid Base также выпускает короткий луч в направлении движения Уокера (не показано), который перекрывает луч на той стороне, если он попадает на местность. Это гарантирует, что ходок не застрянет при ходьбе в 90-градусный вогнутый угол.
Согласно документам, 2D лучевая передача отличается от трехмерной тем, что она обнаруживает коллайдеры, в которых начинается луч. Это звучит подозрительно для меня, но если ваше тестирование подтвердит это, вы захотите использовать layerMask, чтобы ограничить лучи, чтобы обнаруживать только коллайдеры, которые можно преодолеть.