x


Slowing down the speed of my bullets whilst holding in the key.

Hey guys.

I'm quite the n00b in Unity but im slowly getting more comfortable with it. I've since a few hours ago, run into a small problem, well 2 problems actually, but they are both practically identical, so the answers from this should help me fix the 2nd problem.

Problem:

when I use (Input.GetKey("z")) to fire my weapon, my bullets fire out like crazy, I understand this to be because the bullets fire with each update call, which is every frame. However I'm trying to find a way to have the bullets STOP firing for a second before firing again, so its not as much as a constant stream of bullets.

My code, is as follows, this is an expansion of the 3DBUZZ video series, so that code is used as my base.

Blockquote using UnityEngine; using System.Collections;

public class Player : MonoBehaviour {

// Use this for initialization

public float PlayerSpeed;
public GameObject ProjectilePrefab;

// Update is called once per frame
void Update () 
{
    float amountToMoveHorizontal = Input.GetAxisRaw("Horizontal") * PlayerSpeed * Time.deltaTime;
    transform.Translate(Vector3.right * amountToMoveHorizontal);

    float amountToMoveVertical = Input.GetAxisRaw("Vertical") * PlayerSpeed * Time.deltaTime;
    transform.Translate(Vector3.up * amountToMoveVertical);

    //if (Input.GetKey("z"))
    if (Input.GetKey("z"))
    {
        //Fire Projectile on the Left & Right (Note...Eventually make into a single command...)

        Vector3 leftposition = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, leftposition, transform.rotation);

        Vector3 rightposition = new Vector3(transform.position.x + transform.localScale.x * 8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, rightposition, transform.rotation);

        Vector3 right2position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right2position, Quaternion.Euler(0, 0, 20));

        Vector3 right3position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right3position, Quaternion.Euler(0, 0, 40));

        Vector3 right4position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right4position, Quaternion.Euler(0, 0, 60));

        Vector3 right5position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right5position, Quaternion.Euler(0, 0, 70));

        Vector3 right6position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right6position, Quaternion.Euler(0, 0, 80));

        Vector3 right7position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right7position, Quaternion.Euler(0, 0, 85));

        Vector3 right8position = new Vector3(transform.position.x + transform.localScale.x * -8, transform.position.y + transform.localScale.y * 5);
        Instantiate(ProjectilePrefab, right8position, Quaternion.Euler(0, 0, 90));

    }



}

} > Blockquote

more ▼

asked Aug 30 '10 at 04:47 PM

squall_789 gravatar image

squall_789
83 3 3 11

(comments are locked)
10|3000 characters needed characters left

1 answer: sort oldest

The easiest way to do this is to keep track of when the last bullet was fired:

float firingRate = 0.1f; //delay between shots, in seconds
float lastFired = -100f; //absolute time of last fired shot

void Update() {
    //early out if we have fired recently
    if (Time.time < lastFired + firingRate) {
        return;
    }

    //if we can fire, we record the new lastFired time
    lastFired = Time.time;

    //and actually fire the bullet
    //... firing code here
}
more ▼

answered Aug 30 '10 at 05:08 PM

Daniel Brauer gravatar image

Daniel Brauer
1.4k 12 19 38

Thanks man, that worked like a Charm. Works perfectly now. However Could you please example quite what "lastFired" does, changing it to any value appears to make no difference, however changing it to 100 instead of -100 causes the bullets to not fire at all. Thanks once again.

Aug 30 '10 at 05:24 PM squall_789

lastFired is just the last time a bullet was fired. If it started at zero, you wouldn't be able to fire for a moment, until firingRate seconds had passed. When you set it to 100, you can't fire until the game has played for more than 100 seconds. I should actually have made firingRate public, as it is a value you might want to tweak.

Aug 30 '10 at 05:42 PM Daniel Brauer
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x329
x179
x151
x58

asked: Aug 30 '10 at 04:47 PM

Seen: 781 times

Last Updated: Sep 02 '10 at 03:40 PM