UNITY Animation setFloat не работает должным образом - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть кнопки на экране, которые управляют движением персонажа, «Идти вправо», «Идти влево» и «Прыгать».Мои события кнопки «Влево» и «Перейти» правильно работают с анимацией, но правая кнопка просто перемещает персонажа, а не воспроизводит анимацию ходьбы. Я использую setFloat для определения движения персонажа.игра.

Мой скрипт для управления движением:

void Movement()
{

    if (RightPressed)
    {
        target.Translate(Vector2.right * 3f * Time.deltaTime);
        target.eulerAngles = new Vector2(0, 0);
    }

    if (LeftPressed)
    {
        target.Translate(-Vector2.right * 3f * Time.deltaTime);
        target.eulerAngles = new Vector2(0, 0);
    }

    if (SpacePressed && isJumping == true)
    {

        if (jumpTimeCounter > 0)
        {
            rb.velocity = Vector2.up * jumpForce;
            rb.freezeRotation = true;
            jumpTimeCounter -= Time.deltaTime;
            anim.SetBool("IsJumping", true);
        }
        else
        {
            isJumping = false;
        }
    }
}

Моя функция обновления:

void Update () {

    Movement();
    {

        if (RightPressed)
            anim.SetFloat("speed", 0.1f);
        else
            anim.SetFloat("speed", 0.0f);


        if (LeftPressed)
            anim.SetFloat("speed", -0.1f);
        else
            anim.SetFloat("speed", 0.0f);

        isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);

    } 

}

Моя функция для экранных кнопок

public void OnScreenButtonChange(string dir)
{
    switch (dir)
    {
        case "A":
            LeftPressed = !LeftPressed;
            break;
        case "D":
            RightPressed = !RightPressed;
            break;
        case "Space":
            SpacePressed = !SpacePressed;
            break;
    }
}

1 Ответ

0 голосов
/ 26 декабря 2018

Поскольку ваш кодовый блок RightPressed перекрывается кодовым блоком LeftPressed,

, в принципе, если вы будете переворачиваться вот так

    if (LeftPressed)
        anim.SetFloat("speed", -0.1f);
    else
        anim.SetFloat("speed", 0.0f);

    if (RightPressed)
        anim.SetFloat("speed", 0.1f);
    else
        anim.SetFloat("speed", 0.0f);

, вы заметите, что ваша проблема решена, выиспользуя в обоих случаях логическое значение, которое должно быть либо ложным, либо истинным, а когда значение LeftPressed равно false, вы все равно обновляете скорость анимации до 0,0f, что переопределяет то, что было установлено в RightPressed, и вам нужно изменитькак вы организовали свой код

    if (LeftPressed)
        anim.SetFloat("speed", -0.1f);

    if (RightPressed)
        anim.SetFloat("speed", 0.1f);

    if ((!LeftPressed && !RightPressed) || (LeftPressed && RightPressed))
        anim.SetFloat("speed", 0.0f);

, это будет работать лучше, но это не очень хороший способ сделать это, вы должны синхронизировать анимацию с фактической скоростью вашего твердого тела / преобразования, чтобы убедиться, что вы нене должно быть рассинхронизации между движением объекта и анимацией

...