Delay between bullet shot with GetKey

Hello,
I’m trying to make a shooting game in which you can keep the W key pressed to shoot endlessly. The problem is that there is absolutely no delay between each bullet, so this looks more like a strange laser than a proper shoot. I tried to use WaitForSeconds but it couldn’t work… I would like to know where I’m wrong. Help would be greatly appreciated. :slight_smile:
Here’s my code :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playerControl : MonoBehaviour {

	public GameObject playerBulletGO; //bullet prefab
	public GameObject bulletPosition01;
    public GameObject bulletPosition02;
    public float speed;


        // Use this for initialization
        void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {

		if(Input.GetKey("w") || Input.GetKey("z")) {

            Shoot();
            StartCoroutine(ShootWait());

        }

		
		float x = Input.GetAxisRaw ("Horizontal"); // will be -1 0 or 1 (for left, no input, and right)
		float y = Input.GetAxisRaw ("Vertical"); // will be -1 0 or1 (for down, no input and up)

		//now based on the input we comput a direction vector and we normalize it to get a unit vector
		Vector2 direction = new Vector2 (x, y).normalized;

		//now we call the function that computes and set the player's position
		Move (direction);
	}

	void Move(Vector2 direction)
	{ //here is the code for moving
	}

    void Shoot()
    {
        //instantiate the 1st bullet
        GameObject bullet01 = (GameObject)Instantiate(playerBulletGO);
        bullet01.transform.position = bulletPosition01.transform.position; //set the bullet initial position

        //instantiate the 2nd bullet
        GameObject bullet02 = (GameObject)Instantiate(playerBulletGO);
        bullet02.transform.position = bulletPosition02.transform.position; //set the bullet initial position
    }

    IEnumerator ShootWait()
    {
        yield return new WaitForSeconds(100.0f);
    }
}

public float fireRate = 2F; // 2seconds wait
private float nextFire = 0.0F;

.

if(Input.GetKey("w") || Input.GetKey("z")  && Time.time > nextFire ) {

              nextFire = Time.time + fireRate;
             Shoot();
 }

That should work
(wont need startcourotine this way )

Hi!

Use Invoke() :slight_smile:

You have the documentation here : Invoke()