2075 / Unity / 2D / 3D / 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);
}
}