How to prevent object (bullet) from instantiating twice ? (It instantiates once for tapping the screen, and once more when beginning to hold touch on screen) ?

I’m trying to make my game have the option of holding down the screen for auto-firing of bullets, and if the player wants to tap the screen , the bullets should also instantiate as fast as they can tap. I have the auto-fire script set like this:

    bool fire;
    GunControl other;
    GameObject gun;
    float fireRate;
    float lastShot;

    
    void Start () {

        gun = GameObject.Find("Gun"); //Finds Gun Gameobject
        other = (GunControl)gun.GetComponent(typeof(GunControl)); //Get GunControl Script From Gun
        fireRate = 0.25f;
        lastShot = 0.0f;
    }
	
	
	void Update () {

        if (fire == true)
        {
           FireRate(); //call FireRate function below
        }
	}

    void FireRate()
    {
        if (Time.time > fireRate + lastShot) //if Time passed is more than fireRate set above + Seconds since last shot , fire again..
        {
            other.Fire();
            lastShot = Time.time;
        }
    }


    public void OnPress(bool isPressed)
    {
        if (enabled)
        {
            if (isPressed)
            {
                fire = true;
            }
            else
            {
                fire = false;
            }
        }
    }

    public void OnClick( )
    {
        // ??????????????
    }

}

My question is how to prevent that first shot from calling both the fireRate function and also the OnClick at the same time… Because once I tap it shoots two bullets, but if i continue to hold on that tap it’ll just do the auto-fire.

Generally you want to know when a button has been released for firing purposes, so you would trigger your initial bullet when the button is released. This enables you to do your auto fire, and the block the OnRelease from firing a bullet if you don’t want that to happen.

Psuedocode:

Update(){
    if not button.waspressedlastframe and button.ispressedthisframe
        lastShot = 0f;
    if button.waspressedlastframe and button.ispressedthisframe
        if lastshot + firedelay < time
            fire;
            lastshot = time;
    if button.waspressedlastframe and not pressedthisframe
        if lastshot = 0f
            fire;
}