What's stopping 'WaitForSeconds' from working?

I have the script with the coroutine:

float maxDuration = 0.5f;
	public IEnumerator slowDown = null;
	float countdown = 0;

	public IEnumerator SlowTime(float scale, float dur){
		if(dur > maxDuration){
			dur = maxDuration;
		if(dur < 0){
			dur = 0.001f;

		countdown = 0;
		Time.timeScale = scale;
		Debug.LogWarning("Scale: " + Time.timeScale + " - Duration: " + dur);
		yield return new WaitForSeconds(dur * Time.timeScale);
		Time.timeScale = 1;

and the script setting it ( where The final “Slow” function is probably the most relevant.):

	bool meleeDeflectionEnabled;
	bool projectileDeflectionEnabled;
	bool spellDeflectionEnabled;
	GameObject player = null;
	States playerState;
	GameObject enemy = null;
	public Vector3 deflectDirection;
	float distance = 1.5f;
	GameObject instancePrefab;

	float timeScale = 0.1f;
	float slowDuration = 0.5f;
	TimeControl timeControl;

	void Start(){
		instancePrefab = Resources.Load("DeflectionTarget",typeof(GameObject)) as GameObject;
		player = transform.parent.gameObject;
		//deflectDirection = player.GetComponent<CombatInput>().direction;
		playerState = player.GetComponent<States>();
		timeControl = GameObject.FindGameObjectWithTag("Vital").GetComponent<TimeControl>();

	//This part is going to be called immediately, and only once, when something enters. I'm going to have to apply this script through script because of that...
	//since I can't .enabled = false the OnTriggerEnter part, only updates, which aren't in use.

	void OnTriggerEnter(Collider attack){
		//if player is deflecting and if collider is attack,


	void CheckAttack(Collider attack){
		if(attack.tag == "Attack"){
			if( attack.GetComponent<DamageVolume>() != null){
				AttackTypes attackType = attack.GetComponent<DamageVolume>().attackType;
				if( attackType == AttackTypes.Melee){
					enemy = attack.transform.parent.gameObject;
					Deflection(attack.transform, deflectDirection);


	void Deflection(Transform attack, Vector3 deflectDir){
		//What does deflection mean? It means the the opponent is pushed towards a target location, and facing a certain direction. 
		Vector3 deflectPosition = (deflectDirection * distance) + player.transform.position;
//		Instantiate(instancePrefab, deflectPosition, Quaternion.identity);

		//Target location Have them both face it, and move toward it.
		//should I maybe handle the movement in the enemy AI? yeah.
		//where should the AI get the position data from? From the deflection volume? Sure.

		enemy.GetComponent<EnemyAI>().deflectionPosition = deflectPosition;
		enemy.GetComponent<EnemyAI>().deflectedTime = enemy.GetComponent<EnemyAI>().defaultDeflectTime;
		//The attack is also displayed as nullified for the player.
		//stop damage of all attacks in those frames.
		//Get distance between attacker and target point, and have set the velocity so it happens over a set amount of seconds.
		//Rotate a set amount per second. Decided the the difference in degrees. 
		//Get damage data and reduce the damage. 
		playerState.deflecting = false;


	void Slow(){
		//Check if stopping coroutine is necessary
		if( timeControl.slowDown != null){
		//Set corouting data
		timeControl.slowDown = timeControl.SlowTime(timeScale, slowDuration);
		//start  the coroutine
		//Set buffers.
		timeScale *= 2;
		slowDuration *= 0.6f;

I’m extremely confused as to what’s happening since I get feedback that the script has been entered, but slowdown doesn’t always happen in a similar script - but this one in particular only slows down, and doesn’t recover, as if the " yield return new WaitForSeconds(dur * Time.timeScale);" line either never starts or never resolves.

Answering my own question:
I thought I got around the code getting killed when the script was destroyed , but I was calling the StartCoroutine in the script that was getting destroyed, (by using StartCoroutine(timeControl.slowDown):wink:
instead of the TimeControl script ( with timeControl.StartCoroutine(timeControl.slowDown):wink: