Why is this script I made crashing unity

I’m simply making a gameobject move at a certain speed then stop and go the other way. But it keeps crashing my unity on compile. So any advice on how to make these of waits and move codes loop in a better fashion.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingBackground : MonoBehaviour 
{
	int Set = 1;

	void Update() 
	{
		while(Set == 0)
        {
			StartCoroutine(TimerSet1());	
		}
		while(Set == 1)
		{
			StartCoroutine(TimerSet2());
		}
	}

	IEnumerator TimerSet1()
    {
		transform.Translate(-1, 0, 0);
        yield return new WaitForSeconds(18);
		Set = 1;
	}
	IEnumerator TimerSet2()
    {
		transform.Translate(+1, 1, 0);
		yield return new WaitForSeconds(15);
		transform.Translate(1, -1, 0);
		yield return new WaitForSeconds(18);
		transform.Translate(-1, -1, 0);
		Set = 0;
    }
}

There’s so many things wrong with that setup you have. You’ll definitely not want a while loop of any kind in your Update loop. This is just a recipe for disaster. Anything happens to that code that doesn’t give the expected result and you will be stuck there indefinitely. You’ll also always want to make sure you’re not starting coroutines from something that is called in a loop. This is also a recipe for disaster.

It looks to me that you simply want to kick off two different sets of movement that alternate? So TimerSet2 would do its movement thing, then TimerSet1 would do its thing, then back to TimerSet2, right? If so why don’t you just start up a coroutine in your Start method that does the following:

public class MovingBackground : MonoBehaviour
{

    bool m_moveBackground = true;

    void Start()
    {
        StartCoroutine(MovementRoutine());
    }

    IEnumerator MovementRoutine()
    {
        while (m_moveBackground)
        {
            transform.Translate(-1, 0, 0);
            yield return new WaitForSeconds(18);
            transform.Translate(+1, 1, 0);
            yield return new WaitForSeconds(15);
            transform.Translate(1, -1, 0);
            yield return new WaitForSeconds(18);
            transform.Translate(-1, -1, 0);
            yield return new WaitForSeconds(15);
        }
    }
}

I don’t know exactly what behavior you are looking for, but use this as a template and modify it as you please.

This happens because Coroutines are async.
You can set your “Set” to -1 for example, at the start of your courutins or you can do it like so.

  void Start()

    {
        StartCoroutine(TimerSet1());
    }

    IEnumerator TimerSet1()
    {
        yield return new WaitForSeconds(1);
        StartCoroutine(TimerSet2());
    }
    IEnumerator TimerSet2()
    {

        yield return new WaitForSeconds(1);
        StartCoroutine(TimerSet1());
    }

while loops need to yield and return…

while(true)
{
     //do something

     yield return null;

}

use…

       if(Set == 0)
         {
             StartCoroutine(DoStuff1());    
         }
         else if(Set == 1)
         {
             StartCoroutine(DoStuff2());
         }

IEnumerator DoStuff1()
{
     //Do stuff
     yield return new WaitForSeconds(3);
     //Do stuff
     yield break;
}