Чё там по доходам с игры? Не залетела, зато столько всего узнал, пока пилил - доволен короче. Да и на 35 рублей вообще-то можно дошик купить (но это не точно). И вообще, может ещё стрельнет или хотя бы взбзднёт чутка 😁
😁3
Заметил такой вариант утечки во время подписок/отписок:
Я при вызове метода Initialize() подписывался на событие, а в OnDestroy отписывался. Всё было норм, пока однажды не словил исключение. Оказывается, что если объект ни разу не был включён, то не сработает ни Awake(), ни, следовательно, OnDestroy(). А раз в инициализаторе подписался, отписка может не пройти (на что я и напоролся). Разобравшись, я пошёл мучать DeepDeek, потому как этот товарищ спорил со мной, зуб давал, мамой клялся, но в итоге я его отправил учить матчасть. Скрины прилагаю. Так вот, это можно обойти, если при инициализации вызвать SetActive(true) и тут же вернуть в SetActive(false). Но лучше не страдать фигнёй и просто подписываться в OnEnable, отписываться в OnDisable. Всем хорошего кода
Я при вызове метода Initialize() подписывался на событие, а в OnDestroy отписывался. Всё было норм, пока однажды не словил исключение. Оказывается, что если объект ни разу не был включён, то не сработает ни Awake(), ни, следовательно, OnDestroy(). А раз в инициализаторе подписался, отписка может не пройти (на что я и напоролся). Разобравшись, я пошёл мучать DeepDeek, потому как этот товарищ спорил со мной, зуб давал, мамой клялся, но в итоге я его отправил учить матчасть. Скрины прилагаю. Так вот, это можно обойти, если при инициализации вызвать SetActive(true) и тут же вернуть в SetActive(false). Но лучше не страдать фигнёй и просто подписываться в OnEnable, отписываться в OnDisable. Всем хорошего кода
🔥1
Сколько заработала игра за первый месяц и рейтинг 😁 Выходит, что если надо 100к в месяц, то мне надо по 1000 таких игрух выпускать, либо повышать качество игр и пилить то, что в трендах
🔥4❤1👍1
Почему мне не зашёл Zenject
Ответ прост: потому что я креветка ) Я использовал композицию, например: Мне нужен спавнер врагов, он внутри себя созавал пул, который внутри себя создавал фабрику, которая должна была принимать какие-то данные о врагах (из конфига или сохранений). И я такой: блин, чтобы всё это биндилось, зависимости раскидались, надо как-то вывернуться непонятно как. Поэтому я ручками прокидывал все данные, которые не нужны ни спавнеру, ни пулу. И вот недавно я начал новый проект на свежую голову, но уже решил пощупать VContainer. Только в этот раз я уже инжектил конфиг в фабрику, фабрику регистрировал и инжектил в пул, а пул регал и инжектил в спавнер. И тогда всё встало на свои места. Короче, DI Container - такая штука, которая вынуждает вас соблюдать SOLID и наоборот, если вы делаете по SOLID, то удобно юзать DI контейнеры.
Раньше я просто не соблюдал "D" (DIP: принцип инверсии зависимостей) из SOLID. Он гласит:
1. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций (интерфейсов, абстрактных классов).
2. Абстракции не должны зависеть от деталей. Детали (конкретные реализации) должны зависеть от абстракций.
Когда начал соблюдать этот принцип, пазл тут же сошёлся.
Всем хорошего кода
Ответ прост: потому что я креветка ) Я использовал композицию, например: Мне нужен спавнер врагов, он внутри себя созавал пул, который внутри себя создавал фабрику, которая должна была принимать какие-то данные о врагах (из конфига или сохранений). И я такой: блин, чтобы всё это биндилось, зависимости раскидались, надо как-то вывернуться непонятно как. Поэтому я ручками прокидывал все данные, которые не нужны ни спавнеру, ни пулу. И вот недавно я начал новый проект на свежую голову, но уже решил пощупать VContainer. Только в этот раз я уже инжектил конфиг в фабрику, фабрику регистрировал и инжектил в пул, а пул регал и инжектил в спавнер. И тогда всё встало на свои места. Короче, DI Container - такая штука, которая вынуждает вас соблюдать SOLID и наоборот, если вы делаете по SOLID, то удобно юзать DI контейнеры.
Раньше я просто не соблюдал "D" (DIP: принцип инверсии зависимостей) из SOLID. Он гласит:
1. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций (интерфейсов, абстрактных классов).
2. Абстракции не должны зависеть от деталей. Детали (конкретные реализации) должны зависеть от абстракций.
Когда начал соблюдать этот принцип, пазл тут же сошёлся.
Всем хорошего кода
🔥5
Второй проект, который командный, уже в процессе разработки!
Уже поймал несколько затыков с фруструмом камеры, созданием elastic эффекта границ, соотношением дельты курсора/пальца с дельтой перемещения в мировых координатах.
Но сейчас всё уже прекрасно. Пока в пути, расписал задачи на ближайжее будущее
Уже поймал несколько затыков с фруструмом камеры, созданием elastic эффекта границ, соотношением дельты курсора/пальца с дельтой перемещения в мировых координатах.
Но сейчас всё уже прекрасно. Пока в пути, расписал задачи на ближайжее будущее
🔥3
Особенности проекта:
Все кнопки, окна и многие сервисы управляются с помощью команд - выключенные монобех классы, забравшие на себя разнородную логику. Минус, что они монобехи. Плюс, что их прям в инспеторе накидываешь стопкой в список на кнопке, а внутри просто по списку пробегаешься и вызываешь Execute(). Поэтому кода сильно меньше, как и дубляжа. Окна открываются с дотвин анимацией и самое прикольное, что окна примают конфиги, поэтому на каждое можно сделать свою анимацию опять же не изменяя код
Все кнопки, окна и многие сервисы управляются с помощью команд - выключенные монобех классы, забравшие на себя разнородную логику. Минус, что они монобехи. Плюс, что их прям в инспеторе накидываешь стопкой в список на кнопке, а внутри просто по списку пробегаешься и вызываешь Execute(). Поэтому кода сильно меньше, как и дубляжа. Окна открываются с дотвин анимацией и самое прикольное, что окна примают конфиги, поэтому на каждое можно сделать свою анимацию опять же не изменяя код
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Как по мне - очень удобная надстройка получилась
🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
За последнюю неделю было не так много времени. Что сделано:
- добавил класс ClickDetector - обрабатывает нажатия, если курсор/тач не над UI из списка исключений. Возвращает коллайдер, если куда-то попал;
- добавил TerritorySelector, который под интерфейсом слушает ClickDetector и, если на коллайдере есть компонент Territory, то кеширует выбор и сообщает об этом всем подписчикам;
- добавил TerritoryElevator - принимает под интерфейсом TerritorySelector, подписывается на изменения. Если выбрана территория, то приподнимает её, если снят выбор, то опускает обратно. Анимация через DOTWeen;
- добавил TerritoryPopUpShower - принимает TerritorySelector, будет принимать TerritoryConfig, чтобы заполнять инфу в окне. Показывает окно над территорией и, если она доступна, кнопку перехода к сцене боя;
- чуть накинул текстур в материалы, чтобы сделать визуал чуть поприятнее;
- масштабный рефакторинг и оптимизации.
Если видео не грузит, можно посмотреть на яндекс диске: https://disk.yandex.ru/i/IDYasUqHFdDqtg
- добавил класс ClickDetector - обрабатывает нажатия, если курсор/тач не над UI из списка исключений. Возвращает коллайдер, если куда-то попал;
- добавил TerritorySelector, который под интерфейсом слушает ClickDetector и, если на коллайдере есть компонент Territory, то кеширует выбор и сообщает об этом всем подписчикам;
- добавил TerritoryElevator - принимает под интерфейсом TerritorySelector, подписывается на изменения. Если выбрана территория, то приподнимает её, если снят выбор, то опускает обратно. Анимация через DOTWeen;
- добавил TerritoryPopUpShower - принимает TerritorySelector, будет принимать TerritoryConfig, чтобы заполнять инфу в окне. Показывает окно над территорией и, если она доступна, кнопку перехода к сцене боя;
- чуть накинул текстур в материалы, чтобы сделать визуал чуть поприятнее;
- масштабный рефакторинг и оптимизации.
Если видео не грузит, можно посмотреть на яндекс диске: https://disk.yandex.ru/i/IDYasUqHFdDqtg
🔥2
Для сцены с картой добавил CameraOrientationAdapter. Получает соотношение сторон, если высота больше ширины, делит высоту на ширину и на полученный коэффициент домножает _minimum и _maximumOrtographicSize. Эти данные через свойства берёт CameraZoom. Таким образом при повороте экрана размер карты остаётся такой же. Так как это отдельный класс с интерфейсом, который можно инжектить через VContainer, можно будет чуть доработать и переиспользовать в сцене уровня.
Вообще я бы не делал логику под поворот экрана, но требования пыточной - поддержка вертикальной и горизонтальной ориентации для мобилок. Поэтому приходится изобретать
Вообще я бы не делал логику под поворот экрана, но требования пыточной - поддержка вертикальной и горизонтальной ориентации для мобилок. Поэтому приходится изобретать
Завтра ориентировочно в 19:00 или 20:00 состоится созвон в дискорд, плюс трансляция на ютуб. Я буду проводить лекцию по VContainer. Я подготовил презентацию и чистый проект. На своём недоджуновском уровне расскажу, как установить, настроить и использовать. Подробности будут в канале
https://t.me/IndieGameMill
Ну и с вас 🔥 если планируете прийти 🙂
https://t.me/IndieGameMill
Ну и с вас 🔥 если планируете прийти 🙂
🔥3