public IHeroState HandleInput(Hero hero, InputManager input, CollisionManager collision, GravityManager grav)
    {
        fallDir             = grav.GetGravityVector2();
        airControlDir       = grav.GravCorrectWorldToLocalInput(input.horizontalInput, input.verticalInput);
        fallHorizontalRight = collision.transformRight;


        if (collision.onGround)
        {
            return(gameObject.GetComponent <IdleState>());
        }

        if (collision.transformUp.x == 0)
        {
            fallHorizontalDir = input.horizontalInput;
        }
        else if (collision.transformUp.x == 1)
        {
            fallHorizontalDir = -input.verticalInput;
        }
        else if (collision.transformUp.x == -1)
        {
            fallHorizontalDir = input.verticalInput;
        }

        if ((collision.onRightWall && fallHorizontalDir > 0) || collision.onLeftWall && fallHorizontalDir < 0)
        {
            fallHorizontalDir = 0;
        }

        return(null);
    }
    public override IHeroState HandleInput(Hero hero, InputManager input, CollisionManager collision, GravityManager grav)
    {
        walkDir = grav.GravCorrectWorldToLocalInput(input.horizontalInput, input.verticalInput);

        FlipSprite(grav);

        if (input.jumpInput == 1)
        {
            return(base.HandleInput(hero, input, collision, grav));
        }
        walkRight = collision.transformRight;
        if (collision.onGround)
        {
            // make input global instead of relative to player local
            if (collision.transformUp.y == 1)
            {
                walkHorizontalDir = input.horizontalInput;
            }
            else if (collision.transformUp.y == -1)
            {
                walkHorizontalDir = -input.horizontalInput;
            }
            else if (collision.transformUp.x == 1)
            {
                walkHorizontalDir = -input.verticalInput;
            }
            else if (collision.transformUp.x == -1)
            {
                walkHorizontalDir = input.verticalInput;
            }

            if (collision.onRightWall && collision.onGround && walkHorizontalDir > 0)
            {
                return(base.HandleInput(hero, input, collision, grav));
            }

            if (collision.onLeftWall && collision.onGround && walkHorizontalDir < 0)
            {
                return(base.HandleInput(hero, input, collision, grav));
            }

            if (walkHorizontalDir == 0)
            {
                return(gameObject.GetComponent <IdleState>());
            }

            return(base.HandleInput(hero, input, collision, grav));
        }
        else
        {
            return(base.HandleInput(hero, input, collision, grav));
        }



        return(null);
    }