one bullet at a time

hi, trying to make an fps game here but i have got a little problem, im using the an uppgraded varsion of the Machine gun script from the fps tutorial, but im using it with a handgun so i thougt i would be better if it fires one bullet every time i hit the mouse button instead of shooting ine bullet every second as i have it now, can anyone help me (obviously i dont know the first thing about programming)

``` var SparkEmitter: GameObject; var BloodEmitter: GameObject; var DirtEmitter: GameObject; var range = 100.0; var fireRate = 0.05; var force = 10.0; var damage = 5.0; var bulletsPerClip = 40; var clips = 20; var reloadTime = 0.5; private var hitParticles : ParticleEmitter; var muzzleFlash : Renderer;

private var bulletsLeft : int = 0; private var nextFireTime = 0.0; private var m_LastFrameShot = -1;

function Start() { var direction = transform.TransformDirection(Vector3.forward); var hit : RaycastHit; if (Physics.Raycast (transform.position, direction, hit, range)){ print ("I'm looking at " + hit.transform.name); } else { print ("I'm looking at nothing!"); } DirtParticles = DirtEmitter.GetComponent(ParticleEmitter); BloodParticles = BloodEmitter.GetComponent(ParticleEmitter); SparkParticles = SparkEmitter.GetComponent(ParticleEmitter);

`// We don't want to emit particles all the time, only when we hit something.
if (DirtParticles)
    DirtParticles.emit = false;

// We don't want to emit particles all the time, only when we hit something.
if (BloodParticles)
    BloodParticles.emit = false;

// We don't want to emit particles all the time, only when we hit something.
if (SparkParticles)
    SparkParticles.emit = false;
bulletsLeft = bulletsPerClip;

```

}

function LateUpdate() { if (muzzleFlash) { // We shot this frame, enable the muzzle flash if (m_LastFrameShot == Time.frameCount) { muzzleFlash.transform.localRotation = Quaternion.AxisAngle(Vector3.forward, Random.value); muzzleFlash.enabled = true;

``` if (audio) { if (!audio.isPlaying) audio.Play(); audio.loop = true; } } // We didn't, disable the muzzle flash else { muzzleFlash.enabled = false; enabled = false; // Play sound if (audio) { audio.loop = false; } } } ```

}

function Fire () { if (bulletsLeft == 0) return;

``` // If there is more than one bullet between the last and this frame // Reset the nextFireTime if (Time.time - fireRate > nextFireTime) nextFireTime = Time.time - Time.deltaTime; // Keep firing until we used up the fire time while( nextFireTime < Time.time && bulletsLeft != 0) { FireOneShot(); nextFireTime += fireRate; } ```

}

function FireOneShot (){

``` DirtParticles = DirtEmitter.GetComponent(ParticleEmitter); BloodParticles = BloodEmitter.GetComponent(ParticleEmitter); SparkParticles = SparkEmitter.GetComponent(ParticleEmitter); var direction = transform.TransformDirection(Vector3.forward); var hit : RaycastHit; // Did we hit anything? if (Physics.Raycast (transform.position, direction, hit, range)) { // Apply a force to the rigidbody we hit if (hit.rigidbody) hit.rigidbody.AddForceAtPosition(force * direction, hit.point); // Place the particle system for spawing out of place where we hit the surface! // And spawn a couple of particles if (DirtParticles&&hit.collider.transform.CompareTag("Ground")) { DirtParticles.transform.position = hit.point; DirtParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); DirtParticles.Emit(); } if (BloodParticles&&hit.collider.transform.CompareTag("Enemy")) { BloodParticles.transform.position = hit.point; BloodParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); BloodParticles.Emit(); } if (SparkParticles&&hit.collider.transform.CompareTag("Metal")) { SparkParticles.transform.position = hit.point; SparkParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); SparkParticles.Emit(); } // Send a damage message to the hit object hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver); } bulletsLeft--; // Register that we shot this frame, // so that the LateUpdate function enabled the muzzleflash renderer for one frame m_LastFrameShot = Time.frameCount; enabled = true; // Reload gun in reload Time if (bulletsLeft == 0) Reload(); ```

}

function Reload () {

// Wait for reload time first - then add more bullets! yield WaitForSeconds(reloadTime); // We have a clip left reload if (clips > 0) { clips--; bulletsLeft = bulletsPerClip; } `

}

function GetBulletsLeft () { return bulletsLeft; }

1 Answer

1

I guess you could do something like this?

function Fire ()
{   
    if (Input.GetButtonDown("Fire"))
        FireOneShot();
}

Well I don't understand your script either. There's no code that detects input so I am not sure where to put the input test. Are you calling Fire() continously? You wanted to fire each time you pressed a button, and from my best effort to understand your code, that's sort of how it should look. Each time you press the button "Fire" down, it fires one shot.