yield WaitForSeconds

I am trying to get the gun to wait for a second before it fires however it just fires an instant stream, why doesn’t it wait ?

#pragma strict
var Target:Transform;
var damp = 1.0;
var bulletPrefab: Transform;

function Update () {

 if(Target)
 {
     var rotate = Quaternion.LookRotation(Target.position - transform.position);
     transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * damp);
 }

  Shoot();

}

function Shoot()
{

   yield WaitForSeconds(1);
   var bullet = Instantiate(bulletPrefab, GameObject.Find("EbulletSpawnPoint").transform.position, Quaternion.identity);
   bullet.rigidbody.AddForce(transform.forward * 1000);
}

#pragma strict
var Target:Transform;
var damp = 1.0;
var bulletPrefab: Transform;
var rateOfFire = 1.0;
private var lastShot = -10.0;

function Update () {

 if(Target)
 {
     var rotate = Quaternion.LookRotation(Target.position - transform.position);
     transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * damp);
 }

  Shoot();

}

function Shoot()
{
   if(Time.time > rateOfFire + lastShot){
       var bullet = Instantiate(bulletPrefab, GameObject.Find("EbulletSpawnPoint").transform.position, Quaternion.identity);
       bullet.rigidbody.AddForce(transform.forward * 1000);
       lastShot = Time.time;
    }
}

I usually find it bad practice to use WaitForSeconds. I prefer using a simple “timer”, but that is just me.

It should now shoot every second.

You’re starting a new instance of Shoot every frame in Update. You need to yield on a coroutine if you want it to wait, but you can’t yield in Update. What you should do is not use Update for shooting at all, but rather InvokeRepeating.

#pragma strict
var Target:Transform;
var damp = 1.0;
var bulletPrefab: Transform;

function Start () {
   InvokeRepeating ("Shoot", 1.0, 1.0);
}

function Update () {
   if(Target)
   {
      var rotate = Quaternion.LookRotation(Target.position - transform.position);
      transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * damp);
   }
}

function Shoot()
{
   var bullet = Instantiate(bulletPrefab, GameObject.Find("EbulletSpawnPoint").transform.position, Quaternion.identity);
   bullet.rigidbody.AddForce(transform.forward * 1000);
}

You can also use a variable to check if it is shooting:

if (!isShooting){

yield WaitForSeconds(1);

var bullet = Instantiate(bulletPrefab, GameObject.Find(“EbulletSpawnPoint”).transform.position, Quaternion.identity);

bullet.rigidbody.AddForce(transform.forward * 1000);
isShooting = false;
}

And before you call Shoot(), you set isFiring to true;