Search code examples
c#animationstate-machine

Falling animation when on slopes


I'm pretty new to all of this so sorry for rookie mistakes. I've built a State Machine that I'm pretty happy with, with just one problem, whenever the player jumps on a slope and keeps running (either up or down) the animation won't switch to running and stays at falling.

 private void FixedUpdate()
    {
        GroundCheck();

        if (state != State.hurt)
        {
            Movement();
            DoubleJump();
            StateMachine();
        }

        HurtCheck();
        anim.SetInteger("state", (int)state);
    }

private void Movement()
    {
        float hDirection = Input.GetAxis("Horizontal");

        //holding down "D" makes the value positive and vice versa
        if (hDirection < 0)
        {
            rb.velocity = new Vector2(-speed, rb.velocity.y);
            transform.localScale = new Vector2(-1, 1);
        }
        else if (hDirection > 0)
        {
            rb.velocity = new Vector2(speed, rb.velocity.y);
            transform.localScale = new Vector2(1, 1);
        }
        else
        {

        }

        if (Input.GetButtonDown("Jump") && isGrounded == true)
        {
            Jump();
        }
    }

private void StateMachine()
    {
        if(rb.velocity.y > 2f && isGrounded == false)
        {
            state = State.jumping;
        }

        if(rb.velocity.y < 2f && isGrounded == false)
        {
            state = State.falling;
        }

        if(rb.velocity.y == 0 && Mathf.Abs(rb.velocity.x) > 2f)
        {
            state = State.running;
        }

        if(rb.velocity.magnitude == 0)
        {
            state = State.idle;
        }
    }

Solution

  • It looks like you intend rb.velocity.y to be greater than 0 when on a slope. But in order to enter the running state you have a condition that rb.velocity.y == 0. If you want to run on a slope, then maybe you should change that condition like this.

        if((rb.velocity.y < 2f) && (Mathf.Abs(rb.velocity.x) > 2f))
        {
            state = State.running;
        }