Красавчик, хорошее объяснение, понятно и не затянуто)) не забрасывай, ждем новых видосиков)
@mindego1979 Жыл бұрын
Возможно это банальщина, но можно в конструктопе пула создавать пустой gameobject, который будет родительским для остальных создаваемых. Не то чтобы это критично, но позволяет "свернуть" здоровенный список объектов или хотя бы разбивать по группам
@leksaysdevelopment7423 Жыл бұрын
Все верно )
@timtim45029 ай бұрын
Замечания по ReturnAll() public void ReturnAll() { while (_activeObjects.Count>0) { Return(_activeObjects[0]); } } Так не требуется создание массива. Если будут сущности использующие объекты из пула, но не знающие что был вызван ReturnAll(), то возможно что-то пойдёт не так. Например две разные сущности могут одновременно управлять одним и тем же инстансом это надо учитывать.
@timtim45029 ай бұрын
@@mountainjem Что именно?
@timtim45029 ай бұрын
@@mountainjem Например, вы будете анимировать объект из пула в корутине или другие сущности вашей игры для каких-либо целей будут кешировать ссылку на объект из пула, то в случае возврата объекта в пул ссылка на объект останется, если не будет очищена или корутина продолжит выполнять анимацию объекта, пока не будет остановлена. Мой вариант не решает эту проблему, это просто надо учитывать - очищать все ссылки на объект при возвращении в пул. Мой вариант просто менее ресурсозатратный, т.к. нет кастинга из списка в массив.
@mountainjem9 ай бұрын
@@timtim4502 Спасибо
@ieGameDev5 ай бұрын
Реализация топ, видео очень помогло, спасибо)
@chebucreker Жыл бұрын
Доступно и информативно, спасибо)
@nickicool Жыл бұрын
Супер реализация!
@michaelfinne61711 ай бұрын
Довольно программистский подход к реализации пула. Ещё и зачем-то произошло изобретение велосипеда, вместо использования готовых пулов. Но в целом нормально, это всё-равно вполне здоровая реализация.
@leksaysdevelopment742311 ай бұрын
Мне кажется, что практически каждый программист время от времени велосепидирует. Особенно если хочет разобраться в том, из чего состоит велосипед и как его чинить в случае чего. А так спасибо )
@michaelfinne61710 ай бұрын
@@leksaysdevelopment7423 Есть такое. Однако можно было бы и упомянуть что это учебная реализация для понимания внутренностей.
@Red-Cat-Fat Жыл бұрын
Во, вот это уже норм тема. Красавчик
@pulsar1934 Жыл бұрын
Спасибо за такой крутой пример пула! Один только вопрос почему используется проверка количества в пуле через свойство Count почему не Any() ? К слову, в своей книге рихтер призывал к Any()
@zubarevvideo10 ай бұрын
Можете ли вы предоставить полный код, я новичок и не очень хорошо понимаю некоторые части, заранее спасибо.
@kusetzo7 ай бұрын
как работает функция OnReachTarget?
@jzalive77794 ай бұрын
Благодарю за подробный гайд, но возникла ошибка: в строке спавнера при прикручивании метода preload юнити выдает ошибку "не удается неявно преобразовать gameobject в класс. 3:00
@jzalive77794 ай бұрын
При смене возвращаемого типа другая ошибка - "имеет неправильный возвращаемый тип"
@jzalive77794 ай бұрын
Пришел к тому, что проблема в префабе создаваемого объекта. Можно увижеть строки класса Missle и его переменные?
@jzalive77794 ай бұрын
У вас 2 графы prefab: в одной находится GameObject. А какой тип находится во второй графе? Скрипт не лезет, а больше у меня нет идей
@ЧернійГліб Жыл бұрын
Объясни плиз зачем было делать GameObjectPool, чем PoolBase не хватает? И почему ты написал в аргументах функции @object, что это значит
@leksaysdevelopment7423 Жыл бұрын
GameObjectPool просто удобнее, чтобы не писать одни и те же функции для включения/выключения GameObject'ов каждый раз. Символ '@' позволяет использовать зарезервированные слова. Если нужно для имени переменной использовать какое-то занятое слово, например event, то можно писать @event и это будет работать.
@sanded9321 Жыл бұрын
Почему не пользовать встроенный Unity пул?
@leksaysdevelopment7423 Жыл бұрын
Можно и его использовать, никто не запрещает. Свой просто легче контролировать и расширять
@mikel8205 Жыл бұрын
А на сколько сильно страдает производительность без использования пула? Проводил тесты, замерял тайминги? Если да, то поделись пожалуйста. Интересно, при каком количестве объектов целесообразно делать пул.
@НикитаТренихин-ч9й Жыл бұрын
На производительность это конечно влияет (зависит от того, что висит в [SerializeField] полях), но самое главное в пуле, это правильная работа с памятью. Дело в том, что в юнити сборщик мусора работает не так как в c#. Если очень грубо, то в unity не происходит нормального распределения объектов по куче после работы сборщика (дефрагментация кажется это называется). Так что лучше стараться избегать постоянного создания и удаления объектов. Сам еще только разбираюсь в unity, так что, если кто-то меня поправит, буду только рад)
@Xummuk97-n1t Жыл бұрын
На самом деле ты можешь в интернете эти сравнения посмотреть, но если кратко, Instantiate под капотом используя сериализацию создаёт объект на основе префаба. Если вы например посмотрите файлы префабов, то там может быть не 1 и не 2 тысячи строчек, а работа с файловой системой в runtime это крайне не выгодная операция (Зачастую такие операции делают при загрузке уровня в специальном экране). Destroy также очищает весь объект, но ему нужно пройтись по всей иерархии объекта, не говоря о том, что все сущности объекта в куче. И тут сами подумайте насколько пул объектов выигрывает)
@francyi-d10 ай бұрын
Дополню только то, что работы с файловой системой прямо в самый рантайм, когда Instantiate работает не выполняется. Юнити по дефолту при загрузке сцены загружает сразу всё, стоит просто ассетам быть зареференсеными в сцене. Включая префабы. Так что Instantiate по сути только дублирует референсный объект, очень вероятно что через рефлексию, но возможно в апи Mono есть более быстрые аналоги для этого.
@kriegsmarine6935 Жыл бұрын
Все еще не понимаю откуда пошла мода делать в пуле отдельно лист активных айтемов. Можно же буквально к нужному классу прикрутить переменную isActive и в цикле смотреть, есть ли какие-то неактивные предметы в основном списке. Опять же - зачем изначально создавать много неиспользуемых объектов? Просто в чем смысл, если пул их все равно может создавать автоматически. Ну и да - чисто ради приличия на словах "это очень сильно оптимизирует игру" можно было бы прикрутить счетчик фпс для обеих случаев.
@leksaysdevelopment7423 Жыл бұрын
По первому пункту. Можно воспользоваться и вашей реализацией. Мне кажется удобно иметь возможность в один вызов выключить все активные объекты. Можно этого и не делать, это не обязательный функционал. По второму пункту. Создание игровых объектов при помощи операции Instantiate, как уже говорилось, довольно затратная операция. И заранее созданные объекты позволяют избежать провисания фпс в процессе игры. А ответственность за количество созданных объектов висит на плечах разработчика. Так что если количество предзагружаемых объектов больше, чем в среднем используется, то уменьшить число не составляет большого труда. Если пул шарится между несколькими объектами, то имеет смысл создавать N * Avarage объектов заранее. По третьему пунку. Имеет смысл, в будущем постараюсь так делать Спасибо за фидбек
@yummybunny7351 Жыл бұрын
0:45 что это за программа?
@leksaysdevelopment7423 Жыл бұрын
Figma )
@DenisB-d5f Жыл бұрын
Что у тебя за железо? Шустро работает райдер
@leksaysdevelopment7423 Жыл бұрын
Буквально месяц назад обновился: i9 - 10900, 32Gb dd4. До этого был ryzen5 3600X, райдер почти так же работал
@CeoOmg Жыл бұрын
var религия не позволяет юзать? )
@имяможноменять Жыл бұрын
var используют только если тип явно указывается в правой части выражения, например: var node = new Node();, в форычах и ещё паре случаях. А теперь, когда уже есть синтаксис Node node = new();, использование var окончательно становится просто вкусовщиной.
@CeoOmg Жыл бұрын
@@имяможноменять var используется, чтобы типы не писать и уменьшить кол-во символов в коде, это помимо того, что и вы написали. Вы ролик то смотрели, там сплошь и рядом типы известны. Node node = new(); ни разу не проще или читаемее, чем var node = new Node(). И разница в том, что второе вы не можете юзать в объявлении класса/структуры. Собственно для того = new() и ввели, чтобы огромные женерики с кортежами не прописывать дважды, если вы их там инициализируется через new. На собеседованиях и в резюме, так вот и отличаю джуна от сеньера, первые var не юзают ))))), а вторые, только его и юзают)))
@имяможноменять Жыл бұрын
@@CeoOmg Как именно вы используете var в объявлении класса? Все аргументы до и после этого утверждения можно точно так же применить к записи вида Class class = new();. Все то же самое с кортежами, ValueType и т.д. - читаемость лучше. Кроме того, намного лучше читается код, в котором тип пишется всегда в левой части, а не когда как.
@CeoOmg Жыл бұрын
@@имяможноменятьчитать для начала научитесь, что вам пишут, а не видеть, то что вам выгодно. Диалог на этом закончен
@leksaysdevelopment7423 Жыл бұрын
Нет, я не против var'ов. Просто на текущем месте работы у нас принято явно определять все типы. Поэтому это просто привычка