Как осуществить перемещение объектов курсором без их задевания и пересечения с коллайдерами?

Как можно изменить код движения объектов, чтобы они не выходили за пределы игрового поля, при взаимодействии с другими объектами, имеющими коллайдеры?
  • 17 сентября 2023 г. 17:57
Ответы на вопрос 2
Для перемещения объекта курсором без его задевания и пересечения с коллайдерами можно использовать два подхода: 

1. Игнорирование коллайдеров при перемещении: 
- Включите опцию "Is Trigger" для коллайдера объекта, чтобы они не сталкивались с другими коллайдерами в игре.
- Создайте скрипт для курсора, который будет перемещать объект на новую позицию, учитывая только позицию курсора, а не коллайдеры на пути.
- Вся логика проверки столкновений и предотвращения выхода объекта за пределы игрового поля должна быть реализована внутри скрипта перемещаемого объекта.

2. Использование Raycast:
- Создайте скрипт для курсора, который будет выпускать лучи из текущей позиции курсора и определять, есть ли на пути этих лучей коллайдеры.
- Если луч не пересекается с каким-либо коллайдером, перемещайте объект на новую позицию.
- Если луч пересекается с коллайдером, объект не перемещается или перемещается на новую позицию, которая не пересекается с коллайдером.
- Вся логика проверки предотвращения выхода объекта за пределы игрового поля должна быть реализована внутри скрипта перемещаемого объекта.

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

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

2. Размеры игрового поля:
- Определите границы игрового поля, например, используя переменные minX, maxX, minY и maxY.
- При перемещении объекта проверяйте, чтобы его новая позиция не выходила за пределы игрового поля, основываясь на границах, определенных ранее.
- Если новая позиция выходит за пределы игрового поля, отмените перемещение или переместите объект на новую позицию, которая не выходит за пределы игрового поля.


Оба этих подхода могут быть реализованы с использованием Unity API, таких как Raycast, OnCollisionEnter(), OnCollisionStay(), OnCollisionExit() и т.д., а также с помощью математики и проверок условий.
- Нажатие и перемещение мыши вызывает функцию OnMouseDrag().
- Получаем новую позицию объекта в мировых координатах по позиции мыши на экране.
- Ограничиваем новую позицию по оси X в диапазоне от -2.73 до 2.84 и по оси Y в диапазоне от -4.94 до 2.21.
- Проверяем, есть ли коллайдер, на который попали из новой позиции мыши.
- Если есть доступ для перемещения, то проверяем, не совпадает ли попавший коллайдер с текущим объектом.
- Если коллайдера нет, либо это текущий объект, то плавно перемещаемся от текущей позиции к новой позиции с помощью функции SmoothDamp.
- Используем MovePosition для изменения позиции объекта.
- Функция CheckAccessMove проверяет, есть ли препятствия между текущей позицией объекта и новой позицией мыши.
- Создаем луч от текущей позиции до новой позиции и получаем все объекты, через которые проходит луч.
- Проверяем каждый объект на принадлежность к текущему объекту и на его наличие.
- Если объект не является текущим объектом и существует, то возвращаем false, т.е. доступ к перемещению запрещен.
- Если все проверки пройдены, то возвращаем true, т.е. доступ к перемещению разрешен.
Похожие вопросы