Inputs being eaten, any way to fix?

I’m just starting out with Unity and C#, and I’m having a problem where every so often an input will get eaten. I think I know why it’s happening, but I don’t know if there’s a way to fix it with the set-up I have in mind. I simplified the code to replicate the problem:

public class PlayerAction : MonoBehaviour
{
    public float runSpeed = 5;
    private Rigidbody2D rb2d;

    void Start()
    {
        rb2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        Vector2 rForce = new Vector2(0, 0);
        if (Input.GetButtonDown("Jump"))
        {
            rForce = new Vector2(runSpeed, 0);
        }

        rb2d.velocity = rForce;
    }
}

Essentially, I’m not happy with the options provided to me by Unity’s Rigidbody2D when it comes to the application of motion, however I’d rather not have to create my own collision detection if I can avoid it, so I came up with the happy medium of calculating my speed and forces required outside of Rigidbody and then plugging them in for the final movements in order to use its collision. The only problem is that by doing so I seem to be having dropped inputs.

Is there anyway I can get this to work smoothly, or am I gonna have to suck it up and make my own collision? This is only a snippet of the code meant to replicate the problem (which it does), but I can go into more detail if needed.

EDIT: It seems the problem has to do with Update vs Fixed Update cycles. if I move the part of the code that zeros out rForce to FixedUpdate (after applying the speed), it makes all the single frame buttons work, but it also makes the held buttons sometimes double up on speed. That makes me think the problem is that Update is running 1.X times per FixedUpdate cycle, and that the eaten inputs from before were the times when Update ran twice before FixedUpdate could run once. The same thing happens now, just with doubled inputs being the problem instead of zero.

I guess I could try moving all the held inputs to be processed in FixedUpdate instead of Update. I think that would solve the problem for now, but I’m not sure how that would affect things down the line.

Try using FixedUpdate and times your speed by Time.deltaTime