Проблемы сопрограммы Unity Start/StopCoroutine() и решения для завершения сопрограммы и ее повторного запуска

Используется только для записи возникших проблем и решений.

Быстрое чтение:

1. Недопустимое завершение сопрограммы: Метод сопрограммы должен сохранить отдельную копию частного IEnumerator myTest. Имя метода не передается напрямую при запуске и завершении, но используется это сохранение. myTest запускается и завершается.

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

Подробное описание:

Запустите сопрограмму с помощью StartCoroutine(); передайте имя метода, который должен использовать Ctrip.

Конкретный сегмент кода выглядит следующим образом: Предполагается, что при использовании сопрограмм некоторые состояния игры необходимо сначала инициализировать.

public class Controller: MonoBehaviour
{
    private void start()
    {
        StartCoroutine(Test());
    }
    
    IEnumerator Test()
    {
        InitState();

        while(true)
        {
            DoSomething;
            yield return new WaitForSeconds(1);
        }
        
    }

    private void InitState()
    {
        DoSomething;
    }
}

End Ctrip StopCoroutine(); Вы не можете завершить сопрограмму, напрямую передав имя метода. Вам необходимо записать адрес сопрограммы следующим образом, а затем передать его в метод Stop.

private IEnumerator myTest;
myTest = Test();
StartCoroutine(myTest);
StopCoroutine(myTest);

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

Полный код выглядит следующим образом

public class Controller: MonoBehaviour
{
    private IEnumerator myTest;

    private void start()
    {
        myTest = Test();
        
        InitState();    // 手动初始化状态
        StartCoroutine(myTest);
    }
    
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StopCoroutine(myTest);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            InitState();    // 初始化状态写在协程开始之前
            StartCoroutine(myTest);
        }
    }

    IEnumerator Test()
    {
        while(true)
        {
            DoSomething;
            yield return new WaitForSeconds(1);
        }
        
    }

    private void InitState()
    {
        DoSomething;
    }
}

Guess you like

Origin blog.csdn.net/MeTicals/article/details/129860704