Coroutine dalam seri


9

Bagaimana cara saya menumpuk serangkaian panggilan Coroutine yang harus dieksekusi satu demi satu?

Saya telah mencoba mendapatkan efek warna berkedip-kedip serangkaian rangkaian lerps warna dalam coroutine tetapi tidak berfungsi.

Jawaban:


7
public static IEnumerator Sequence(params IEnumerator[] sequence)
{
  for(int i = 0 ; i < sequence.Length; ++i)
  {
    while(sequence[i].MoveNext())
      yield return sequence[i].Current;
  }
}

contoh penggunaan:

IEnumerator PrintCoroutine(string arg)
{
  yield return new WaitForSeconds(0.3f);
}

StartCoroutine(Sequence(PrintCoroutine("foo"), PrintCoroutine("bar")));

Solusi tujuan umum yang bagus.
landak gila

7

Selain apa yang dijelaskan Heisenbug, sesuatu yang manual Unity tidak membuat jelas adalah bahwa Anda dapat yield returnsuatu Coroutineobjek, yang Anda terima dari sebuah StartCoroutinepanggilan.

public IEnumerator RunColorCoroutineLoop()
{
    while (true) {
        yield return StartCoroutine(FirstColorCoroutine());
        yield return StartCoroutine(SecondColorCoroutine());
        yield return StartCoroutine(ThirdColorCoroutine());
        yield return StartCoroutine(FourthColorCoroutine());
    }
}

public IEnumerator FirstColorCoroutine()
{
    SetColor("color1");
    yield return new WaitForSeconds(1f);
}

public IEnumerator SecondColorCoroutine()
{
    SetColor("color2");
    yield return new WaitForSeconds(1f);
}

public IEnumerator ThirdColorCoroutine()
{
    SetColor("color3");
    yield return new WaitForSeconds(1f);
}

public IEnumerator FourthColorCoroutine()
{
    SetColor("color4");
    yield return new WaitForSeconds(1f);
}

Ini kadang-kadang membuat pembacaan yang lebih baik daripada loop MoveNext, tetapi memiliki kelemahan bahwa Anda tidak dapat mencegah coroutine anak berjalan melalui logika dalam loop coroutine teratas, yang dapat berguna untuk membangun teknik kontrol aliran yang lebih canggih di atas IEnumerator.

Untuk lebih lanjut tentang ini, Anda harus melihat video Unite ini yang mencakup mendapatkan lebih banyak dari coroutine Anda tanpa membangun penjadwal coroutine Anda sendiri.


Kedua (ini dan di bawah) asnwers bagus. Saya akan pergi dengan pendekatan ini jika Anda lebih peduli tentang transparansi kode dalam OOP tradisional. Namun jika Anda melakukan pengembangan data-solusi @ Heisenbug akan melayani Anda lebih baik.
IndieForger
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.