Физика: выбрать тело, форму и запрос
С чего начать коллизии 2D/3D: назначение тел, слои, физический шаг и рабочие примеры.
Выберите задачу
| Нужно | Используйте |
|---|---|
| Неподвижная стена или пол | StaticBody2D/3D и дочерняя форма коллизии |
| Персонаж под управлением кода | CharacterBody2D/3D; движение через методы тела в _PhysicsProcess |
| Ящик, который падает и реагирует на удар | RigidBody2D/3D; силы, импульсы и физический интегратор |
| Движущаяся платформа | AnimatableBody2D/3D с согласованным физическим движением |
| Зона урона, подбора или гравитации | Area2D/3D; обнаружение пересечения отдельно от блокирования |
| Проверка видимости, прицел или выбор мышью | RayCast2D/3D либо запрос DirectSpaceState |
Entity2D/3D, Sprite и MeshInstance сами по себе не становятся физическими телами. CollisionShape тоже не заменяет тело: это дочерняя сущность с ресурсом Shape. Видимая модель и геометрия столкновений настраиваются отдельно.
Начать с работающего уровня
Откройте пример коллизий 2D: он сам создаёт пол, стену, падающее тело, зону и луч. Для пространственной сцены используйте пример 3D. Там же приведены все необходимые C#-файлы, тип корня и ожидаемый результат. В примерах нет внешних изображений и моделей.
Персонажа удобнее изучать на полной игре 2D или полной игре 3D: там есть ввод, движение, столкновения и перезапуск. Для существующего проекта сначала проверьте частоту физики, гравитацию и используемый backend.
Что проверять у каждой пары объектов
У тела/зоны должны быть включённые дочерние формы с ненулевыми размерами и правильным положением. Layer задаёт принадлежность, Mask — фильтр того, что объект обнаруживает или с чем взаимодействует. Номер слоя 3 — бит 1 << 2, то есть значение 4, а не маска 3. Для редакторских слоёв 1–32 используйте SetCollisionLayerValue/SetCollisionMaskValue; не сдвигайте номер повторно.
У зоны обнаружение направленное: её Mask проверяется против Layer цели. У луча есть собственные Mask и выбор тел/зон. Для физических тел учитываются фильтры обоих участников по правилам backend; не требуйте автоматически две одинаковые маски. В примерах пол имеет Layer 1, Mask 0, а ящик Layer 4, Mask 1 — контакт есть. Подробности и диагностика: зоны, лучи.
Физическое время и единицы
_PhysicsProcess получает фиксированный шаг, _Process зависит от отрисовки. Частота задаётся physics/common/physics_ticks_per_second; примеры проверены при 60 шагах/с, гравитации 980 вниз в 2D и 9.8 вниз в 3D. Это настройки примера, а не обязательные значения для любой игры. В 2D обычно считают в пикселях, в 3D — в метрах; сам Vector не проверяет выбранную вами систему единиц. Положительный Y 2D направлен вниз, положительный Y 3D — вверх.
Скорость задавайте в единицах за секунду. Способ применения delta зависит от метода: CharacterBody.Velocity и ApplyCentralForce не нужно заранее превращать в перемещение за кадр. Импульс задаётся один раз на событие. Управление твёрдым телом разбирает эти различия.
Физические события и результаты не обновляются синхронно с каждой строкой кода. После добавления/перемещения формы дождитесь нужного физического шага. Отложенное изменение, физическая интерполяция и сетевая синхронизация решают разные задачи; интерполяция не добавляет точности контактам. Если поведение неверно, начните с проверок причин, а не с увеличения всех числовых настроек.