- Home /
Reload After Magazine Is Empty
I'm making a top down shooter and I'm using a modified version of the RocketLauncher.js script to act like a machine gun. (I'm doing this because I'm adding a trail to the bullet and it wouldn't look right with the MachineGun.js) I put magazines in the rocket launcher script (Now GunScript) and I made it so if the ammo runs out, if there is a magazine left, it'll add more ammo. It's all working fine but now I want there to be a break after there's no more ammo... Here's my primitive version of the script.
var projectile : Rigidbody; var initialSpeed = 20.0; var reloadTime = 0.5; var ammoCount = 20; var ammoInMagazine = 20; var magazineCount = 5.0; private var lastShot = -10.0;
function Update() { if (ammoCount == 0 && magazineCount > 1) { ammoCount = ammoInMagazine; magazineCount--; } }
function Fire () { // Did the time exceed the reload time? if (Time.time > reloadTime + lastShot && ammoCount > 0) { // create a new projectile, use the same position and rotation as the Launcher. var instantiatedProjectile : Rigidbody = Instantiate (projectile, transform.position, transform.rotation);
// Give it an initial forward velocity. The direction is along the z-axis of the missile launcher's transform.
instantiatedProjectile.velocity = transform.TransformDirection(Vector3 (0, 0, initialSpeed));
// Ignore collisions between the missile and the character controller
Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider);
lastShot = Time.time;
ammoCount--;
}
}
It's primitive but it works :)
Again, I want it to reload after the magazine runs out of bullets.
Answer by Peter G · Aug 14, 2010 at 05:14 PM
You can use yield WaitForSeconds
. What's important to notices is that there is a bool to make sure that Reload isn't called multiple times at the same time. I used a bool, there are other ways, but if you don't, every frame that there is not ammo (that is your FPS * reloadTime) will call reload again hence one reload would eat up maybe 100 magazines. That's bad.
var isReloading = false; var reloadTime = 3;
function Update() { if(Input.GetButtonDown("Reload") || ammoCount == 0) { if (magazineCount > 1 && !isReloading) { isReloading = true; Reload();
}
}
}
function Reload () {
yield WaitForSeconds(reloadTime);
ammoCount = ammoInMagazine;
magazineCount--;
isReloading = false;
}
Answer by Cyb3rManiak · Aug 14, 2010 at 05:24 PM
Edit - Whoops. Sorry about giving the same answer. Was away from my computer and by the time posted - it was already answered.
The quickest way would be:
if (ammoCount == 0 && magazineCount > 1) { ammoCount = ammoInMagazine; magazineCount--;
// Don't let the player shoot for 3 seconds
lastShot = Time.time + 3 - reloadTime;
}
A cleaner way (IMHO) would be to do something like this:
private var bChangingClip:boolean = false;
// Getting rid of the Update function. This is a waste. No need to check each frame... Just after firing //function Update() {}
function Fire () { // Did the time exceed the reload time? if (!bChangingClip && Time.time > reloadTime + lastShot && ammoCount > 0) { ... lastShot = Time.time; ammoCount--; if (ammoCount == 0 && magazineCount > 1) StartCoroutine("IE_ChangeClip"); } }
function IE_ChangeClip(): IEnumerator { bChangingClip = true;
yield WaitForSeconds(3.0);
ammoCount = ammoInMagazine;
magazineCount--;
bChangingClip = false;
}
Your answer
Follow this Question
Related Questions
Gun - Ammo , reloading and UI problem. 1 Answer
Gun with ammo help 1 Answer
Ammo Script 1 Answer
Need some help with my gun reloading script 1 Answer
Buying Ammo HELP 0 Answers