protected virtual void ClimbLadder(KeyCode keyUp, KeyCode keyDown)
    {
        bool inputUp   = Input.GetKey(keyUp);
        bool inputDown = Input.GetKey(keyDown);

        if ((climbObject != null && !jump) &&
            !(climbObject.IsLowerThenCenter(transform.position) &&
              charactorController.grounded && inputDown))
        {
            //GameObject ladder = topHit.collider.gameObject;
            if (inputUp || inputDown)
            {
                gameObject.layer = LayerMask.NameToLayer(LayerName.climb);
                climb            = true;


                transform.position = new Vector3(climbObject.transform.position.x, transform.position.y, transform.position.z);
            }
        }
        else
        {
            gameObject.layer = LayerMask.NameToLayer(LayerName.player);
            climb            = false;
        }

        Debug.Log($"Climb Power : {verticalMove}");
        charactorController.Climb(verticalMove * Time.fixedDeltaTime, climb);
        Debug.DrawRay(transform.position, Vector2.up * rayUpDistance, Color.red);
    }
    void FixedUpdate()
    {
        charactorController.Move(horizontalMove * Time.fixedDeltaTime, crouch, jump);

        // Raycast for ladder climbing
        RaycastHit2D topHit = Physics2D.Raycast(transform.position, Vector2.up, rayUpDistance, whatIsLadder);

        if (topHit.collider != null)
        {
            GameObject ladder = topHit.collider.gameObject;
            if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.DownArrow))
            {
                gameObject.layer = LayerMask.NameToLayer("Climb");
                climb            = true;
            }
            //if (Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.DownArrow))
            //{
            //    gameObject.layer = LayerMask.NameToLayer("Climb");
            //    climb = true;
            //}
        }
        else
        {
            gameObject.layer = LayerMask.NameToLayer("Player");
            climb            = false;
        }

        charactorController.Climb(verticalMove * Time.fixedDeltaTime, climb);
        RaycastHit2D hit = Physics2D.Raycast(new Vector2(transform.position.x + 0.15f * transform.localScale.x, transform.position.y), Vector2.right * transform.localScale.x, 0.5f, LayerMask.GetMask("Crate"));

        if (hit)
        {
            if (hit.transform.tag == "Crate")
            {
                if (Input.GetKey(KeyCode.Return))
                {
                    holdCrate = true;
                    if ((transform.localScale.x < 0 && horizontalMove < 0) || (transform.localScale.x > 0 && horizontalMove > 0))
                    {
                        //Debug.Log(hit.transform.name);
                        hit.rigidbody.AddForce(new Vector2(transform.localScale.x * 20 * Time.deltaTime, 0), ForceMode2D.Force);
                        hit.transform.gameObject.GetComponent <Crate>().ActiveCrate();
                    }
                }
                else
                {
                    holdCrate = false;
                }
            }
            else
            {
                holdCrate = false;
            }
        }
        else
        {
            holdCrate = false;
        }
        Debug.DrawRay(new Vector2(transform.position.x + (0.15f * transform.localScale.x), transform.position.y), Vector2.right * transform.localScale.x * 0.5f, Color.green);
        jump = false;
    }