Осваиваем сопрограммы Unity

Осваиваем сопрограммы Unity

22 августа 2023 г.

Корутина — это следующая естественная вещь (после метода Update в MonoBehavior), которую новички изучают, когда начинают работать на своих путешествие по разработке игр в Unity. Они предоставляют нам механизм асинхронного выполнения логики, который не зависит от частоты кадров реальной игры.

Сопрограммы можно использовать для нескольких задач, которые обычно требуются в любой игре —

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

В этом блоге мы подробно узнаем о сопрограммах в Unity с использованием C#.

Что такое сопрограммы?

Сопрограммы — это общая парадигма программирования. Они не относятся к Unity для C#

Слово «сопрограмма» состоит из двух слов: «со» (совместный) и «процедуры» (функции). Сопрограммы — это специальные виды функций, выполнение которых можно приостановить и возобновить в любой момент. Они отличаются от стандартных функций, которые обычно выполняются до завершения перед возвратом.

Сопрограммы можно считать облегченными потоками, которые не блокируют поток при ожидании другой сопрограммы.

Source: https://www.educative.io/answers/what-is-a-coroutine

Сопрограммы в Unity

Рассмотрите задачу изменения состояния игрового объекта каждую минуту. Этот игровой объект может быть часами, состояние которых мы хотим обновлять в зависимости от времени, а не на каждом кадре. У нас не может быть этой логики внутри метода обновления, так как он вызывается каждый кадр.

Здесь на помощь приходит сопрограмма.

IEnumerator tickClock() {
  while(true) {
    yield return new WaitForSeconds(60);
    this.addMinute();
  }
}

Ключевое слово yield используется, чтобы указать, что сопрограмма добровольно возвращает управление вызывающей стороне. Дополнительный объект может быть возвращен вызывающей стороне вместе с выходом. Этот возвращаемый объект точно указывает вызывающей стороне, когда следует снова вызвать сопрограмму.

В нашем сценарии мы сообщаем вызывающей стороне, что эта сопрограмма должна быть вызвана через 60 секунд после того, как мы нажмем оператор yield. Поскольку инструкция yield включена в цикл while, поток кода гарантирует, что эта сопрограмма вызывается каждые 60 секунд.

Запуск сопрограммы

После того как мы написали сопрограмму, мы должны запустить ее. Unity предоставляет метод MonoBehaviour.StartCoroutine для запуска сопрограммы. Таким образом, мы можем просто запустить нашу подпрограмму tickClock из метода Start.

void Start() {
  StartCoroutine(tickClock);
}

Теперь наша сопрограмма запущена и обрабатывается Unity.

Выдача одного кадра

Мы можем использовать объект класса WaitForSeconds, чтобы приостановить выполнение сопрограммы на определенную продолжительность. Мы также можем приостановить сопрограмму на один кадр. Для этого мы просто возвращаем нулевой объект. Вот как это сделать.

IEnumerator tickEveryFrame() {
  while(true) {
    yield return null;
    Debug.Log("Ticking");  
  }
}

Остановка сопрограммы

Как и метод StartCoroutine, у нас есть метод StopCoroutine. Это можно использовать для остановки сопрограммы.

Что следует учитывать при использовании сопрограмм

При работе с сопрограммами следует помнить о некоторых вещах:

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

Использование сопрограмм в Unity открывает новые способы реализации интересных функций в нашей игре. При правильном использовании они могут стать настоящим преимуществом для разработчиков.

Если вам нравится читать такие статьи о программировании и ПО, подписывайтесь на них, чтобы узнать больше.


Оригинал