Particles are off when I shoot

My particles are off when I shoot

var range = 100.0;
var fireRate = 0.05;
var force = 10.0;
var damage = 5.0;
var bulletsPerClip = 30;
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;
	}
}

function GetBulletsLeft () {
	return bulletsLeft;
}

are those particles coming from your muzzle flash or it's supposed to be where you hit? The muzzle flash particles should just be setup to emit from the tip of your gun, so I don't see how complicated that could be, just move the emitter there. If it's supposed to go to where you shot you might need a raycast to determine where that cursor is going. Not much of an expert on it though, you might have to look raycasting up.

The sparks in the picture is the effect of the bullet hitting the ground, I have a muzzle flash but I stop shooting when I took the pic so it didn't display

Ok, so you need to raycast the position to where your bullet is supposed to be hitting. Then emit from there. Or you can fire a bullet prefab and then when it collides with an object (the ground in this picture), you can destroy the bullet and instantiate your hitParticles.

How would I do that?

[Instantiate][1] [Add Force][2] [OnCollisionEnter][3] Instantiate the bullet, add force to it so it goes in the trajectory you want, then OnCollisionEnter to trigger the function that instantiates the particles. Don't forget to destroy your prefabs after a certain amount of time to not clutter your game. [1]: http://docs.unity3d.com/Documentation/ScriptReference/Object.Instantiate.html [2]: http://docs.unity3d.com/Documentation/ScriptReference/Rigidbody.AddForce.html [3]: http://docs.unity3d.com/Documentation/ScriptReference/MonoBehaviour.OnCollisionEnter.html

1 Answer

1

if your gun shoots at your mouse Position, then use

var direction = Camera.main.ScreenPointToRay(Input.mousePosition);

instead of

var direction = transform.TransformDirection(Vector3.forward);

this requirers your camera to be tagges as “main Camera”