Loading...
krisitown avatar krisitown 45 Точки

Проблем с 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 пъти на секунда.

Тагове:
1
Unity 3D
HPetrov avatar HPetrov 822 Точки

Варианта на keller първия с Time.deltaTime е най-добрия от всички като искаш просто през определен период да spawn-ваш нови enemy-та. Можеш разбира се да го въртиш по някакъв начин и в coroutine но като можеш да избягваш изобщо да пускаш coroutine няма за какво да го правиш. Обикновено coroutines се ползват за други неща когато например искаш някакъв по-добър контрол върху нещо което правиш. Можеш да пробваш да правиш сметките и в FixedUpdate() като там ще ползваш Time.fixedDeltaTime. Ще се извиква 1 идея по-рядко от Update() но пък е по-точен откъм време.

0
gvanastasov avatar gvanastasov 52 Точки

не съм напълно сългасен - точно ползването на корутина е по-добрия начин тъй като ти дава страшно лесен начин за контрол върху start, stop на някакъв алгоритъм. Да не говорим примерно за ситуацията когато имаш 200 spawn места, вместа да имаш 200 чудесии да въртят в Update, можеш да имаш 1 коротуна (в някой там manager), която да върти и да казва на всички spawn инстанции да спанват (така де пак зависи от ситуацията), но както споменах контрол и оптимизация :)

0
HPetrov avatar HPetrov 822 Точки

О, в Update() можеш да имаш достатъчно добър контрол. Плюс това чисто като перформънс Update() е доста по-лек от цял Coroutine. В повечето ситуации вече ще имаш нещо случващо се в Update() и добавянето му на 1 парче код, което да spawn-ва разни неща на определено период от време не е никаква драма. Coroutine-а наистина дава страшно голяма гъвкавост и контрол над нещата, но да седиш и да циклиш в 1 coroutine не е добра практика, нито добра идея :) Trust me on this ;)

0
gvanastasov avatar gvanastasov 52 Точки

И искаш да кажеш, че 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/

0
25/03/2016 11:04:11
HPetrov avatar HPetrov 822 Точки

Не бих се позовавал на референции от теми отпреди 5-6 години :) Не и когато става дума за game development с game engine. Почти автоматично бих взел този пост и бих го захвърлил в кофата и сам да си пусна тестовете. В крайна сметка ако имаш 1 spawner само надали разликата би била фрапантна, но ако имаш 100 или повече spawner-а вече е друго. 100 Coroutine-а е мъка :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.