Дело не в комментариях к коду, а в объяснениях, зачем было выбрано именно такое решение, и почему так. Тогда получился бы туториал с хорошей заявкой на обучение новичков.
Что такое if или foreach знает каждый программист, который учится больше нескольких недель. А вот на этих вопросах можно было бы и остановиться подробнее:
— для чего был создан интерфейс IPoolObject
— почему был выбран стек (псевдостек) для хранения объектов в пуле
— для чего были выбраны именно такие методы в классах (имя метода OnPush в интерфейсе, на мой взгляд, отражает технические особенности пула, а не назначение этого метода)
— как организован доступ к пулу (через статическое поле Instance, такой полу-синглтон. Кстати, зачем дублировать в менеджере все методы самого пула? ведь вместо Instance = this можно было написать Instance = poolManager)
— что такое yield?
— в самом начале вы указали, что ваш пул можно использовать в Photon Server. Другие пулы нельзя в нём использовать? Что вы сделали, чтобы можно было. И вообще — что такое Photon?
Если бы в статье были ответы на эти и подобные вопросы, тогда получился бы отличный туториал, который оценили бы гораздо выше. А сейчас получилась статья в стиле «смотрите как я умею!», на что я и ответил в первом комменте.
Довольно обычная вещь, без изюминки. Таких пулов довольно много. Чем ваш реализация отличается от других пулов? Зачем вы решили делать свой велосипед?
Лично я из бесплатных пользовался двумя — ObjectPool и PoolBoss. Первый попроще, второй понавороченнее. Оба могут работать через методы расширений — вызываются прямо у GameObject или Transform. PoolBoss дополнительно имеет настройки в редакторе — довольно удобно.
Хм… Сейчас зашёл на страницу PoolBoss-а в AssetStore — он теперь не бесплатный… Вышла новая версия, Unity 5.0 ready
У вас кнопка «Назад» вызывает окошко настроек, повторное нажатие «Назад» возвращает в игру. Вот если на окошке настроек добавить кнопку «В меню», добавить само меню (пусть даже с парой пунктов «Играть» и «Об авторе», или «Другие игры»), то в нём кнопка «Назад» сделать как выход из игры.
На самом деле, многие люди ищут привычные способы для выхода — а привычный выход — это кнопка «Назад». А кнопка «Home» вообще выкидывает на рабочий стол, а не к предыдущему открытому окну, что тоже может быть неудобно.
Мне игра понравилась, забавная. Но и правда — не хватает выхода. Другие игры же это обходят — сделайте выход в меню, и оттуда кнопка «Назад» будет выходит из игры.
И второе — ачивки плохо названы — «Level 2» и т.п. Было бы гораздо лучше, если бы они показывали продвижение игрока по «сюжету», например, за прохождение первого уровня давать ачивку «Первый отпор», «Первая кровь» или «Бей краснокровых»!
а почему вы решили, что там был рандом? может, сервер запоминал, какая статуя «выигрышная», и при щелчке смотрел, по ней ли нажали. Хотя, с другой стороны, абсолютно нет никакой разницы, кидать рандом ДО выбора статую или ПОСЛЕ этого — результат абсолютно не изменится.
хмм… я вот подумал. Такой гроссмейстерский бот не будет отличим от игрока, по крайней мере — онлайн. А вот если всех победителей пригласить на офлайн-соревнование, и там они должны будут показать хотя бы наполовину такие же результаты — то они не боты.
>Конечно, непросто будет различить гроссмейстера и бота
Мне кажется, если будет получен бот, который успешно пройдёт все ваши проверки, то это гроссмейстерский бот. Получается, приз получит гроссмейстер — а в какой сфере гроссмейстер (программирование или игры), уже не так важно — награду получит достойный.
Поделитесь опытом, кто как хранит в репозитории большие бинарные ассеты (картинки, текстуры, модели, звуки и музыка).
Какие VCS используете? какой опыт в этом?
>почему игры на 5 игроков продаются в вакууме в два раза лучше, чем игры на четырёх
ммм… Космонавты покупают?.. Играть в вакууме.
Ну вообще-то, их там сейчас до шестерых человек доходит — не подходит вариант…
Во-первых, в родителе класса формы нет контейнера, и его туда в любом случае нужно передавать.
А во-вторых, передавать контейнер в сервис не очень правильно, потому что это идёт вразрез с самой идеей DI-контейнеров — уменьшать связность компонентов, а тут придётся в классе определять, где находятся нужные ему данные.
Поэтому в сервисы нужно уже готовые данные или другие сервисы. А передача через конструктор — это простейший способ передачи зависимости.
1) и 3) Я когда-то сделал этот бандл для себя, и я как-то исторически использую аннотации. Уже потом я решил его использовать для демонстрации в этой статье. Если бы я изначально делал публичный бандл, то я бы, конечно, сделал бы маппинг на yaml.
2) Вся логика вынесена из бандла, в нём вообще нет контроллера, во второй части контроллер перенесён в другой бандл. Поэтому нечего выносить в сервис. В первой части есть контроллер, но он предназначен для того, чтобы просто работало, я не стал сильно заморачиваться о нём, ведь в самом бандле его не будет.
4) согласен.
Основная часть статьи — третья и четвёртая, и частично вторая, а первая — чтобы было о чём говорить в остальной части. Мне бы следовало, наверное, указать, что код контроллера (и шаблоны, что уж там говорить) — не образцы для подражания. Я, например, в контроллерах своих рабочих проектов вообще отказался от ParamConverter и от аннотации Template.
Что такое if или foreach знает каждый программист, который учится больше нескольких недель. А вот на этих вопросах можно было бы и остановиться подробнее:
— для чего был создан интерфейс IPoolObject
— почему был выбран стек (псевдостек) для хранения объектов в пуле
— для чего были выбраны именно такие методы в классах (имя метода OnPush в интерфейсе, на мой взгляд, отражает технические особенности пула, а не назначение этого метода)
— как организован доступ к пулу (через статическое поле Instance, такой полу-синглтон. Кстати, зачем дублировать в менеджере все методы самого пула? ведь вместо Instance = this можно было написать Instance = poolManager)
— что такое yield?
— в самом начале вы указали, что ваш пул можно использовать в Photon Server. Другие пулы нельзя в нём использовать? Что вы сделали, чтобы можно было. И вообще — что такое Photon?
Если бы в статье были ответы на эти и подобные вопросы, тогда получился бы отличный туториал, который оценили бы гораздо выше. А сейчас получилась статья в стиле «смотрите как я умею!», на что я и ответил в первом комменте.
Лично я из бесплатных пользовался двумя — ObjectPool и PoolBoss. Первый попроще, второй понавороченнее. Оба могут работать через методы расширений — вызываются прямо у GameObject или Transform. PoolBoss дополнительно имеет настройки в редакторе — довольно удобно.
Хм… Сейчас зашёл на страницу PoolBoss-а в AssetStore — он теперь не бесплатный… Вышла новая версия, Unity 5.0 ready
… вспомнился Weilard…
На самом деле, многие люди ищут привычные способы для выхода — а привычный выход — это кнопка «Назад». А кнопка «Home» вообще выкидывает на рабочий стол, а не к предыдущему открытому окну, что тоже может быть неудобно.
И второе — ачивки плохо названы — «Level 2» и т.п. Было бы гораздо лучше, если бы они показывали продвижение игрока по «сюжету», например, за прохождение первого уровня давать ачивку «Первый отпор», «Первая кровь» или «Бей краснокровых»!
Представлена экспериментальная реализация JIT для PHP от Zend — Один из главных авторов PHPNG, Дмитрий Стогов, анонсировал реализацию JIT. На некоторых синтетических тестах заметен значительный рост производительности, а для специфичных случаев, например, подсчет множества Мандельброта, показывает 30 кратный рост и опережает реализацию на C.
Мне кажется, если будет получен бот, который успешно пройдёт все ваши проверки, то это гроссмейстерский бот. Получается, приз получит гроссмейстер — а в какой сфере гроссмейстер (программирование или игры), уже не так важно — награду получит достойный.
Какие VCS используете? какой опыт в этом?
ммм… Космонавты покупают?.. Играть в вакууме.
Ну вообще-то, их там сейчас до шестерых человек доходит — не подходит вариант…
А во-вторых, передавать контейнер в сервис не очень правильно, потому что это идёт вразрез с самой идеей DI-контейнеров — уменьшать связность компонентов, а тут придётся в классе определять, где находятся нужные ему данные.
Поэтому в сервисы нужно уже готовые данные или другие сервисы. А передача через конструктор — это простейший способ передачи зависимости.
2) Вся логика вынесена из бандла, в нём вообще нет контроллера, во второй части контроллер перенесён в другой бандл. Поэтому нечего выносить в сервис. В первой части есть контроллер, но он предназначен для того, чтобы просто работало, я не стал сильно заморачиваться о нём, ведь в самом бандле его не будет.
4) согласен.
Основная часть статьи — третья и четвёртая, и частично вторая, а первая — чтобы было о чём говорить в остальной части. Мне бы следовало, наверное, указать, что код контроллера (и шаблоны, что уж там говорить) — не образцы для подражания. Я, например, в контроллерах своих рабочих проектов вообще отказался от ParamConverter и от аннотации Template.