void MovePlayerToStairs(StairController stairController, GameObject triggerStep)
    {
        isMovingToStairs = true;
        isMovingOnStairs = false;
        playerPos        = levelManager.playerController.player.transform.position;
        Vector2 targetPos = triggerStep.GetComponent <Collider2D>().bounds.center;

        if (stairController.GetStairDirection() == StairController.STAIR_DIRECTION.up)
        {
            // a staircase goes up if it moves from left(bottom) to right (top)
            if (triggerStep.transform.position == stairController.leftEndStep.transform.position)
            {
                // this means we're at the left(bottom) end of a staircase that goes up
                targetPos = DeterminePlayerTarget(triggerStep, 0.25f, 0.5f);
            }
            else
            {
                // we must be at the right(top) end of a staircase that goes up
                targetPos = DeterminePlayerTarget(triggerStep, -0.75f, 0.5f);
            }
        }
        else
        {
            // a staircase goes down if it moves from left(top) to right(bottom)
            if (triggerStep.transform.position == stairController.leftEndStep.transform.position)
            {
                // this means we're at the left(top) end of a staircase that goes down
                targetPos = DeterminePlayerTarget(triggerStep, 0.75f, 0.5f);
            }
            else
            {
                // we must be at the right(top) end of a staircase that goes up
                targetPos = DeterminePlayerTarget(triggerStep, -0.25f, 0.5f);
            }
        }

        FlipOnStairs(targetPos.x);

        player.GetComponent <PhysicsObject>().enabled = false;
        runAfterMoving = RunAfterMovingToStairs;
        StartCoroutine(MovePlayer(targetPos, transitionSpeed));
    }
    void MovePlayerOffStairs(int directionToMove)
    {
        isMovingOffStairs = true;
        levelManager.playerController.SetStairState(PlayerController.STAIR_STATE.off_stair);
        Vector2 targetPos = Vector2.zero;

        playerPos = levelManager.playerController.player.transform.position;
        if (directionToMove == 1)
        {
            targetPos.x = playerPos.x + 2f;
        }
        else
        {
            targetPos.x = playerPos.x + -2f;
        }
        targetPos.y    = playerPos.y;
        runAfterMoving = RunAfterMovingOffStairs;
        levelManager.playerController.playerAnimator.SetBool("onStair", false);
        levelManager.playerController.playerAnimator.SetFloat("velocityX", 1);
        StartCoroutine(MovePlayer(targetPos, transitionSpeed));
    }
    void MoveOnStairs(int directionToMove, StairController.STAIR_DIRECTION stairDirection)
    {
        isMovingOnStairs = true;
        playerPos        = levelManager.playerController.player.transform.position;
        Vector2 targetPos = Vector2.zero;

        //target.x is the same regardless of stairDirection
        targetPos.x = playerPos.x + MoveXOnStairs(directionToMove);

        //target.y is determined by move direction and stair direction
        //target.y is the same as stair direction on right and inverted on left
        targetPos.y = playerPos.y + moveYOnStairs(directionToMove, stairDirection);

        FlipOnStairs(targetPos.x);

        if ((!isMovingToStairs || !isMovingOffStairs) && CheckBound(targetPos.x, directionToMove, stairDirection) == 0)
        {
            runAfterMoving = RunAfterMovingOnStairs;
            if (stairController.GetStairDirection() == StairController.STAIR_DIRECTION.up)
            {
                levelManager.playerController.playerAnimator.SetInteger("stairDirection", directionToMove);
            }
            else
            {
                levelManager.playerController.playerAnimator.SetInteger("stairDirection", -directionToMove);
            }
            StartCoroutine(MovePlayer(targetPos, climbSpeed));
        }
        else if (CheckBound(targetPos.x, directionToMove, stairDirection) != 0)
        {
            MovePlayerOffStairs(directionToMove);
        }
        else
        {
            levelManager.playerController.playerAnimator.SetInteger("stairDirection", 0);
            isMovingOnStairs = false;
        }
    }