Страница 1 из 1

Physics2D.CircleCastAll

СообщениеДобавлено: 29 авг 2018, 15:26
hustspbru
Добрый день!
Новичок в программировании.
Есть такая функция
private void GenerateBallAtTime()
{
int posx = Random.Range(60, 1020);
int posy = Random.Range(100, 1680);
int radius = 100;
if (Physics2D.CircleCastAll(new Vector2(posx, posy), radius, Vector2.zero, 0.0f, mask).Length == 0)
{
GameObject tmpball = Instantiate(newball, new Vector3(posx, posy, 10), Quaternion.identity);
}
else
{
GenerateBallAtTime();
}
}
В общем так я пытаюсь найти свободное место на поле для шарика. Берем случайную координату смотрим есть ли в заданном радиусе шары если нет то спавним если есть то повторяем заново. Все работает до тех пор пока на поле есть свободное место. Когда места уже нет то пишет ошибку stackoverflow и приложение виснет =( как можно это побороть ? пытался через try catch ошибка ловится но все равно перед этим подвисает.

Спасибо!

Re: Physics2D.CircleCastAll

СообщениеДобавлено: 29 авг 2018, 15:39
IDoNotExist
Поздравляю, у вас бесконечная рекурсия.

Re: Physics2D.CircleCastAll

СообщениеДобавлено: 29 авг 2018, 16:04
Anonymyx
Stackoverflow exception просто так через try-catch не обрабатывается. При переполнении стэк восстановлению не подлежит.
Все работает до тех пор пока на поле есть свободное место. Когда места уже нет то пишет ошибку stackoverflow и приложение виснет =(

А чего вы ожидали?
Обычно, когда имеют дело с рекурсией, для предотвращения переполнения стэка используют счетчик вызовов. Т.е. если мы, допустим, через 300 вызовов не нашли свободное место, будет считать что его нет.
Лучше переделать под корутинку и там искать свободное место, в цикле.