- Home /
Modified Machine Gun Script Error
OK I have been looking for weeks now for a way to have my weapons emit different particles when they hit differenty game objects. and on the Unity forum I found this:
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("alienZombie"))
{
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; }
BUT I get this error message: MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. MachineGun.FireOneShot () (at Assets/WeaponScripts/MachineGun.js:104) MachineGun.Fire () (at Assets/WeaponScripts/MachineGun.js:95) UnityEngine.Component:BroadcastMessage(String) PlayerWeapons:Update() (at Assets/WeaponScripts/PlayerWeapons.js:10)
WHY? To the bet of my knowledge I have set it up exaxtly the way he has it in his sample project with the small exception that I'm naturally using my own particle emiters??? WTF WTF WTF Man this crap frustrates me!!
Your answer
Follow this Question
Related Questions
Particle Emitter error, Missing reference exception. 1 Answer
how to make bullet marks 0 Answers
Multiple particle emitters within a player object 1 Answer
Particle Collision Problem 2 Answers
cant get my gun to work 0 Answers