Вся беда заключается в том, что в игре нет смысла программировать внутренность, например, стены - зачем, если игрок её не видит и никак с ней не взаимодействует? Только лишняя трата ресурсов.
И второй момент - и персонажа, и окружающий мир нет смысла программировать вплоть до мельчайших деталей. И обычно их, скажем так, физические модели, области, которые непосредственно между собой взаимодействуют - это что-то простое, вроде прямоугольника, цилиндра или капсулы.
Например, вот:
Взаимодействие между объектами в этом случае описывается очень просто - когда квадрат (или круг) персонажа приблизится к капсуле стены - сработает скрипт, который не даст персонажу двигаться дальше в этом направлении. При этом визуально моделька персонажа и моделька стены могут совпадать так строго (например, подойдя к нижнему левому углу стены, персонаж не будет её касаться головой, но пройти дальше уже не сможет - рисунки ещё не пересеклись, а их коллайдеры (это вот эти самые фигуры) - уже взаимодействуют.
Ну и давайте посмотрим, как это работает, например, в Марио.
Коллайдер Марио (квадрат) приближается к коллайдеру стены (тоже квадрат). Игра это видит, и спустя мгновение вычислений процессор даёт команду - оттолкнуть игрока от стены. И вот в игре про Марио это было реализовано очень просто - игра толкала Марио в сторону спины. Но фокус заключался в том, что если вот в то мгновение, когда процессор делает расчёты, развернуться в другую сторону, то игра всё равно толкнёт игрока в сторону спины - то есть, его буквально затянет в стену.
Именно на этом явлении строятся все современные спидраны этой игры. В современных играх происходит похожий процесс - коллайдеры персонажа и стены сталкиваются. Но тот кусок кода, который отвечает за их взаимодействие не сразу срабатывает, или срабатывает с какой-то ошибкой, ну или само столкновение этих коллайдеров проходит как-то не так, как задумывалось - в современных играх много сложных объектов и достаточно тяжело предусмотреть абсолютно все варианты. И в результате игрок не отталкивается от стены, не упирается в неё, а начинает проходить сквозь неё - и только потом приходит команда "стоп, стена". В итоге моделька или оказывается за стеной, или стена прямо внутри модельки (это как раз случай с зависанием), либо её всё-таки выбрасывает назад, как и должно было быть по изначальной задумке.
Как-то так.