Сопрограмма продолжить сбой в моем скрипте API - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь перенастроить сценарий для моего приложения, и с новой обновленной версией Unity3d, похоже, StartCoroutine требует функции остановки, не знаю, где разместить функцию.

Я застрял, пытаясь понять, как добавить оператор if, который остановит сопрограмму и исправит фатальные ошибки.

Я пытался добавить StopAllCoroutines после StartCoroutine, как показано здесь:

void Start()
{
    StartCoroutine(GetText());
    StopAllCoroutines();
}

А вот полный скрипт GET-API:

void Start()
{
    StartCoroutine(GetText());
    StopAllCoroutines();
}

IEnumerator GetText()
{
    UnityWebRequest www = UnityWebRequest.Get(json);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
    }
    else
    {
        // Show results as text
        string myText = www.downloadHandler.text;
        var rate = (double)JToken.Parse(myText).SelectToken("bpi.USD.rate");
        var rate2 = 1 / rate;
        //response  Text.text = rate2.ToString();
        mText = GetComponent<TextMeshPro>();
        mText.text = "BTC: " + rate2.ToString("0.########");
    }
}

private void Update()
{
    Start();
}

Неустранимая ошибка: ошибка продолжения сопрограммы

1 Ответ

1 голос
/ 17 мая 2019

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

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

При использовании Coroutines в целом, если вы хотите, чтобы в любой момент был запущен только один живой экземпляр Coroutine, вы должны сохранить ссылку, возвращенную StartCoroutine, и вызвать StopCoroutine для этой ссылки следующим образом:

Coroutine Routine = null;

void Example()
{
    if (Routine != null)
    {
        StopCoroutine(Routine);
    }
    Routine = StartCoroutine(ExampleCoroutine());
}

IEnumerator ExampleCoroutine()
{
    // do coroutine

    // end coroutine with:
    Routine = null;
}

Убедитесь, что Monobehaviour, вызывающий StopCoroutine, совпадает с Monobehaviour, вызывающим StartCoroutine. Несоблюдение этого требования, вероятно, является наиболее распространенной причиной указанной вами ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...