void Start()
{
StartCoroutine(Message(i));
StartCoroutine(Message(i));
StartCoroutine(Message(i));
StartCoroutine(Message(i));
}
Я не думаю, что это делает то, что вы считаете нужным. Это не будет ждать завершения каждого StartCoroutine
и вызовет следующий StartCoroutine
.
Это то, что происходит:
Первый StartCoroutine(Message(i));
вызов будет запустить функцию Message
. После того, как он встретит строку кода yield return new WaitForSeconds(waitTime = 2f);
, он затем перепрыгнет обратно в функцию Start()
.
Следующий StartCoroutine(Message(i));
будет называться тогда, то же самое произойдет снова.
При вызове сопрограммы функции из не функций сопрограммных, до тех пор, пока у вас есть yield return new WaitForSeconds
, yield return null;
или yield return
каких-либо YieldInstruction
реализован, исполнение возвращается к ней, не функциям сопрограммных в-котором функция StartCoroutine
была вызвана от и продолжать выполнять другой код.
Чтобы заставить coroutine подождать, пока другой закончит, сделайте вызов функции StartCoroutine(Message(i));
другой функцией сопрограмм. Это позволит вам вызывать yield
каждый вызов функции coroutine. Это называется цепочкой coroutine.
Для цепи или yield
вызов функции сопрограммы, просто введите yield return
перед функцией StartCoroutine
. yield return StartCoroutine(Message(i));
public class Wait : MonoBehaviour {
private int i = 0;
public string[] message;
[SerializeField]
private Text toText;
public IEnumerator Message(float waitTime)
{
// toText.text = message[i];
i++;
yield return new WaitForSeconds(waitTime = 2f);
}
void Start()
{
StartCoroutine(startMessage());
}
IEnumerator startMessage()
{
yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns
yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns
yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns
yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns
}
}
Теперь каждый StartCoroutine(Message(i));
вызов будет ждать, пока первый не закончит. Вы можете всегда использовать переменную boolean
, чтобы сделать это, но гораздо лучше, чтобы yield
вызов StartCoroutine
.
Ключевое слово делает ваш метод отложенным. Таким образом, он выполняется только при вызове 'Enumerator.MoveNext()', который вы никогда не вызываете (для этого используйте, например, 'for'-loop). – HimBromBeere
@HimBromBeere не то, что работа 'StartCoroutine'? –