- Home /
The question is answered, right answer was accepted
my timer isnt working for my firerate! it instantiates too many objects at a time,HOw can i get my shot timer working properly? it instantiates too many objects at a time
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyProjectile : MonoBehaviour
{
public GameObject projectile;
public GameObject spawnPoint;
public float fireRate = .1f;
private bool Shooting;
private float timer = 1;
// Update is called once per frame
void Update()
{
Shoot();
}
public void Shoot()
{
StartCoroutine("ShotTimer");
if (Shooting)
{
GameObject spawnProjectile = Instantiate(projectile, spawnPoint.transform.position,
Quaternion.identity);
spawnProjectile.transform.rotation = transform.rotation;
spawnProjectile.GetComponent().GiveInitialVelocity();
}
}
public IEnumerator ShotTimer()
{
yield return new WaitForSeconds(1);
Shooting = true;
yield return new WaitForSeconds(1);
Shooting = false;
}
}
I had
timer = 1/fireRate;
timer -= time.deltatime;
if (timer <= 0)
{
GameObject spawnProjectile = Instantiate(projectile, spawnPoint.transform.position,
Quaternion.identity);
spawnProjectile.transform.rotation = transform.rotation;
spawnProjectile.GetComponent().GiveInitialVelocity();
}
but it just spawns a ton of projectiles that all collide. please help
Answer by mlnczk · Nov 28, 2018 at 10:06 AM
private Start(){
StartCoroutine(ShootTimer());
}
private IEnumerator ShootTimer(){
while (true){
yield return new WaitForSeconds(1f);
Shoot();
}
}
Declaring coroutine in start and adding while(true) will make it repeat itself every WaitForSeconds you added. This way you avoid update which is always good to make it as light code as possible and as soon as your object starts will begin shooting.
Answer by Legend_Bacon · Nov 28, 2018 at 10:02 AM
Hello there,
Your problem lies in how many times you call your function and coroutine.
Update() runs 60 times a second. This means you're calling Shoot() 60 times a second. Which means you're calling the ShotTimer coroutine 60 times a second. Is this really what you want?
You should probably only call Shoot() once when actively shooting (on user Input KeyDown, for example).
If the behaviour you want is different from that, please say so in your description of the problem. Right now we can't be certain of what you are expecting this code to do.
I hope that helps!
Cheers,
~LegendBacon