- Home /
Machine gun script shoots all bullets at once
Hello. I have created this gun script which is supposed to fire off one round, wait for the rateOfFire time to pass and then fire another bullet but instead all bullets are created at once. Here is my script
var prefabBullet:Transform;
var shootForce:float;
var shots : int = 0;
var isAutomatic = true;
var rateOfFire : int = 2;
var maxShots : int = 100;
var maxClips : int = 2;
var reloadTime : int = 3;
var shootSound : AudioClip;
var reloadSound : AudioClip;
var isShooting = 1;
var lowerThanShooting = .5;
function Update()
{
if(Input.GetButton("Fire1") && shots < maxShots && isShooting > lowerThanShooting)
{
var instanceBullet = Instantiate(prefabBullet, transform.position, Quaternion.identity);
instanceBullet.rigidbody.AddForce(transform.forward * shootForce);
audio.PlayOneShot(shootSound);
animation.CrossFade("M60Fire");
shots++;
isShooting++;
Auto();
}
else if (shots >= maxShots && Input.GetKeyDown(KeyCode.R))
{
Reload();
}
}
function Reload()
{
animation.CrossFade("M60Reload");
yield WaitForSeconds (reloadTime);
shots = 0;
maxClips--;
}
function Auto()
{
yield WaitForSeconds (rateOfFire);
isShooting--;
}
What is wrong with my script?
Answer by cdrandin · Jul 08, 2013 at 06:41 AM
if(Input.GetButton("Fire1") && shots < maxShots && isShooting > lowerThanShooting)
{
This code, as long as player presses button and other conditions are met he can shot the gun. In your Auto, script you play the animation, but even if you have WaitForSeconds
the function Auto
is still being called every update. Along the if statement you should include the allotted time it takes to shot each bullet and when the time passes, enter into the statement and fire bullet
Answer by robertbu · Jul 08, 2013 at 06:45 AM
I just answered this question a few minutes ago:
http://answers.unity3d.com/questions/488579/adding-a-wait-command-in-my-inputgetaxis.html
Your issue is exactly the same. Coroutines don't work the way you are expecting. Your code execute Auto() and then Auto() returns when it hits the 'yield'. There are several approaches to get what you want here. The typical way for code I seen posted is to use a timer in Update(). You would declare a timer float variable at the top of the file and do this in Update:
timer += Time.deltaTime;
if(Input.GetButton("Fire1") && shots < maxShots && timer > rateOfFire) {
timer = 0.0;
// Your shooting code goes here
}
Your answer
Follow this Question
Related Questions
Script needs fixing ?! 1 Answer
Enemy spawn script not working properly ! 1 Answer
instantiate a set amount 3 Answers