Is it Possible to Cancel an Async Operation Once it has Begun?
Hello, I have a question... My main menu (built with Unity UI) has a level selector, when a button is selected it begins to load that scene, and then waits for the player to press the start button. This works. But my problem is that if the player picks a button, but then decides on a different level and wants to play that one, the Async Operation doesn't change. It will still load the first selected level.
So, I'm wondering if it's possible to "throw away" the previous Async Operation and start another one, so that if the player reconsiders his choice, it will successfully load.
Answer by cjdev · Aug 31, 2015 at 09:56 PM
You can't so much throw away the Async operation as check to see if it should be completed when it's time has come. For something like your application all you'd need is an int to keep track of which button or level the player has selected last and that would be the only Coroutine able to run. An implementation would look something like this:
private int activeBtn = 1;
void Start()
{
Button btn1 = (GameObject.Find("Button1") as GameObject).GetComponent<Button>();
Button btn2 = (GameObject.Find("Button2") as GameObject).GetComponent<Button>();
btn1.onClick.AddListener(() => StartCoroutine(Foo1(2f)));
btn2.onClick.AddListener(() => StartCoroutine(Foo2(2f)));
}
public IEnumerator Foo1(float waitTime)
{
activeBtn = 1;
yield return new WaitForSeconds(waitTime);
if(activeBtn == 1)
Debug.Log("Foo1");
}
public IEnumerator Foo2(float waitTime)
{
activeBtn = 2;
yield return new WaitForSeconds(waitTime);
if (activeBtn == 2)
Debug.Log("Foo2");
}