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;



}

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;
  } 
}