- Home /
How to loop functions
Hi, I am trying to loop 2 functions in my script that handle the muzzle flash and light for my gun, but when I tried it unity just froze.
How do I loop it with like a little delay with 30-40 milliseconds?
Anyway, here's my script:
var AmmoPerMag = 30;
var AmmoInPocket = 120;
var AmmoInCurrentMag = 30;
var MuzzleFlash : GameObject;
var MuzzleLight : Light;
var RoundBursting = false;
function Start () {
}
function Update () {
while(RoundBursting){
MuzzleFlashFunc();
MuzzleLightFunc();
}
if(Input.GetButtonDown("Fire1")){
AmmoInCurrentMag -= 1;
AmmoInPocket -= 1;
audio.Play();
MuzzleFlashFunc();
MuzzleLightFunc();
}
if(Input.GetButton("Fire1")){
AmmoInCurrentMag -= 0.1;
AmmoInPocket -= 0.1;
RoundBursting = true;
}
if(Input.GetButtonUp("Fire1")){
RoundBursting = false;
}
}
function MuzzleLightFunc () {
MuzzleLight.enabled = true;
yield WaitForSeconds(0.04);
MuzzleLight.enabled = false;
}
function MuzzleFlashFunc () {
MuzzleFlash.renderer.enabled = true;
yield WaitForSeconds(0.04);
MuzzleFlash.renderer.enabled = false;
}
Answer by jonbro5556 · Oct 04, 2013 at 08:35 PM
your problematic code can be reduced to this
function Update () {
while(RoundBursting){
MuzzleFlashFunc();
MuzzleLightFunc();
}
}
function MuzzleLightFunc () {
MuzzleLight.enabled = true;
yield WaitForSeconds(0.04);
MuzzleLight.enabled = false;
}
function MuzzleFlashFunc () {
MuzzleFlash.renderer.enabled = true;
yield WaitForSeconds(0.04);
MuzzleFlash.renderer.enabled = false;
}
The issue is that because you are calling "while" in your update loop, it enters the while loop and then can't get to the portion of the code where the flash ends.
Quite truthfully, I don't know if coroutines are the best way to handle this, I would do it with a timer that I -= deltaTime and check to see if it goes under 0 in the update loop. However, if you want to do it with coroutines, this should work.
var RoundBursting = false;
function Start(){
// kick off the coroutine that will handle if the player is shooting
StartCoroutine(HandleShooting());
}
function Update () {
// set the input up or down
RoundBursting = Input.GetButton("Fire1");
}
function HandleShooting(){
// just keep calling the while loop forever
while(1==1){
// check to see if the input is pressed down
if(RoundBursting){
MuzzleLight.enabled = true;
MuzzleFlash.renderer.enabled = true;
AmmoInCurrentMag -= 0.1;
AmmoInPocket -= 0.1;
yield WaitForSeconds(0.04);
MuzzleLight.enabled = false;
MuzzleFlash.renderer.enabled = false;
}
// you need this yeild so that it doesn't get stuck in this while loop
yield;
}
}
Your answer

Follow this Question
Related Questions
Zombie FPS 2 Answers
Troubles With A Shoot Script 1 Answer
Bullet Hole not inline with sight?(Center of Screen) 1 Answer
My bullets wont work when i shoot them 0 Answers
Gun script reload problems 3 Answers