как сделать сопрограмму финишировать первой перед запуском другой сопрограммы

Привет, я новичок в Unity и C # ..

У меня есть два файла сценария в одной сцене,

1 сопрограмма в файле versionchecker.cs для получения данных о номере версии с моего веб-сервера

public string versionURL = "http://localhost/check.php";

 IEnumerator GetVersion()
 {
     WWW vs_get = new WWW(versionURL);
     yield return vs_get;

     if (vs_get.error != null)
     {
         connection = 1;
     }
     else
     {
         currentVersion = vs_get.text;
         bundleVersion = PlayerSettings.bundleVersion;
         connection = 0;
     }
 }

Но в другом файле в beginingscreen.cs у меня есть сопрограмма для начального экрана ..

 void Start () {
     if(!isExit)
         StartCoroutine (BeginningAnimation ());
     else
         StartCoroutine (EndAnimation ());
 }

 IEnumerator BeginningAnimation()
 {
     fade.FadeIn (1.5f);
     yield return new WaitForSeconds (2);
     fade.FadeOut (1);
     yield return new WaitForSeconds (0.9f);
     Application.LoadLevel (LevelToLoad);
 }

 IEnumerator EndAnimation()
 {
     yield return new WaitForSeconds (0.5f);
     fade.FadeOut (1);
     yield return new WaitForSeconds (1);
     Application.Quit ();
 }

этот скрипт я помещаю в ту же сцену моей игры .. но иногда сопрограмма для начала экрана заканчивается раньше, чем сопрограмма для получения версии, потому что для получения версии требуется подключение к веб-серверу, а иногда веб-сервер отстает ..

Итак, как я могу сделать так, чтобы сопрограмма получения версии сначала завершилась, а после этого начальный экран можно было запустить ..


person folta20    schedule 04.11.2014    source источник
comment
Используйте yield return WaitUntil(() => coroutineOver); внутри второй сопрограммы, где coroutineOver - это bool, для которого устанавливается значение true после завершения первой сопрограммы.   -  person Daniel    schedule 22.02.2021


Ответы (1)


Два разных подхода:

Вы можете просто добавить скрипт компонента (beginingscreen.cs) только после завершения выполнения первой сопрограммы. Таким образом гарантируется, что другие сопрограммы не запустятся слишком рано.

IEnumerator GetVersion()
{
    // ...
    gameObject.AddComponent<BeginingScreen>();
}

Вы можете сделать метод Start сопрограммой в файле beginingscreen.cs, затем вызвать GetVersion и дождаться его завершения (GetVersion должен быть общедоступным):

IEnumerator Start()
{
    var getVersion = gameObject.GetComponent<VersionChecker>();
    if (getVersion != null)
    {
        yield return StartCoroutine(getVersion.GetVersion());
    }

    if(!isExit)
        yield return StartCoroutine (BeginningAnimation());
    else
        yield return StartCoroutine (EndAnimation());
}

В обоих решениях вам нужны два компонента (скрипта), чтобы как-то взаимодействовать друг с другом. Или вы можете создать третий сценарий, который обрабатывает это взаимодействие.

person Kryptos    schedule 04.11.2014