Объявление
public void StopCoroutine(string methodName);public void StopCoroutine(IEnumerator routine);
public void StopCoroutine(Coroutine routine);
Параметры
methodName | Имя сопрограммы. |
routine | Имя функции в коде, включая сопрограммы. |
Описание
Остановка первой сопрограммы с именем methodName
или сопрограммы, хранящейся в routine
, работающей с этим поведением.
StopCoroutine принимает один из трех аргументов, указывающих, какая сопрограмма останавливается:
- Строковая функция, именующая активную сопрограмму.
- Переменная
IEnumerator
, использованная ранее для создания сопрограммы. Coroutine
для остановки созданной вручнуюCoroutine
.
Примечание. Не смешивайте три аргумента. Если в качестве аргумента в StartCoroutine используется строка, используйте строку в StopCoroutine. Точно так же используйте IEnumerator
как в StartCoroutine, так и в StopCoroutine. Наконец, используйте StopCoroutine
с Coroutine
, используемой для создания.
В примере CS используется тип IEnumerator.
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour
{
// сохраняем копию выполняющегося скрипта
private IEnumerator coroutine;
// Используйте это для инициализации
void Start()
{
print("Starting " + Time.time);
coroutine = WaitAndPrint(3.0f);
StartCoroutine(coroutine);
print("Done " + Time.time);
}
// вывод в консоль каждые 3 секунды.
// yield вызывает паузу WaitAndPrint каждые 3 секунды
public IEnumerator WaitAndPrint(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
void Update()
{
if (Input.GetKeyDown("space"))
{
StopCoroutine(coroutine);
print("Stopped " + Time.time);
}
}
}
В следующем примере cs показано, как можно использовать StopCoroutine(Coroutine).
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
void Start()
{
StartCoroutine(coroutineA());
}
IEnumerator coroutineA()
{
// ждем 1 секунду
yield return new WaitForSeconds(1.0f);
Debug.Log("coroutineA() started: " + Time.time);
// ждем еще 1 секунду и затем создаем b
yield return new WaitForSeconds(1.0f);
Coroutine b = StartCoroutine(coroutineB());
yield return new WaitForSeconds(2.0f);
Debug.Log("coroutineA() finished " + Time.time);
// Ожидалось, что B() будет выполняться в течение 10 секунд
// но был закрыт здесь после 3.0f
StopCoroutine(b);
yield return null;
}
IEnumerator coroutineB()
{
float f = 0.0f;
float start = Time.time;
Debug.Log("coroutineB() started " + start);
while (f < 10.0f)
{
Debug.Log("coroutineB(): " + f);
yield return new WaitForSeconds(1.0f);
f = f + 1.0f;
}
// Предназначен для обработки выхода из этой сопрограммы.
// Однако coroutineA() отключает coroutineB(). Этот
// означает, что следующие строки не вызываются.
float t = Time.time - start;
Debug.Log("coroutineB() finished " + t);
yield return null;
}
}