Прыжок, приземление сверху и отскок
Скорость прыжка, контактные нормали и проверка реального столкновения после MoveAndSlide.
Используется полный SquashPlayer.cs. Дополнительный скрипт или второе соединение сигналов для прыжка не нужны.
Прыжок
IsActionJustPressed("jump") вместе с IsOnFloor() задаёт Y скорости JumpSpeed = 8. Удержание Space не создаёт новый прыжок каждый кадр; новое нажатие в воздухе также не добавляет скорость. Гравитация 24 уменьшает вертикальную скорость с учётом физического delta.
Перед MoveAndSlide() значение falling сохраняет факт движения вниз. После перемещения скорость может уже быть обнулена контактом: проверять только новый Velocity.Y для определения падения поздно.
Приземление на противника
Код просматривает GetSlideCollisionCount() и GetSlideCollision(i) после перемещения. Успешное попадание сверху требует одновременно:
- до перемещения персонаж двигался вниз;
GetNormal().Y > 0.5— нормаль контакта направлена преимущественно вверх;- столкновение принадлежит
SquashMob; TrySquash()вернулtrue.
Сравнение только высот объектов недостаточно: близкий объект ниже игрока ещё не означает состоявшееся столкновение. Контакт с обычным полом не даёт очков, потому что его тип — StaticBody3D.
Отскок
После успешного попадания задаётся BounceSpeed = 6, управление остаётся активным. Метод сразу выходит, чтобы та же физическая обработка не объявила поражение из-за пересечения области с уже удаляемым противником. Его флаг и QueueFree() не позволяют начислить очко дважды.
Ожидаемый результат: приземление на верх куба даёт одно очко и отбрасывает игрока вверх. Боковой контакт без подходящей нормали не считается попаданием сверху. Правило бокового поражения.