2D Platformer physics gets stuck going right

My two solutions (located at 33 and 37) seem to work fine while going left against a wall (the first one) but it seems it does not push the player left while going right (resulting in them being stuck.) Should I got even attempt to combine rigidbodies and these (seemingly pixel perfect) physics calculations? How the hell do you do pixel calculations with floats???

Any help is appreciated

public class PlayerController : MonoBehaviour {

    private Rigidbody2D body;
    public float speed = 10f;
    public float jumpPower = 5000f;
    private bool grounded;
    private Vector2 groundCheckPos;

    // Use this for initialization
    void Start () {
        body = GetComponent<Rigidbody2D> ();
    }

    public bool isGrounded(){
        bool result =  Physics2D.Linecast(transform.position , groundCheckPos , 1 << LayerMask.NameToLayer("Ground"));
        if (result) {
            Debug.DrawLine(transform.position , groundCheckPos , Color.green, 0.5f, false);
        }
        else {
            Debug.DrawLine(transform.position , groundCheckPos , Color.red, 0.5f, false);
        }
        return result;
    }
   
    // Update is called once per frame
    void FixedUpdate () {
        float h = Input.GetAxisRaw ("Horizontal");

        while (Physics2D.Linecast (transform.position, new Vector2 (transform.position.x - ((1f / 16f) * 3f), transform.position.y), 1 << LayerMask.NameToLayer ("Ground"))) {
            transform.position = new Vector2(transform.position.x + (1f / 16f), transform.position.y);
        }

        while (Physics2D.Linecast (transform.position, new Vector2 (transform.position.x + ((1f / 16f) * 3f), transform.position.y), 1 << LayerMask.NameToLayer ("Ground"))) {
            transform.position = new Vector2(transform.position.x - (1f / 16f), transform.position.y);
        }

        transform.position = new Vector2(transform.position.x + (speed * h * Time.deltaTime), transform.position.y);



        float v = Input.GetAxisRaw ("Vertical");

        groundCheckPos = new Vector2 (transform.position.x, transform.position.y - 1.05f);

        if (isGrounded ()) {
            body.AddForce ((Vector2.up * jumpPower) * v);
        }




    }

    void Update() {
       
    }

}

You probably just need to start your Linecast a little further back - you’re starting it at the exact position where it gets moved to (if a collision occurs) so there might be some accuracy issues.

If you’re checking the right hand side just move the linecast starting position left on the x by a little amount (and move it to the right when you’re checking the left hand side)