Cooldown Function Problem

I have to separate functions that exist to set variables back to their defaults:
a “busy” variable, and a combo counter.

The busy variable of course is set to true when my character attacks. It temporarily disables the character’s movement, and keeps attacks from overlapping.

The combo counter increases each time the attack button is pressed, up until the combo max (which will automatically set itself to zero when it reaches max).

What i would like is for the function that sets the busy variable to false (the Cooldown function) to happen after x amount of time IF the player hasn’t attacked again. If the player does attack again, I want to “cancel” this function. For the function that resets the combo counter (ComboReset), i would like to cancel it if the player doesn’t attack again for x amount of time. If the player does attack again, i would also like to “Cancel” this function.

Here is what I currently have:

	//================================================================//
	//Cooldown for Attacking and Flinching
	//================================================================//
	function Cooldown(cd : float)
	{
		if (busy)
		{
			yield WaitForSeconds (cd);
			busy = false;
			ComboReset (2f);
		}
		
		if (_movement.isFlinching)
		{
			_movement.isFlinching = false;
		}
	}
	

	//================================================================//
	//Combo Reset
	//================================================================//
	function ComboReset(cr : float)
	{
		yield WaitForSeconds (cr);
		if (busy)
		{
			return;
		}
		else
		{
			comboCount = 0;
			priority = 0;		
		}
	}

function Attack (attack : String, animation : String, hitPoints : int, str : int,  launch : int, radi : float, posi: Vector3, delay : float, pr : int)
	     
	{
...[Code excluded]...
//Check for the EnemyDamage component attached to the enemy object
		for (var go : GameObject in enemies)
		{
			var enemy = go.GetComponent(EnemyStat);
			if (enemy == null)
			continue;
			

			//If the enemy is in the attack radius
			if (Vector3.Distance(enemy.transform.position, pos) < radius)
			{
				//This pushes the enemy back dependant on the number of the strength variable
				strength = str;
				
				//Send damage to enemies in contact
				enemy.SendMessage("ApplyDamage", hitPoints);
				
				// Play sound.
				if (punchSound)
				audio.PlayOneShot(punchSound);
				
				//Create the particle for the attack if it lands
				Instantiate (attackParticle, enemy.transform.position, Quaternion.identity);
			}
			
Cooldown (2);
}

What you need is Invoke and CancelInvoke. I use that for the same reason on a RPG game I’ve made. Something like:

function Attack()
{
   CancelInvoke("FinalizeAttack");
   Invoke("FinalizeAttack", 1.5);
   
   //other code here
}