- Home /
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;
}
}
Answer by ThePunisher · Jun 12, 2017 at 10:32 PM
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.
Answer by aguskos · Jun 12, 2017 at 06:34 PM
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());
}
Answer by Raimi · Jun 12, 2017 at 07:59 PM
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;
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612123934im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Quaternions acting up 1 Answer
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer
If gameobject moves do this 1 Answer
Change size of an object up to a limit 2 Answers