Bug? And any way to do something for 5 seconds when shift is held?

I need to setup a power up system so on shift down the rigid-body on the player will be disabled. Here is the code I have so far. The only problem with this code is when you hit shift in the game… Frozen freezes up every time.

	void Update () 
	{
		PowerupTimer = Time.realtimeSinceStartup;
		PowerupTimer2 = Time.realtimeSinceStartup + 5;
		if(Input.GetKeyDown(KeyCode.LeftShift) & PowerupUsed == false)
		{
			NoclipPowerup();
		}
	}
	void InstantiatePlatforms()
	{	
		 while(NumberOfPlatforms > 0)
		 {
    	 	RandNum = Random.Range(0,PlatformList.Count);  //Generates a random number from zero to the total amount of things in our list
    	 	Instantiate(Platform, PlatformList[RandNum].position, Quaternion.identity);
    	 	PlatformList.RemoveAt(RandNum);   //Removes the transform contained at the index we picked at random. You don't want to reuse a spot, since that could put a platform on top of a platform.
		 	NumberOfPlatforms = NumberOfPlatforms - 1;
		 }
		
	}
	void NoclipPowerup()
	{
		while(PowerupTimer < PowerupTimer2)
		{
			Debug.Log("The Powerup works");
		}
	}

Any ideas on the powerup and/or how to fix the crash?

It’s not a bug, you need to use a Coroutine. What you’re doing here is sending Unity into an infinite loop because Time.realtimeSinceStartup is always going to be less than Time.realtimeSinceStartup +5. :slight_smile:

Try this:

if(Input.GetKeyDown(KeyCode.LeftShift) & PowerupUsed == false)
    StartCoroutine(NoclipPowerup(5));


IEnumerator NoclipPowerup(float delay)
{
    float startTime = Time.time;

    collider.enabled = false;
    
    while (startTime + delay > Time.time)
        yield return null;

     collider.enabled = true;
}

But, of course, you don’t need to time it yourself, because Unity provides a mechanism for you; here’s something a little more elegant.

IEnumerator NoclipPowerup(float delay)
{
    collider.enabled = false;
    yield return new WaitForSeconds(delay);
    collider.enabled = true;
}

You should also consider putting some protection in there to ensure that you only call it once at a time.