Проблем с WaitForSeconds метода
Опитвам се да не викам метода SpawnEnemy() всеки frame. Използвам WaitForSeconds метода за да създам delay. Но поради някаква причина този код не работи, а SpawnEnemy() се вика всеки frame. Ето кода:
void Update () {
SpawnEnemy();
StartCoroutine(WaitTime());
SpawnEnemy();
}
IEnumerator WaitTime(float seconds)
{
yield return new WaitForSeconds(seconds);
}
Просто не искам да spawn-вам 60 пъти в секунда, а 1-2 пъти на секунда.
не съм напълно сългасен - точно ползването на корутина е по-добрия начин тъй като ти дава страшно лесен начин за контрол върху start, stop на някакъв алгоритъм. Да не говорим примерно за ситуацията когато имаш 200 spawn места, вместа да имаш 200 чудесии да въртят в Update, можеш да имаш 1 коротуна (в някой там manager), която да върти и да казва на всички spawn инстанции да спанват (така де пак зависи от ситуацията), но както споменах контрол и оптимизация :)
О, в Update() можеш да имаш достатъчно добър контрол. Плюс това чисто като перформънс Update() е доста по-лек от цял Coroutine. В повечето ситуации вече ще имаш нещо случващо се в Update() и добавянето му на 1 парче код, което да spawn-ва разни неща на определено период от време не е никаква драма. Coroutine-а наистина дава страшно голяма гъвкавост и контрол над нещата, но да седиш и да циклиш в 1 coroutine не е добра практика, нито добра идея :) Trust me on this ;)
И искаш да кажеш, че 60 примерно Update call-a, е по-добре от 1 call със изчакване? Ами в ситуацията, която ти описах?
Нямам време да ги замеря лично аз, за това намерих в нето, и то от всеизвестния Eric5h5 - и той се е прозинесал по темата вярвам му! :D
5000 objects with a simple loop behaviour
InvokeRepeating: That normally takes .03 milliseconds per frame, with spikes of 2.38 ms every second (when all 5000 functions run).
WaitForSeconds: also takes .03 ms per frame, but the spikes are 4.03 ms every second
Update(): 0.93 ms, 100fps -> 93.0ms
Аз поне виждам огромна разлика. Дано не си ме разбрал погрешно. Напълно съм наясно, че контрол имаш и във Update(), но вярвай ми, работил съм по игри за таблети на по 6-7години, и там брояхме всеки един един ред в Update-а ;)
edit: референция към темата - http://forum.unity3d.com/threads/coroutines-vs-update.67856/
Не бих се позовавал на референции от теми отпреди 5-6 години :) Не и когато става дума за game development с game engine. Почти автоматично бих взел този пост и бих го захвърлил в кофата и сам да си пусна тестовете. В крайна сметка ако имаш 1 spawner само надали разликата би била фрапантна, но ако имаш 100 или повече spawner-а вече е друго. 100 Coroutine-а е мъка :)