Как ограничить движение персонажа, чтобы он не мог проходить сквозь стены?

Как можно улучшить код взаимодействия с картой для устранения проблем? Тайлы у меня имеют размер 8 на 8, и у меня возникают некоторые проблемы с текущей реализацией.
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
  • 27 января 2024 г. 21:48
Ответы на вопрос 2
Ограничить движение персонажа так, чтобы он не мог проходить сквозь стены, можно несколькими способами, в зависимости от того, какая у вас платформа и что за игровой движок или технологии используются. Ниже приведены общие принципы и подходы, которые могут быть применимы в различных средах.

1. **Физический движок (Physics Engine):**
   Если вы используете игровой движок с поддержкой физики, такой как Unity или Unreal Engine, вы можете использовать встроенные компоненты физики для обработки столкновений. У стен должны быть коллайдеры (colliders), которые предотвращают проникновение объектов с ригидбоди (Rigidbody) через них. Убедитесь, что у персонажа тоже есть коллайдер и, если необходимо, ригидбоди с включенной опцией "Is Kinematic" для управляемого персонажа, чтобы предотвратить физическое проникновение.

2. **Коллайдеры без физического движка:**
   Если физический движок недоступен, можно разместить коллайдеры вручную и проверять столкновения, обновляя положение персонажа. Перед тем, как осуществить перемещение, проверьте, не пересекает ли предполагаемая новая позиция персонажа какие-либо коллайдеры стен. Если пересечение обнаружено, движение в этом направлении должно быть заблокировано или ограничено.

3. **Поиск пути (Pathfinding):**
   Используйте алгоритмы поиска пути, такие как A* или Dijkstra, для определения допустимых путей на карте. Вы можете определить карту сетки (grid map), где каждый тайл будет иметь состояние "проходимо" или "непроходимо". Алгоритм поиска пути будет обходить непроходимые тайлы, обеспечивая перемещение персонажа только по проходимым маршрутам.

4. **Ручная проверка плиток (Tile-based collision checking):**
   При движении персонажа проверяйте, является ли тайл, на который он собирается ступить, стеной или нет. Если это стена, не разрешайте персонажу туда перемещаться. Этот метод требует структуры данных (например, двумерного массива), которая отслеживает тип каждого тайла на карте.

Для улучшения кода взаимодействия с картой, особенно если у вас возникают проблемы с текущей реализацией, следуйте этим рекомендациям:

- Убедитесь в точности и корректности данных о карте и стенах, а также в том, что тайлы правильно синхронизированы с логикой столкновений.
- Проверьте расчёты сетки, особенно если у вас динамически генерируемая карта или меняющиеся условия игрового мира.
- Оптимизируйте алгоритмы проверки столкновений, чтобы избежать лишних вычислений — например, проверяйте столкнов
Если отбросить в сторону общую упоротость кода (облом делать ревизию), проблема вот в чём. 
Работая с коллайдером (фигурой, которая участвует в проверке столкновений, она же хитбокс), вы выбрали диапазон клеток
[y / 16; (y + h) / 16).

Например, y = 1, h = 16, (y+h)/16 = 1, диапозон [0,1), и проверяется только клетка 0.

А надо [y / 16; (y + h - 1) / 16]. ВКЛЮЧАЯ СПРАВА.
Похожие вопросы