- Home /
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? :)
I would recommend using a timer.
float fireRate = 1; //change the fire rate to match what you need.
float timer;
void Update(){
timer += Time.deltaTime;
if(timer > fireRate){
//fire bullet
timer = 0; //reset the timer;
}
}
It was my first solution, unfortunately nothing changes :(
Answer by Dracorat · Nov 13, 2013 at 04:38 PM
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
Thanks! I calculated the number of bullets and used the for, and... it seems to work :)
Answer by Bunny83 · Nov 13, 2013 at 04:32 PM
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;
}
}
}