Используется только для записи возникших проблем и решений.
Быстрое чтение:
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;
}
}