Реализация двойного прыжка

100
16 ноября 2020, 19:40

Собственно в названии и заключается проблема. Код следующий:

private bool isGrounded = true;
private bool isAir = false;
private void Update()
{
    if (isGrounded) State = CharState.Idle;
    if (isGrounded && Input.GetButtonDown("Jump")) Jump();
    //if (isAir && Input.GetButtonDown("Jump")) DoubleJump();
    //if (isGrounded && Input.GetButtonDown("Jump + Jump")) DoubleJump();
}
private void Jump()
{
    if (Input.GetButtonDown("Jump")) DoubleJump();
    else { rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse); }
    //rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
    //isAir = true; isGrounded = false;
}
private void DoubleJump()
{
    rigidbody.AddForce(2 * transform.up * jumpForce, ForceMode2D.Impulse);
    //isAir = false;
    //isGrounded = true;
}

Последняя попытка была такой, но так при активации метода Jump персонаж сразу попадает в DoubleJump хотя должно быть не так.

Answer 1

Я согласен с комментарием под вопросом о том, что это не очень правильная реализация и лучше делать стейт-машину. Это не очень сложно и рекомендую погуглить примеры простейших стейт-машин (благо их навалом). Однако, если вы всё-таки хотите использовать такой подход, то, пожалуйста, попробуйте использовать этот код:

    private bool isGrounded = true;
    private bool canDoubleJump = true;
    private void Update()
    {
        if (Input.GetButtonDown("Jump"))//если нажата кнопка Jump
        {
            if (isGrounded)//проверяем, находится ли персонаж на земле
            {
                Jump();//если да, то прыгаем "первый" прыжок
            }
            else if (canDoubleJump)//если персонаж не приземлён и может прыгнуть ещё раз, то прыгаем "второй" прыжок
            {
                DoubleJump();
            }
            //если персонаж не приземлён и больше не может прыгать, то при нажатии кнопки Jump ничего не произойдёт
        }
    }
    private void Jump()
    {
        isGrounded = false;//устанавливаем, что персонаж не приземлён
        canDoubleJump = true;//устанавливаем, что персонаж может прыгнуть "второй" раз
        rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
    }
    private void DoubleJump()
    {
        canDoubleJump = false;//устанавливаем, что персонаж не может прыгнуть "второй" раз, пока не прыгнет "первый" раз
        rigidbody.AddForce(2 * transform.up * jumpForce, ForceMode2D.Impulse);
    }
    //этот метод должен вызываться при приземлении персонажа
    private void Landing()
    {
        isGrounded = true;//устанавливаем, что персонаж приземлён
        canDoubleJump = false;//устанавливаем, что персонаж не может прыгнуть "второй" раз, пока не прыгнет "первый"
    }
READ ALSO
Как отобразить картинку из byte[] во вьюшке в img

Как отобразить картинку из byte[] во вьюшке в img

Как отображать картинки(массив байтов) в вьюшке(<img>)?

132
В чём проблемы с функцией SalesTax

В чём проблемы с функцией SalesTax

Начал читать C# 7 иNET Core

133
Wpf и горячие клавишы

Wpf и горячие клавишы

Да, я знаю как использовать хоткеи (XAML):

131
свайп в окне эмулятора Android через winapi

свайп в окне эмулятора Android через winapi

Имею эмулятор BlueStacksЦель: написать простого бота, который в окне эмулятора нажимает на определенные области экрана эмулируя тапы, а также...

128