Персонаж иногда не может прыгать с разбегу
Я новичок и делаю 2d платформер. Не могу понять с чем связано, что персонаж прыгает через раз или вообще не прыгает с разбегу, когда зажата клавиша A или D и нажата клавиша Backspace, но это не постоянно, а только в некоторых ситуациях. Например, когда игра запущена и я двигаюсь вправо, я могу прыгать с разбегу, но стоит мне повернуться налево и я уже теряю эту возможность. Может быть я не в правильном порядке вызываю функции в Update или в FixedUpdate, не знаю. Нужна помощь с отладкой, хотел бы узнать наиболее вероятные причины этой проблемы. Код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private float movementInput;
private bool isFacRight = true;
private bool isRun;
private bool isGrounded;
private bool canPersonJump;
private Rigidbody2D rigidbody2D;
private Animator animator;
public float movementSpeed = 10.0f;
public float forceJump = 15.0f;
public float groundCheckRad;
public Transform groundCheck;
public Transform wallCheck;
public LayerMask whatIsGround;
private bool jumpOrNot;
void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
void Update()
{
CheckIfCanJumpHero();
CheckInputPlayer();
CheckDirectionMovement();
UpdateAnimations();
}
private void FixedUpdate()
{
ApplyMovement();
CheckSurrndings();
}
private void CheckIfCanJumpHero() //Нужна для дого, чтобы ограничить прыжки персонажа
{
if(isGrounded && rigidbody2D.velocity.y <= 0)
{
canPersonJump = true;
}
else
{
canPersonJump = false;
}
}
private void CheckSurrndings() // Проверка того касается ли персонаж земли
{
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRad, whatIsGround);
}
private void CheckDirectionMovement() //Проверяет направление движения
{
if (isFacRight && movementInput < 0) //Если персонаж смотрит вправо, но пытается двигаться влево, то переворачиваем спрайт персонажа
{
Flip();
}
else if (!isFacRight && movementInput > 0)
{
Flip();
}
if (rigidbody2D.velocity.x != 0)
{
isRun = true;
}
else
{
isRun = false;
}
}
private void CheckInputPlayer() //Используется для проверки типа ввода игрока: или нажаты клавиши A и D для движения или пробел
{
movementInput = Input.GetAxisRaw("Horizontal");
if (Input.GetButtonDown("Jump"))
{
Jump();
}
}
private void UpdateAnimations() // Для смены анимаций
{
animator.SetBool("isRun", isRun);
}
private void ApplyMovement() //Изменяет скорость тела
{
rigidbody2D.velocity = new Vector2(movementSpeed * movementInput, rigidbody2D.velocity.y);
}
private void Flip() // Поворачивает персонажа на 180 градусов
{
isFacRight = !isFacRight;
transform.Rotate(0.0f, 180.0f, 0.0f);
}
private void Jump()
{
if (canPersonJump)
{
rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, forceJump);
}
}
private void OnDrawGizmos()
{
Gizmos.DrawWireSphere(groundCheck.position, groundCheckRad);
}
}