Unity Coroutine

2075 / Unity2D3D / Coroutine

 

Корутін — спеціальна функція, яка дозволяє робити паузи всередині коду

 

void Start()
{
        StartCoroutine(F1());
}

IEnumerator F1()
{
     print("Start сoroutine");

     yield return new WaitForSeconds(2);

     print("2 s");

     yield return new WaitForSeconds(3);

     print("5 s");

     yield return new WaitForSeconds(4);

     print("9 s");
}

 

StartCoroutine() — функція, що запускає корутін
IEnumerator — будь-який об'єкт, що підтримує цей інтерфейс
new WaitForSeconds(2) — об'єкт що робить паузу на 2 с
yield return — тимчасова зупинка

 

Згенерувати і вбити ворога, коли він впаде нижче 0

 

public GameObject enemyPref;

void Start()
{
     StartCoroutine(F1());
}

IEnumerator F1()
{
     GameObject enemy = Instantiate(enemyPref, transform.position, Quaternion.identity);

     while (enemy.transform.position.y > 0)
     {
          yield return null;
     }

     Destroy(enemy);
}

 

yield return null — затримка на один кадр

 

Те саме, але без циклу
yield return new WaitUntil(() => enemy.transform.position.y < 0);

 


 

Після запуску п'ять разів рухати об'єкт все швидше

void Update () {
  if (Input.GetKeyDown(KeyCode.F)) StartCoroutine(K1());
}

IEnumerator K1() { // реалізація інтерфейсу IEnumerator
  while (true)
  {
    for (int i = 0; i < 5; i++)
    {
      transform.Translate(Vector3.right * i);
      yield return new WaitForSeconds(1f);
    }
  }
}

 

Зупинити корутін

private IEnumerator coroutine;

void Start()
{
  coroutine = P1(5f);
  StartCoroutine(coroutine);
}

IEnumerator P1(float t)
{
  while (true)
  {
    Debug.Log("1");
    yield return new WaitForSecondsRealtime(t);
    Debug.Log("2");
  }
}

void Update()
{
  if (Input.GetKeyDown("space"))
  {
    StopCoroutine(coroutine);
  }
}