Well, you could have a boolean that is changed by pressing a button let’s call it oneshot
Then
if (oneshot){
if (Input.GetButtonDown){}}
else if (!oneshot){
if (Input.GetButton){}}
I don’t know if this is the best way but that could be a lead.
It checks if oneshot is true or false and then do the proper action GetButtonDown only performs once when going down, GetButton keeps shooting when button is held down.
Main problem is that the boolean checking happens even though you are not pressing the button hence taking resources.
Just trying to help though.