How shot a bullet faster than the frame does?

I am making a fps game and I have a machine gun, it should shot 50 bullets per second, but when I have less than 50 fps, they are much less so the weapon becomes less effective…

I’m using the function yield WaitForSeconds(1/frequence) inside a method, there is a way to fix this issue? :slight_smile:

Well, that’s quite easy. You would do the same what Unity does internally to get FixedUpdate working:

var lastShotTime = 0.0;

function Update()
{
    if (ShouldIShoot)
    {
        while(lastShotTime < Time.time)
        {
            lastShotTime += 1.0/frequency;
            Shoot();
        }
    }
    else
    {
        lastShotTime = Time.time;
    }
}

This concept works with any frequency. In it’s current form there’s a little problem with low frequencies. For example of you just want 2 shots per second the user can simply click faster. To avoid this you could swap the while and the if statement like this:

function Update()
{
    while(lastShotTime < Time.time)
    {
        if (ShouldIShoot)
        {
            lastShotTime += 1.0/frequency;
            Shoot();
        }
        else
        {
            lastShotTime = Time.time;
        }
    }
}

50 shots per second is 20 ms per shot.

Knowing that, compare how much time has passed since the last shot and divide by 20ms. Whatever your result is, spawn that many bullet prefabs. With your remainder, I’d keep it and then add it to the same math the next time you do is so that you don’t lose fractional bullets.

Essentially:

//This is a global variable, not in the function:
private float fractionalBullets = 0;

float bulletsThisFrame = time.deltaTime / .020f + this.fractionalBullets;
int wholeBulletsThisFrame = (int)bulletsThisFrame;
this.fractionalBullets = bulletsThisFrame - (float)wholeBulletsThisFrame;

// Now spawn wholeBulletsThisFrame number of bullets

it should be on fixed update. so fps not affect it.