- Home /
Bullet is shooting every frame? How do I limit it to 1 bullet per second?
I'm trying to change a script to shoot 1 bullet per second on mouse being held. The void update and IEnumerator was added by me , the fire() function is the script..
void Update(){
if (Input.GetMouseButton (0)) {
StartCoroutine (FireShot ());
}
}
IEnumerator FireShot() {
Fire ();
yield return new WaitForSeconds (1);
}
public void Fire()
{
Vector3 mousePoint = Camera.main.ScreenToWorldPoint (Input.mousePosition);
transform.up = Vector3.Normalize (mousePoint + Vector3.forward * 10 - transform.position);
if (PlayerPrefs.GetInt ("gold", 200) < _levelGun && _tenlua == false)
popUp.SetActive (true);
else {
if (PlayerPrefs.GetInt ("gold", 200) >= _levelGun && _checkfire && _tenlua == false) {
_ani.Play ("Fire", 0, 0);
AudioControl.Instance.shoot ();
GameObject _bullet = (GameObject)Instantiate (Bullet);
_bullet.transform.position = transform.position + transform.up * 0.5f;
_bullet.GetComponent<BulletControl> ().InitBullet (_levelGun, transform, new Vector2 (mousePoint.x, mousePoint.y));
UiTextSpawmControl.Instance.MinusGold (_levelGun);
}
}
if (_tenlua && _checkfire) {
_tenlua = false;
tenlua.transform.up = Vector3.Normalize (mousePoint + Vector3.forward * 10 - tenlua.transform.position);
_checkfire = false;
LeanTween.move (tenlua, new Vector3 (mousePoint.x, mousePoint.y, 0), 0.2f * (Vector2.Distance (mousePoint, tenlua.transform.position))).setOnComplete (() => {
RaycastHit2D[] fish = Physics2D.CircleCastAll (new Vector3 (tenlua.transform.position.x, tenlua.transform.position.y, 0), 2, Vector3.zero);
AudioControl.Instance.boom ();
for (int i = 0; i < fish.Length; i++) {
if (fish [i].collider.tag == "fish")
fish [i].collider.gameObject.GetComponent<FishControl> ().hitDame (1000, gameObject);
}
GameObject boom = (GameObject)Instantiate (_effboom, tenlua.transform.position + tenlua.transform.up * 0.5f, Quaternion.identity);
Destroy (boom, 1.5f);
tenlua.SetActive (false);
GetComponent<SpriteRenderer> ().enabled = true;
transform.up = Vector3.up;
transform.localScale = Vector3.zero;
LeanTween.scale (gameObject, new Vector3 (1, 1, 1), 0.5f).setEase (LeanTweenType.easeOutBack).setOnComplete (() => {
_checkfire = true;
});
});
}
}
Answer by yaezah · Aug 19, 2017 at 03:48 AM
If anyone has a problem like this this is how I fixed it:
Add a bool "canshoot=false"
then change the update and IEnumerator to this:
void Update(){
if ((Input.GetMouseButton(0))&&(!canshoot)) {
StartCoroutine (FireShot ());
}
}
IEnumerator FireShot() {
canshoot = true;
Fire ();
yield return new WaitForSeconds (1);
canshoot = false;
}
I like this answer because this is what I would do, except I would suggest na$$anonymous$$g the variable something different. I$$anonymous$$O checking for "canshoot == false" seems like you're checking "If I can't shoot... Then shoot." Just for readibility, I think. Otherwise it's perfect.
Answer by G4M3R72 · Feb 03, 2020 at 10:41 AM
That code works great for me too yaezah. I created a public float for fire rate and put it in the IEnumerator so I can change the rate for each scene as the person levels up... yield return new WaitForSeconds(fireRate);
Answer by Nk_Khumbhani · Feb 03, 2020 at 11:14 AM
Decrease the delay time from 1 to 0.5f is worked for me... IEnumerator FireShot() {
canShoot = true;
Fire();
yield return new WaitForSeconds (0.5f);
canShoot = false;
}