Machine Gun Problem

Hey There is a problem with my machine gun script that is important and I cant continue my game because of it and it’s that when I am shooting the bullets split apart from each other and they keep doing that until it is not visible and I can’t destroy my Target.

This is the MachineGun script I am using, I did not create it but thank you to whoever did.

var EmitSparksTag: String;
var EmitBloodTag: String;
var EmitDirtTag: String;
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(EmitDirtTag))
		{
			DirtParticles.transform.position = hit.point;
			DirtParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
			DirtParticles.Emit();
		}
		if (BloodParticles&hit.collider.transform.CompareTag(EmitBloodTag))
		{
			BloodParticles.transform.position = hit.point;
			BloodParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
			BloodParticles.Emit();
		}
       if (SparkParticles&hit.collider.transform.CompareTag(EmitSparksTag))
		{
			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;
}

I am trying to add screen shots.

~Steve

Sorry, Bumping Topic

First off, it is extremely important to use punctuation. I know commas and periods don’t look very special but they make a huge difference when people try to read what you’ve written.

I don’t see anything wrong with the code itself. Screenshots or a more descriptive description could be helpful.

Sorry about that, There are screen shots now for you to see
Yeah so the bullets just keep splitting I dont know why. If you need I can show my GameObject list in my Hierarchy for the MachineGun.

~Steve

What do you mean splitting? Duplicating? It’s hard to tell what’s going on when all you give is “It’s duplicating. Help.”.

Have you tried to debug this per line? Does it happen per frame, or at a specific frame or distance/event (hits something)? Does it happen after firing for X seconds/rounds, or even when you fire it once?

Sorry, What happens is that the bullets move away from each other over a period of time, not frames or even how many times I shoot just over time I tried multiple ways because I thought that it would be the GameObject placement but its not, that’s why I need help.

~Steve

What’s happening is the problem to hard? 8)

Do you mean your impact points? Do your bullets start off hitting the same spot over and over but as time goes on start to hit points farther away? Or do they just naturally follow a spread pattern (which is to be expected for a projectile weapon)?

Is it burst fire inaccuracy? When you fire many shots, does it spread out more, then return to a narrow spread when you stop firing? That would indicate your bullet source is moving.

Is your weapon or your character animated? Do the bullets come from the gun or from the player? Is whatever they come from moving without you giving it input? Perhaps the gun has a fire animation or an unnecessary collider and it jitters?

Thanks for replying, and it is that the bullets start off hitting the same spot over and over but as time goes on start to hit points farther away and its nothing else ill show a pic on the gameobject in the hierarchy.

Is it burst fire inaccuracy? When you fire many shots, does it spread out more, then return to a narrow spread when you stop firing? That would indicate your bullet source is moving. Nope.

Is your weapon or your character animated? Yes But The Weapon Isn’t.
Do the bullets come from the gun or from the player?Sorta in Between.
Is whatever they come from moving without you giving it input? No.
Perhaps the gun has a fire animation or an unnecessary collider and it jitters? Nope

~Steve

Sorry to bother everyone but I need this problem solved…

~Steve

I’m a total and utter newb, so take this with a grain of salt, but I once had my rocket trails split into two because “damping” was checked on in the partial effects options. But I don’t don’t know if that has anything to do with this.

Simplest things often being the source of biggest problems, are you sure you’re only making one instance of your bullets? The routine is only being called once? Have you tried firing just one bullet/particle, and increasing it one at a time to see where the deviation starts? Have you tried stepping through the game loop as the bullets are created and watching what’s happening on a line-by-line basis?

If you’re not familiar with debugging, Debug.Log is still your friend…it’s slow to cover everything but if your need is great, it’s worth the effort.