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; }
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.
– Statement