- Home /
is there anything wrong with this script
this is a machine gun script that i put into the gun on my game but the gun does not work. im not sure what is wrong with it but i want to make sure if there is any thing wrong with the script below.
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 () { hitParticles = GetComponentInChildren(ParticleEmitter); // We don't want to emit particles all the time, only when we hit something. if (hitParticles) hitParticles.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.AngleAxis(Random.value * 360, Vector3.forward); muzzleFlash.enabled = true;
if (audio) {
if (!audio.isPlaying)
audio.Play();
audio.loop = true;
}
} else {
// We didn't, disable the muzzle flash
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 () { 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 (hitParticles) {
hitParticles.transform.position = hit.point;
hitParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
hitParticles.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; } }
Answer by aldonaletto · Apr 05, 2012 at 09:31 PM
Well, this is the widely known MachineGun.js script, from the old and good FPS Tutorial. You should follow the instructions of that tutorial, because this script is closely related to the gun model: it should have muzzle flash model attached to the gun, and you should drag this muzzle model to the field muzzleFlash in the Inspector. You should also add an AudioSource to your gun and set its clip to the shot sound you prefer. To fire, you must call the function Fire in this script, or (like in the tutorial) call it with BroadcastMessage("Fire") from the player script. Additionally, you should add a ApplyDamage(damage: float) function to your enemies, because this function will be called by the script above when something is hit. Finally, you should have a particle effect childed to the weapon.
In a brief: read the tutorial instructions! You will learn a lot!
How are you firing? You could add the following code to the script above:
function Update(){ if (Input.Get$$anonymous$$ouseButton(0)){ // shoot pressing the left mouse button Fire(); } }
Anywhere in the script (but not inside another function!) - between Start and LateUpdate, for instance. This code just make a local read of the left mouse button, calling Fire() when it's pressed. $$anonymous$$aybe you should use Get$$anonymous$$ouseButton ins$$anonymous$$d of Get$$anonymous$$ouseButtonDown - the latter will only shoot once, while the first allows continuous firing.
In between your Start() and LateUpdate() functions. :) What @Aldonaletto is saying is that you aren't actually calling your Fire() function anywhere in the script, so of course your machine gun won't work. Therefore, you should insert his code which adds an Update() function (a method which runs every frame) and calls your Fire() function when the left mouse button is held down. ;)
Your answer
![](https://koobas.hobune.stream/wayback/20220613065948im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
cant get my gun to work 0 Answers
How can I make robot fire a machine gun? 1 Answer
Unity Coroutine problem 1 Answer
I want to be able to make a good shoot script that actually works. 0 Answers