Добрый день, начал изучать Unity, в качестве обучения и прототипирования использую ассеты "Vampire survivors", потом хотел бы сделать схожую игру.
Накодил смотря на разные туториалы управление, врагов, и одну способность для героя. Более менее все работает, просадок нет, но если враги кучкуются и превращаются в что-то схожее со слизью gish, то начинается просадка, а если проникнуть туда внутрь героем, fps падает до 3-4. Тут врагов 700.
Кому не сложно посмотрите, это у всех так? Или у меня железо не тянет, "Vampire survivors" тоже лагает, но не так сильно и только под конец в полном фарше врагов и прокачанных способностей.
https://drive.google.com/drive/folders/1sieV-U64Elen-qNh63awLvp5EGLrvPr-
Открывай профайлер и смотри что грузит.
С 99% вероятностью код говнище, с типичными туториалами "используйте Gameobject.Find 700 раз"
Ну код говнище это да, но просадка не в коде если посмотреть профайлер. Там Physics2d.Simulate -> Physics2d.Step это то, что сажает FPS больше всего, внутри него кажется методы связанные с коллизиями. Как я понял, когда вражины кучкуются, то плодят кучу коллизий между собой, толкаются и наглухо просаживают игру, просто кучка 2d спрайтов с rigidbody и collider движутся к своей цели и все, печально.
Rigidbody на каждом ненужен, коллидер с is trigger нужен и raycast, и настроеная матрица коллизий в настройках
sinoby
> Rigidbody на каждом ненужен
А полу провалы в другие коллайдеры и проскоки между плотно стоящими объектами без ригибади не будут?
Без ригидбоди и стандартного коллайдера? Как рейкаст тут помогает? Тогда же все в один квадрат в друг друга провалятся.
Ах я думал тебе ригидбоди нужен только для определение попадания в тело врага, потому как упомянул Vampire survivors где враги слипались в кучу.
В любом случае для "не слипания" врагов в кучу ригид не лучшая идея когда их сотни, сделай сетку под ними в клеточку и пусть каждый занимает только свободную, но тут уже надо покодить нежели просто двигать врагов к игроку
если всеже ригид хочется то как вариант настроить физику в юнити на самую неточную и производительную
Да, вот что-то наподобие занимаемых клеток неплохой но трудноватый вариант, походу придется как-то так делать, а то настройки физики никого положительного эффекта не возымели.
Guest_John
Такая проблема явно не в самой физике, а в реализации.
Нужно смотреть физическое ли у тебя движение, и что в OnCollisionEnter/Exit?
Тут 2000 противников:
Samaritan
Хорошая наводка, у меня враги двигались через transform.position = Vector2.MoveTowards
Сейчас передвижение изменил rigidbody.MovePosition, и на 700 врагов стал легко справляться без просадок, не знал что такая разница в производительности между ними.
Но начиная с 1600 врагов в скоплении начинает сильно просаживаться.
OnCollisionEnter/Exit только у игрока для фиксации урона по себе
Guest_John
> не знал что такая разница в производительности между ними
Разница производительности не в самом движении, а в том что в результате происходит. Не физическое движение - это принудительная телепортация. Если при физическом движении движок понимает, что будет столкновение, то ограничивает перемещение объекта, а не физическое насильно запихивает один объект в другой, после чего физический движок начинает думать, как это исправить.
Твоя ситуация осложнялась тем, что у тебя происходила телепортация очень большого числа объектов в одну точку, т.е. единовременный конфликт всех со всеми.
> Но начиная с 1600 врагов в скоплении начинает сильно просаживаться.
Больше чем в два раза подняли лимит - круто же! Или аппетиты растут? =)
Samaritan
> не физическое насильно запихивает один объект в другой
Логично, можно было додуматься, но в начале посмотрев в каком то туториале про MoveTowards принял за самое правильное решение, поэтому даже не задумывался об этом.
Но пока думал над другими вариантами, пришел к совершенно другому решению
> Больше чем в два раза подняли лимит - круто же! Или аппетиты растут?
1600 врагов круто, и наверно более чем достаточно, но когда во все стороны будут летать 6 разных способностей, как в "Vampire survivors", они тоже сожрут много производительности, а меньше 1000 врагов это уже не так круто.
Пока искал про производительность в unity наткнулся на ECS архитектуру. Сейчас пытаюсь перенести на это, как я рассчитываю сам факт перевода на ECS уже увеличит производительность в 2 раза, еще там вроде довольно легко реализовать многопоточность, что еще в несколько раз увеличит производительность.
Guest_John
Да, как раз хотел посоветовать присмотреться к DOTS.