Асинхронное программирование в Unity - PullRequest
0 голосов
/ 07 марта 2019

Я делаю процесс добавления каталогов последовательных изображений в папке в папке к значению списка словаря как Texture2d.

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

Можете ли вы помочь мне с этим?

Ниже приведен блок кода.

public void DataActives(string defStrings)
{
    atorLoadingPanel.SetBool("ActiveLoad", true);
    TaskAsyncCountDown(2,"Wait");
    this.gameObject.GetComponent<PCManager>().TypeString = defStrings;
    float CaseControl = TimePanelVariablesChanges();
    switch (CaseControl)
    {
        case 0:
            this.gameObject.GetComponent<PCManager>().Daily();
            //Debug.Log("Case 1");
            break;
        case 1:
            this.gameObject.GetComponent<PCManager>().Weekly();
            //Debug.Log("Case 2");
            break;
        case 2:
            this.gameObject.GetComponent<PCManager>().Monthly();
            //Debug.Log("Case 3");
            break;
        case 3:
            this.gameObject.GetComponent<PCManager>().Yearly();
            //Debug.Log("Case 4");
            break;
        default:
            //Debug.Log("Hata Fırlat");
            break;
    }
    this.gameObject.GetComponent<PCManager>().ShowData();
}


public async Task TaskAsyncCountDown(int count, string flag = "")
{
    for (int i = count; i >= 0; i--)
    {
        LogToTUnityConsole(i, flag);
        await Task.Delay(1000).ConfigureAwait(false);
    }
    atorLoadingPanel.SetBool("ActiveLoad", false);
}

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

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

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

IEnumerator Example(string url)
{
  var www=new WWW(url);
  Debug.Log("Requesting "+url);
  yield return www;                 // wait for request to complete
  Debug.Log("Rquest completed");
  yield return new WaitForSeconds(1); // wait another second
  Debug.Log("Proceeding");
}

Это будет выполняться в нескольких кадрах, оставаясь в основном потоке

0 голосов
/ 07 марта 2019

Спасибо, zambari.

Мне нужно немного больше взглянуть на Coroutines:)

IEnumerator Example(string url, DateTime realToday, DateTime realFistDate)
{
    LoadingAnimator.SetBool("ActiveLoad", true);
    yield return new WaitForSeconds(1);
    var www = new WWW(url);
    Debug.Log("Requesting " + url);
    while (realToday != realFistDate)
    {
        images.Add(realFistDate.ToString("dd.M.yyyy HH"), returnSprite(realFistDate, TypeString));
        imagesTime.Add(realFistDate.ToString("dd.M.yyyy HH"));
        realFistDate = realFistDate.AddHours(1);
    }
    yield return www;
    UnityEngine.Debug.Log("Rquest completed");
    yield return new WaitForSeconds(1);
    UnityEngine.Debug.Log("Proceeding");
    LoadingAnimator.SetBool("ActiveLoad", false);
    ShowData();
}

Я решил свою проблему с этим блоком кода

...