Проблема с объявлением переменной без переопределения переменной - PullRequest
0 голосов
/ 25 сентября 2019

Внутри функции я должен объявить две локальные переменные с плавающей точкой: jAxis и jumpValue в начале.jAxis сразу присваивается переменная в начале, в то время как jumpValue это просто float jumpValue;

У меня есть оператор if позже в коде, в котором используется jumpValue.Тем не менее, jumpValue никогда не следует отменять присвоение значения до достижения этой точки.Компилятор не согласен с ошибкой, которая говорит use of unassigned local variable jumpValue для вычисления Vector3 в нижней части.

Вот мой соответствующий код:

void JumpHandler()
{

    float jAxis = Input.GetAxis("Jump");
    float jumpValue;

    //if pressed
    if (jAxis > 0)
    {
        bool isGrounded = CheckGrounded();

        if (isGrounded)
        {
            jumpValue = jAxis; 
            if (!jumpPressed)
            {
                jumpPressed = true; //Pressed jump
            }
        }
        else
        {
            jumpValue = 0;
        }
    }
    else if (jumpPressed)
    {
        rb.AddForce(new Vector3(0, Math.Abs(jumpValue) * jumpForce * 1, 0) , ForceMode.VelocityChange);//Absolute value to prevent weird cases of negative jAxis
        //jump key not pressed
        jumpPressed = false;
        jumpValue = 0;
    }
    else
    {
        jumpPressed = false;
    }

}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Я не вижу, откуда вызывается JumpHandler, но весь расчет с использованием флагов bool и т. Д. Имеет для меня мало смысла.

  • Нет необходимости сохранять значение в локальной переменной jumpValue.Вы хотите использовать его только в одном месте, поэтому просто введите соответствующее значение jAxis напрямую.

  • Поскольку вы проверяете jAxis > 0 прямо перед этим, Mathf.Abs является избыточным.

  • Вы откладываете фактическое выполнение перехода на следующий раз, когда jumpHandler вызывается снова, когда jAxis <= 0 .. это было задумано?Если не просто выполнить прыжок напрямую, когда выполняются требуемые условия.Нет необходимости в jumpPressed флаге.

  • Поскольку вы разрешаете AddForce, только если CheckGrounded, передающий jAxis в качестве множителя силы, может также привести к непредвиденному поведению.Это однократный вызов, поскольку предположительно в следующем кадре (или там, где вы его называете) он больше не должен быть заземлен.Однако значение jAxis может быть очень маленьким (в зависимости от того, какой тип оси у вас там).

Насколько я могу судить, ваш код работает почти так же, как этот (без откладывания прыжка и просто передачи jumpForce * 1 вместо jAxis)

void JumpHandler()
{
    float jAxis = Input.GetAxis("Jump");
    if(jAxis > 0 && CheckGrounded)
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.VelocityChange);
    }
}
0 голосов
/ 25 сентября 2019

Нет смысла, чтобы блок if(jumpPressed) был эксклюзивным с блоком if (jAxis > 0).Удалите else до if (jumpPressed).

. Кроме того, вы должны инициализировать jumpValue до 0f, поскольку компилятор не может самостоятельно распознать, что jumpPressed имеет значение true, только если jumpValueset.

Вам не нужен блок else, чтобы установить jumpPressed в false, потому что он уже будет ложным, если он находится в этом блоке.

В целом, это может выглядеть так:

void JumpHandler()
{

    float jAxis = Input.GetAxis("Jump");
    float jumpValue = 0f;

    //if pressed
    if (jAxis > 0)
    {
        bool isGrounded = CheckGrounded();

        if (isGrounded)
        {
            jumpValue = jAxis; 
            if (!jumpPressed)
            {
                jumpPressed = true; //Pressed jump
            }
        }
        else
        {
            jumpValue = 0;
        }
    }

    if (jumpPressed)
    {
        rb.AddForce(
                //Absolute value to prevent weird cases of negative jAxis
                new Vector3(0, Mathf.Abs(jumpValue) * jumpForce, 0),
                ForceMode.VelocityChange);
        //jump key not pressed
        jumpValue = 0;
        jumpPressed = false;
    }
}

Это производит вывод как это (с фиктивным методом для CheckGrounded, который возвращает true один раз):

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...