Tap to unmute

Универсальный пул объектов. Unity

  Рет қаралды 15,748

Leksay's Development

Leksay's Development

Күн бұрын

Пікірлер: 43
@prosource7067
@prosource7067 Жыл бұрын
Красавчик, хорошее объяснение, понятно и не затянуто)) не забрасывай, ждем новых видосиков)
@mindego1979
@mindego1979 Жыл бұрын
Возможно это банальщина, но можно в конструктопе пула создавать пустой gameobject, который будет родительским для остальных создаваемых. Не то чтобы это критично, но позволяет "свернуть" здоровенный список объектов или хотя бы разбивать по группам
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
Все верно )
@timtim4502
@timtim4502 9 ай бұрын
Замечания по ReturnAll() public void ReturnAll() { while (_activeObjects.Count>0) { Return(_activeObjects[0]); } } Так не требуется создание массива. Если будут сущности использующие объекты из пула, но не знающие что был вызван ReturnAll(), то возможно что-то пойдёт не так. Например две разные сущности могут одновременно управлять одним и тем же инстансом это надо учитывать.
@timtim4502
@timtim4502 9 ай бұрын
@@mountainjem Что именно?
@timtim4502
@timtim4502 9 ай бұрын
​@@mountainjem Например, вы будете анимировать объект из пула в корутине или другие сущности вашей игры для каких-либо целей будут кешировать ссылку на объект из пула, то в случае возврата объекта в пул ссылка на объект останется, если не будет очищена или корутина продолжит выполнять анимацию объекта, пока не будет остановлена. Мой вариант не решает эту проблему, это просто надо учитывать - очищать все ссылки на объект при возвращении в пул. Мой вариант просто менее ресурсозатратный, т.к. нет кастинга из списка в массив.
@mountainjem
@mountainjem 9 ай бұрын
@@timtim4502 Спасибо
@ieGameDev
@ieGameDev 5 ай бұрын
Реализация топ, видео очень помогло, спасибо)
@chebucreker
@chebucreker Жыл бұрын
Доступно и информативно, спасибо)
@nickicool
@nickicool Жыл бұрын
Супер реализация!
@michaelfinne617
@michaelfinne617 11 ай бұрын
Довольно программистский подход к реализации пула. Ещё и зачем-то произошло изобретение велосипеда, вместо использования готовых пулов. Но в целом нормально, это всё-равно вполне здоровая реализация.
@leksaysdevelopment7423
@leksaysdevelopment7423 11 ай бұрын
Мне кажется, что практически каждый программист время от времени велосепидирует. Особенно если хочет разобраться в том, из чего состоит велосипед и как его чинить в случае чего. А так спасибо )
@michaelfinne617
@michaelfinne617 10 ай бұрын
@@leksaysdevelopment7423 Есть такое. Однако можно было бы и упомянуть что это учебная реализация для понимания внутренностей.
@Red-Cat-Fat
@Red-Cat-Fat Жыл бұрын
Во, вот это уже норм тема. Красавчик
@pulsar1934
@pulsar1934 Жыл бұрын
Спасибо за такой крутой пример пула! Один только вопрос почему используется проверка количества в пуле через свойство Count почему не Any() ? К слову, в своей книге рихтер призывал к Any()
@zubarevvideo
@zubarevvideo 10 ай бұрын
Можете ли вы предоставить полный код, я новичок и не очень хорошо понимаю некоторые части, заранее спасибо.
@kusetzo
@kusetzo 7 ай бұрын
как работает функция OnReachTarget?
@jzalive7779
@jzalive7779 4 ай бұрын
Благодарю за подробный гайд, но возникла ошибка: в строке спавнера при прикручивании метода preload юнити выдает ошибку "не удается неявно преобразовать gameobject в класс. 3:00
@jzalive7779
@jzalive7779 4 ай бұрын
При смене возвращаемого типа другая ошибка - "имеет неправильный возвращаемый тип"
@jzalive7779
@jzalive7779 4 ай бұрын
Пришел к тому, что проблема в префабе создаваемого объекта. Можно увижеть строки класса Missle и его переменные?
@jzalive7779
@jzalive7779 4 ай бұрын
У вас 2 графы prefab: в одной находится GameObject. А какой тип находится во второй графе? Скрипт не лезет, а больше у меня нет идей
@ЧернійГліб
@ЧернійГліб Жыл бұрын
Объясни плиз зачем было делать GameObjectPool, чем PoolBase не хватает? И почему ты написал в аргументах функции @object, что это значит
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
GameObjectPool просто удобнее, чтобы не писать одни и те же функции для включения/выключения GameObject'ов каждый раз. Символ '@' позволяет использовать зарезервированные слова. Если нужно для имени переменной использовать какое-то занятое слово, например event, то можно писать @event и это будет работать.
@sanded9321
@sanded9321 Жыл бұрын
Почему не пользовать встроенный Unity пул?
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
Можно и его использовать, никто не запрещает. Свой просто легче контролировать и расширять
@mikel8205
@mikel8205 Жыл бұрын
А на сколько сильно страдает производительность без использования пула? Проводил тесты, замерял тайминги? Если да, то поделись пожалуйста. Интересно, при каком количестве объектов целесообразно делать пул.
@НикитаТренихин-ч9й
@НикитаТренихин-ч9й Жыл бұрын
На производительность это конечно влияет (зависит от того, что висит в [SerializeField] полях), но самое главное в пуле, это правильная работа с памятью. Дело в том, что в юнити сборщик мусора работает не так как в c#. Если очень грубо, то в unity не происходит нормального распределения объектов по куче после работы сборщика (дефрагментация кажется это называется). Так что лучше стараться избегать постоянного создания и удаления объектов. Сам еще только разбираюсь в unity, так что, если кто-то меня поправит, буду только рад)
@Xummuk97-n1t
@Xummuk97-n1t Жыл бұрын
На самом деле ты можешь в интернете эти сравнения посмотреть, но если кратко, Instantiate под капотом используя сериализацию создаёт объект на основе префаба. Если вы например посмотрите файлы префабов, то там может быть не 1 и не 2 тысячи строчек, а работа с файловой системой в runtime это крайне не выгодная операция (Зачастую такие операции делают при загрузке уровня в специальном экране). Destroy также очищает весь объект, но ему нужно пройтись по всей иерархии объекта, не говоря о том, что все сущности объекта в куче. И тут сами подумайте насколько пул объектов выигрывает)
@francyi-d
@francyi-d 10 ай бұрын
Дополню только то, что работы с файловой системой прямо в самый рантайм, когда Instantiate работает не выполняется. Юнити по дефолту при загрузке сцены загружает сразу всё, стоит просто ассетам быть зареференсеными в сцене. Включая префабы. Так что Instantiate по сути только дублирует референсный объект, очень вероятно что через рефлексию, но возможно в апи Mono есть более быстрые аналоги для этого.
@kriegsmarine6935
@kriegsmarine6935 Жыл бұрын
Все еще не понимаю откуда пошла мода делать в пуле отдельно лист активных айтемов. Можно же буквально к нужному классу прикрутить переменную isActive и в цикле смотреть, есть ли какие-то неактивные предметы в основном списке. Опять же - зачем изначально создавать много неиспользуемых объектов? Просто в чем смысл, если пул их все равно может создавать автоматически. Ну и да - чисто ради приличия на словах "это очень сильно оптимизирует игру" можно было бы прикрутить счетчик фпс для обеих случаев.
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
По первому пункту. Можно воспользоваться и вашей реализацией. Мне кажется удобно иметь возможность в один вызов выключить все активные объекты. Можно этого и не делать, это не обязательный функционал. По второму пункту. Создание игровых объектов при помощи операции Instantiate, как уже говорилось, довольно затратная операция. И заранее созданные объекты позволяют избежать провисания фпс в процессе игры. А ответственность за количество созданных объектов висит на плечах разработчика. Так что если количество предзагружаемых объектов больше, чем в среднем используется, то уменьшить число не составляет большого труда. Если пул шарится между несколькими объектами, то имеет смысл создавать N * Avarage объектов заранее. По третьему пунку. Имеет смысл, в будущем постараюсь так делать Спасибо за фидбек
@yummybunny7351
@yummybunny7351 Жыл бұрын
0:45 что это за программа?
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
Figma )
@DenisB-d5f
@DenisB-d5f Жыл бұрын
Что у тебя за железо? Шустро работает райдер
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
Буквально месяц назад обновился: i9 - 10900, 32Gb dd4. До этого был ryzen5 3600X, райдер почти так же работал
@CeoOmg
@CeoOmg Жыл бұрын
var религия не позволяет юзать? )
@имяможноменять
@имяможноменять Жыл бұрын
var используют только если тип явно указывается в правой части выражения, например: var node = new Node();, в форычах и ещё паре случаях. А теперь, когда уже есть синтаксис Node node = new();, использование var окончательно становится просто вкусовщиной.
@CeoOmg
@CeoOmg Жыл бұрын
​@@имяможноменять var используется, чтобы типы не писать и уменьшить кол-во символов в коде, это помимо того, что и вы написали. Вы ролик то смотрели, там сплошь и рядом типы известны. Node node = new(); ни разу не проще или читаемее, чем var node = new Node(). И разница в том, что второе вы не можете юзать в объявлении класса/структуры. Собственно для того = new() и ввели, чтобы огромные женерики с кортежами не прописывать дважды, если вы их там инициализируется через new. На собеседованиях и в резюме, так вот и отличаю джуна от сеньера, первые var не юзают ))))), а вторые, только его и юзают)))
@имяможноменять
@имяможноменять Жыл бұрын
@@CeoOmg Как именно вы используете var в объявлении класса? Все аргументы до и после этого утверждения можно точно так же применить к записи вида Class class = new();. Все то же самое с кортежами, ValueType и т.д. - читаемость лучше. Кроме того, намного лучше читается код, в котором тип пишется всегда в левой части, а не когда как.
@CeoOmg
@CeoOmg Жыл бұрын
@@имяможноменятьчитать для начала научитесь, что вам пишут, а не видеть, то что вам выгодно. Диалог на этом закончен
@leksaysdevelopment7423
@leksaysdevelopment7423 Жыл бұрын
Нет, я не против var'ов. Просто на текущем месте работы у нас принято явно определять все типы. Поэтому это просто привычка
To Brawl AND BEYOND!
00:51
Brawl Stars
Рет қаралды 17 МЛН
UFC 310 : Рахмонов VS Мачадо Гэрри
05:00
Setanta Sports UFC
Рет қаралды 1,2 МЛН
Don’t Choose The Wrong Box 😱
00:41
Topper Guild
Рет қаралды 62 МЛН
Вращение, углы Эйлера, Кватернионы в Unity
9:26
Leksay's Development
Рет қаралды 10 М.
Подробный урок по Entity Component System в Unity
15:27
Insane One - Разработка игр
Рет қаралды 45 М.
MonoBehaviour и ScriptableObject. Для чего нужны и как использовать?
19:38
Руслан Смирнов • Game Development
Рет қаралды 9 М.
Как стать ДЕЙСТВИТЕЛЬНО хорошим программистом
7:35
Бинарный происк
Рет қаралды 155 М.
⚡ Всё про события в Unity 3D
21:38
Emerald Powder
Рет қаралды 110 М.
To Brawl AND BEYOND!
00:51
Brawl Stars
Рет қаралды 17 МЛН