Важно помнить: входные данные движка Unity3D обновляются только в то время, когда движок вызывает Update()
методы для ваших GameObjects.
Это означает, что вы не должны читать любой тип ввода в методе FixedUpdate()
. Такие методы, как GetKeyDown () и другие методы из класса Input, которые читают кнопки / значения клавиатуры / мыши / оси, не должны вызываться во время FixedUpdate()
, поскольку их возвращаемые значения ненадежны.
В связи с этим, вероятно, причиной сбоя реализации прыжка является то, что метод GetKeyDown () , который вы вызываете в FixedUpdate()
, возвращает несогласованные / недействительные (false
) результаты, когда пользователь нажимает клавишу прыжка.
Исправить это может быть довольно просто. Я предлагаю вам сохранить логическую переменную, которая отслеживает, была ли нажата клавиша перехода, и обновляет ее значение во время Update()
. Это должно исправить вашу проблему.
bool jumpKeyPressed;
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
jumpKeyPressed = true;
else if (Input.GetKeyUp(KeyCode.Space))
jumpKeyPressed = false;
}
private void FixedUpdate()
{
/* Update "moveHorizontal", call HandleMovement(...) here, as you've already done. */
if (jumpKeyPressed && isJumping == false)
{
// IMPORTANT: this prevents the "jump force" from being applied multiple times, while the user holds the Space key
jumpKeyPressed = false;
/* Remaining jumping logic goes here (AddForce, set "isJumping", etc) */
}
}