База знаний ЯЮниор
  • C#
    • 🗃️Ссылочные и значимые типы в C# Ключевые слова ref, out, in Что нужно знать новичку
    • 📋Использование констант
    • 🔖Snippet или фрагмент кода
    • 📝Пустые строки
    • 🛡️Инкапсуляция
  • Unity
    • 🚶‍♂️Управление Параметрами Аниматора
    • ⚙️Динамическое изменение объектов
      • 🛠️Создание объектов
      • 🪛Изменение объектов
      • 🪚Добавление и изменение компонентов
      • 🔥Удаление объектов и компонентов
    • 🔊События
      • 🧬Параметризация
      • 🔗Совмещение событий
      • 📡Action и UnityAction
      • 🕹️UnityEvent
    • 🔌Подключение среды разработки к Unity
    • ⌚Корутины
      • 🪄Управление корутинами
      • ⏰Yield Instruction
      • 🕵️‍♂️Как устроены корутины?
  • Git и GitHub
    • 🗃️Git
    • 🗄️GitHub
    • 🖥️GitHub Desktop
Powered by GitBook
On this page
  • Как запустить корутину?
  • Как сохранить корутину?
  • Как остановить корутину?
  • Полноценный пример управления корутиной

Was this helpful?

  1. Unity
  2. Корутины

Управление корутинами

Автор: Дмитрий Прокопьев

Как запустить корутину?

Для этого в классе MonoBehaviour есть метод StartCoroutine, он принимает в себя IEnumerator - результат вызова метода корутины:

Coroutine coroutine = StartCoroutine(DoSomething());

Как сохранить корутину?

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

private Coroutine _coroutine;

private void Start()
{
    _coroutine = StartCoroutine(DoSomething());
}

Как остановить корутину?

Для остановки в классе MonoBehaviour есть метод StopCoroutine:

StopCoroutine(_coroutine);

В качестве параметра он принимает в себя экземпляр класса Coroutine - ту корутину, которую мы хотим остановить. Для этого мы обычно корутины и сохраняем.

Важно. До первой инициализации поле с корутиной будет равно null. Важно предусмотреть это:

if (_coroutine != null)
    StopCoroutine(_coroutine);

А так можно остановить все корутины на объекте:

StopAllCoroutines();

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

Полноценный пример управления корутиной

LightSwitcher.cs
public class LightSwitcher : MonoBehaviour
{
    [SerializeField] private float _delay;
    [SerializeField] private Light _light;
    
    private Coroutine _coroutine;

    private void Start()
    {
        Restart();
    }
    
    public void Stop()
    {
        if (_coroutine != null)
            StopCoroutine(_coroutine);
    }
    
    public void Restart()
    {
        _coroutine = StartCoroutine(SwitchLighting(_delay));
    }

    private IEnumerator SwitchLighting(float delay)
    {
        var wait = new WaitForSeconds(delay);

        while (enabled)
        {
            _light.enabled = !_light.enabled;
            yield return wait;
        }
    }
}
PreviousКорутиныNextYield Instruction

Last updated 1 year ago

Was this helpful?

⌚
🪄