Как я могу предотвратить вздутие сопрограмм моего класса
Я немного раздражен наличием двух методов каждый раз, когда мне нужно что-то сделать с сопрограммой. Мне нужна сопрограмма и другой метод, чтобы запустить сопрограмму. То есть мне нужно, чтобы какой-то код выполнялся только после завершения предыдущего кода.
Я хотел решить эту проблему, запустив анонимный метод как сопрограмму, но я понял, что он не работает. Есть ли другой совет или хитрость о том, как избежать раздувания вашего класса с помощью дополнительных методов из-за необходимости сопрограммы?
3 ответа
Итак... Если я правильно понимаю, вам нужен код, который выполняет метод, запускающий сопрограмму, но вы не хотите раздувать свой код соотношением 1:1 определенного метода, чтобы запустить каждую конкретную сопрограмму.
И вы не хотите использовать "StartCoroutine" в вашем основном коде? Если вы хотите избежать вздутия кода, вы можете сделать это, что похоже на решение с тремя методами, но использует тот же метод для запуска каждой сопрограммы.
void Start()
{
_(DoThings("Hello"));
_(DoAnotherThing(" world!"));
}
void _(IEnumerator Method)
{
StartCoroutine(Method);
}
IEnumerator DoThings(string value)
{
yield return new WaitForSeconds(1);
Debug.Log(value);
}
IEnumerator DoAnotherThing(string value)
{
yield return new WaitForSeconds(1);
Debug.Log(value);
}
Я бы сделал то, что @Fredrik иллюстрирует в своем ответе (что эквивалентно использованию StartCoroutine
но просто инкапсулирует это другим способом), если вы хотите избежать StartCoroutine
замусорив свой код. Это помогает сохранить обратный отсчет метода, даже если вы делаете это для API, который может быть вызван из класса, который не наследует MonoBehaviour
и не могу позвонить StartCoroutine
,
Что касается
То есть мне нужно, чтобы какой-то код выполнялся только после завершения предыдущего кода.
Я использую метод обратного вызова в сопрограммах, который выглядит следующим образом:
IEnumerator Coroutine1(Action callback) {
// Contents of coroutine
callback();
}
Который используется следующим образом:
StartCoroutine(Coroutine1(() => StartCoroutine(Coroutine2())));
В моем примере method_01 .
public void HandleMethod() {
StartCoroutine (Method_01 ());
}
private IEnumerator Method_01() {
var count = 5;
var wait1Second = new WaitForSeconds (1f); // wait
Debug.Log ("Start method 1");
while (count > 0) {
Debug.Log (count);
yield return wait1Second; // Each second
}
Debug.Log ("End method 1");
yield return null;
Debug.Log ("Start method 2");
yield return wait1Second;
Debug.Log ("End method 2");
}