void MovePlayerOffStairs()
 {
     if (levelManager.playerController.GetStairState() == PlayerController.STAIR_STATE.on_stair)
     {
         if (Input.GetAxis("Horizontal") > 0.1f || (Input.GetAxis("Climb") > 0.1f && stairController.GetStairDirection() == StairController.STAIR_DIRECTION.up))
         {
             MovePlayerOffStairs(1);
         }
         else if (Input.GetAxis("Horizontal") < -0.1f || Input.GetAxis("Climb") < -0.1f && (stairController.GetStairDirection() == StairController.STAIR_DIRECTION.down))
         {
             MovePlayerOffStairs(-1);
         }
     }
 }
    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 OnTriggerStay2D(Collider2D other)
    {
        if (other.tag != "Stairs")
        {
            return;
        }
        stairController = other.GetComponentInParent <StairController>();

        if (Input.GetAxis("Climb") != 0 && levelManager.playerController.GetStairState() != PlayerController.STAIR_STATE.on_stair && levelManager.playerController.GetJumpState() == PlayerController.JUMPING.grounded && hasLeftStairTrigger)
        {
            stairDirection      = stairController.GetStairDirection();
            hasLeftStairTrigger = false;
            player.GetComponent <Rigidbody2D>().gravityScale = 0;
            levelManager.playerController.SetStairState(PlayerController.STAIR_STATE.on_stair);
            levelManager.playerController.playerAnimator.SetBool("onStair", true);

            transitionPercent = 0f;
            MovePlayerToStairs(stairController, other.gameObject);
        }
    }