fa
Feedback
Джун Джуно к вашим услугам! Путь в разработку игр | Движуха Сакутина

Джун Джуно к вашим услугам! Путь в разработку игр | Движуха Сакутина

رفتن به کانال در Telegram

Для связи: @junoscode

نمایش بیشتر
354
مشترکین
-124 ساعت
-17 روز
-530 روز
آرشیو پست ها
🔥 СОЗДАТЕЛЬ ОБЪЕКТОВ 🔥 ❓ Бывало ли у вас такое, что вам нужно создавать очень много объектов на сцене на основе префаба? 🙂
+2
🔥 СОЗДАТЕЛЬ ОБЪЕКТОВ 🔥 ❓ Бывало ли у вас такое, что вам нужно создавать очень много объектов на сцене на основе префаба? 🙂 Скорее всего да 👀 Очень часто эту логику вращивают в класс, который занимается совершенно другим. И поэтому мы сегодня рассмотрим паттерн - ФАБРИКА 📌 Представим, у нас есть класс Gun. Он стреляет путем передачи ускорения физической пули в виде сферы 📌 Bullet является префабом. Соответственно нам приходится хранить в полях оружия ссылку на префаб 📌 Если пулю нужно конструировать, в полях придется хранить данные и для этого 📌 Также логика создания пули может понадобится и другому классу оружия ❗️ Мы приходим к вывод, что стоит вынести логику создания в отдельный класс. Соответственно, мы решаем сразу несколько проблем: ✔️ Во-первых, мы разгружаем класс Gun от лишней логики ✔️ Во-вторых, мы не повредим логику создания и конструирования при модификации оружия ✔️ В-третьих, мы избавляемся от дубляжа кода - кто угодно может создать пулю, просто обратившись к методу 📈Итого, мы пришли к очень полезному паттерну, помогающему разделить ответственности и уменьшить количество строк кода ⚡️ Если вам было интересно и полезно это почитать - поставьте реакцию под постом, мне будет очень приятно! ⚠️ Впереди вас ждет еще больше паттернов, упрощающих жизнь! Было интересно - ДЖУН ДЖУНО К ВАШИМ УСЛУГАМ!

🔥 ЦАРСКИЙ ПАТТЕРН В МИРЕ ПРОЕКТИРОВАНИЯ 🔥 🙂 Всем привет! И сегодня мы поговорим о паттерне СТРАТЕГИИ ❗️ Мы разрабатываем R
+3
🔥 ЦАРСКИЙ ПАТТЕРН В МИРЕ ПРОЕКТИРОВАНИЯ 🔥 🙂 Всем привет! И сегодня мы поговорим о паттерне СТРАТЕГИИ ❗️ Мы разрабатываем RTS игру в формате PVP. Каждый игрок может выбрать формацию построения своего войска ❓Как же это можно сделать? 📌 Можно сделать фабрику, которая будет создавать юнитов 📌 В нем будут несколько приватных методов, в которых инкапсулирован подсчет нужной позиции юнита 📌Также мы создадим шаблонный метод, который на основе enum выбирает нужный метод подсчета позиции, после чего создаем юнита в этой позиции ‼️ И вроде бы даже это хорошо выглядит. Но есть нюансы: ❌ Во-первых, логика создания юнита дублируется в каждом методе. Метод, напомню, может быть не в одну строчку! ❌ Во-вторых, каждому методу формации могут понадобиться дополнительные поля. Тем самым придется разбивать поля на группы, что привет к разрастанию кода ❌ В-третьих у методов могут появится состояния. Адекватно это контролировать в контексте одного класса станет невозможно 📈 Способы решения: ✔️ Вынести логику создания одной формы в один класс. Благодаря чему, мы сразу решим все три вышеназванные проблемы. Логика конструирования юнита остается в фабрике, а логика получения позиции делегируется в отдельный класс ✔️ Прокаченная версия первого решения. Мы прячем все эти реализации конкретных форм под единый интерфейс ISpawnShape. Теперь наша фабрика получает из вне выбранную игроком формацию отряда. А фабрика по абстрактному контракту получает нужную позицию. Тем самым если у нас появятся в обновлениях новые формации, нам не придется дописывать код в фабрике 💥 Подведем итог: ⚡️ Паттерн стратегия - это сокрытие разных способов реализации под единым интерфейсом. Мы можем подменять эти реализации в режиме реального времени не беспокоя пользователя этого интерфейса. Мы обеспечиваем расширяемость системы, не переписывая уже имеющуюся логику 👀 Кто-то хочет добавить паттерн и позиционирование в определенной форме в свой проект - ссылка на Яндекс диск! ⚠️ А если нужно еще больше паттернов для улучшения архитектуры кода - поставьте реакцию! Джун Джуно к вашим услугам.

🔥 БЕЗ ЭТОГО ПАТТЕРНА ТЫ НЕ ПРОЙДЕШЬ НИ ОДНО РЕВЬЮ 🔥 🙂 Всем привет. Сегодня я бы хотел поговорить о такой важной теме, как
🔥 БЕЗ ЭТОГО ПАТТЕРНА ТЫ НЕ ПРОЙДЕШЬ НИ ОДНО РЕВЬЮ 🔥 🙂 Всем привет. Сегодня я бы хотел поговорить о такой важной теме, как код ревью. Если вы захотите куда-нибудь устроиться, вам придется написать тестовое задание. От того как вы его выполните зависит многое. ⚡️ Именно поэтому мы поговорим о паттерне COMPOSITE ROOT ⁉️ Зачем он нужен? ✔️ Представите, что вы открываете папку Scripts в Unity проекте. С чего вы начнете? И тут возникает ступор. Не понятен порядок инициализации объектов и что с чем взаимодействует. ❗️ Как выглядит это решение на практике: ✔️ Допустим у нас есть Player у него есть Backpack и Health. Так же есть UI, который проецирует здоровье и инвентарь. Мы берем класс, который так и назовем CompositeRoot. В нем мы инициализируем самый верхний уровень кода. В нашем случае это инициализация классов Player и UI. В свою очередь Player инициализирует Health и Backpack. А UI инициализирует HealthView и InventoryView. И так мы будем спускаться все ниже и ниже по уровням. ✔️Таким образом чтение кода начинается с Composite Root. Берется первый объект, который в нем инициализируется. В нашем случае Player. То есть мы продолжаем читать кода в классе игрок. И по той же схеме идем до самого низкого уровня. Как только мы до него дошли мы начинаем с самого верха. В наше случае это класс UI. 📈 В итоге мы выявили самую первую ошибку, на которой рушится большинство код реью. Если вы хотите узнать больше таких фишек - ПОСТАВЬТЕ РЕАКЦИЮ ПОД ПОСТОМ! Джун Джуно к вашим услугам!

🔥 НАСТРОЙКА АНИМАЦИИ СТОЙКИ В UNITY🔥 🙂 Мы продолжаем изучение анимаций в Unity. Сегодня мы сделаем анимацию персонажа, сто
+3
🔥 НАСТРОЙКА АНИМАЦИИ СТОЙКИ В UNITY🔥 🙂 Мы продолжаем изучение анимаций в Unity. Сегодня мы сделаем анимацию персонажа, стоящего на одном месте (Idle). И она ещё будет запускаться сама при запуске сцены! 📌 Для начала нам нужно, чтобы анимация стойки запускалась по умолчанию 📌 В верхнем левом углу окна Unity нажимаем на вкладку Window, потом Animation и в конце вкладка Animator 📌 В открывшемся окне есть зеленая ячейка с надписью Entry - это точка входа любой анимации ⁉️ Как запускать анимацию стойки по умолчанию? ✔️ Зажимаем анимацию в окне Project, переносим в окно Animator и отпускаем ✔️ Далее нажимаем правой кнопкой мыши на точку входа анимации и выбираем вкладку Make Transition ✔️ После нажимаем на нужную нам анимацию ✔️ Мы создали стрелочку, которая является переходом от одной анимации к другой ✔️ Чтобы анимация запускалась первой, нажимаем на ячейку с этой анимацией правой кнопкой мыши и выбираем Set as Layer Default State 💥 ВСЕ ГОТОВО, МОЖНО ЗАПУСКАТЬ И ТЕСТИРОВАТЬ!!! ⚡️Мы ещё будет возвращаться в это окно! Не прощаемся!! ❓ Было познавательно и интересно - ставьте реакции под постом! Так я понимал, что вам интересно) ⚠️ В качестве домашнего задания порекомендую сделать воспроизведение анимации атаки. А если у вас остались вопросы, Джун Джуно к вашим услугам!

🔥ПРЕВЬЮ ДЛЯ ВИДЕО ГОТОВО 🔥 🙂 Джун Джуно к вашим услугам! Немного отдохнём сегодня от кода. Дам вам денёк переварить всю эт
🔥ПРЕВЬЮ ДЛЯ ВИДЕО ГОТОВО 🔥 🙂 Джун Джуно к вашим услугам! Немного отдохнём сегодня от кода. Дам вам денёк переварить всю эту информацию ⚡️ Хочу сообщить прекраснейшую новость: превью к видео уже готово ‼️ Ставьте реакции, если хотите поскорее увидеть его)

🔥 ШАБЛОННЫЙ МЕТОД 🔥 🙂 Пришло время нам начать изучать паттерны проектирования. Сегодня мы начнем с самого простого. Данный
🔥 ШАБЛОННЫЙ МЕТОД 🔥 🙂 Пришло время нам начать изучать паттерны проектирования. Сегодня мы начнем с самого простого. Данный подход уже был показан в предыдущем посте. Сейчас мы рассмотрим его более детально ⁉️ Бывало ли у вас такое, что у одного класса нужно вызывать несколько методов в определенной последовательности? Скорее всего - да! ❗️А если эти методы находящиеся в базовом классе? В таком случае очень тяжело контролировать порядок вызова методов. Решение данной проблемы - паттерн ШАБЛОННЫЙ МЕТОД ✔️ У нас есть класс LazerGun. В его методе TryShoot заключен определенный алгоритм 💥 Вспомним немного курс школьной информатики 📌 Алгоритм - последовательное выполнение определенных шагов ✔️ Мы намеренно оставляем зазор в виде виртуального метода Shoot. То есть мы позволяем наследникам изменять определенный шаг алгоритма. Таким образом наследники не смогут нарушить задуманный алгоритм 📈 Итог: шаблонный метод - это инкапсуляция некого алгоритма внутри метода базового класса. Внутри этого алгоритма мы продумываем шаги, которые можно подменить без вреда для алгоритма 👀 Впереди нас ждёт ещё больше паттернов проектирования, которые упростят вашу жизнь. Если вы ждёте их - поставьте реакцию! И помните, если нужен профессиональный код - Джун Джуно к вашим услугам!

🔥 ВИРТУАЛЬНЫЕ МЕТОДЫ 🔥 🙂 Всем привет! Мы ознакомились с очень интересными и полезными темами в C#, сейчас же время для одн
🔥 ВИРТУАЛЬНЫЕ МЕТОДЫ 🔥 🙂 Всем привет! Мы ознакомились с очень интересными и полезными темами в C#, сейчас же время для одного спорного момента ⚡️ Сегодня мы поговорим о том как переопределять члены базового класса ✔️Представим класс Animal, у кого есть два наследника Cat и Duck ❗️Все животные в игре ходят по земле, но лишь одна утка плавает в воде ⚠️ В очень редких случаях и с большой осторожностью можно использовать виртуальные методы 📌 Похожи на абстрактные члены. Единственная разница - наличие в виртуальных членах реализации, которую наследники могут подменить ‼️Как писать виртуальные члены и их переопределять: ✔️ В базовом классе мы после модификатора доступа пишем ключевое слово virtual ✔️В наследниках после модификатора доступа пишем ключевое слово override ⚠️ Резюмируя хочу сказать, что использовать виртуальные методы не самая хорошая практика, но знать о ней стоит 👀 А где же можно использовать этот неоднозначный виртуальный метод? 💥 Ответ узнаете завтра, в новом посте про один паттерн проектирования 📈 Если интересно узнать, что это за паттерн - Джун Джуно к вашим услугам!

🔥 УСКОРЬ СВОЮ РАБОТУ В UNITY В 10 РАЗ ЗА ПАРУ СЕКУНД🔥 🙂 Всем привет! Вас тоже бесит эта невероятно долгая загрузка сцены в
+1
🔥 УСКОРЬ СВОЮ РАБОТУ В UNITY В 10 РАЗ ЗА ПАРУ СЕКУНД🔥 🙂 Всем привет! Вас тоже бесит эта невероятно долгая загрузка сцены в Unity? Когда мы настраиваем сцену, каждый раз приходится ждать ‼️РЕШЕНИЕ ЕСТЬ!!! ✔️ Находим в правом верхнем углу Unity кнопку Edit ✔️ В открывшемся списке выбираем Project settings ✔️Далее выбираем Editor и спускаемся в самый низ ✔️Включаем галочку Enter Play Mode Options. 💥ПОЗДРАВЛЯЮ! 📈Теперь, когда вы будете заходить в Play mode, ваша сцена будет загружаться моментально! ❗️Смог упростить жизнь - ставьте реакции! А если нужно больше крутых лайфхаков - Джун Джуно к вашим услугам!

🔥ИНТЕРФЕЙС - СЫН МАМИНОЙ ПОДРУГИ В IT🔥 🙂 Скучали по контрактному программированию? У нас сегодня продолжение этой темы. С
+1
🔥ИНТЕРФЕЙС - СЫН МАМИНОЙ ПОДРУГИ В IT🔥 🙂 Скучали по контрактному программированию? У нас сегодня продолжение этой темы. С каждым днём мы всё больше и больше узнаём ✔️ Рассмотрим классы Player и Gun. Класс игрока назовём пользователем, а пушку - сервисом ✔️У класса Gun есть приватные члены: метод расчета разброса и поле, отвечающее за текущее число патронов ✔️А также публичные члены: методы стрельбы, перезарядки и свойство, хранящее максимальное число патронов. ❗️Они же и являются интерфейсом Gun ⁉️Но что если у класса Gun есть еще один пользователь? Допустим он будет проецировать текущее количество патронов в UI ‼️Тут возникает ПРОБЛЕМА! 📌Класс визуализации может обратится к методу стрельбы и перезарядки ❌ Естественно такой возможности быть не должно!!! ❓Но как решить эту проблему? Рассмотрим два варианта 📉 Отстойный способ. У нас есть абстрактный класс AbstractGun, содержащий абстрактные методы перезарядки и стрельбы 📌 Добавили абстрактный класс BulletsVisualization, хранящий абстрактное свойство с максимальным числом патронов и абстрактное событие о изменении текущего числа патронов ❓ Как нам унаследовать Gun от двух абстрактных классов? ℹ️ Ответ: НИКАК! ⚡️На помощь придёт интерфейс. Пару слов о нем: ✔️ Определяет некий функционал, поэтому в нем не может быть реализации ✔️ Напоминает абстрактный класс, у которого все члены абстрактные ✔️Несколько интерфейсов могут быть реализованы одним классом 📈 Крутой способ. Выделим интерфейсы IShootable и IBulletsCounting. В IShootable будет методы стрельбы и перезарядки. В IBulletsCounting будет максимальное число патронов и событие о изменении их количества 💥 Каждый клиент получает объект с тем интерфейсом, который ему нужен. Тем самым, мы не перегружаем пользователя этого класса лишней информации и вдобавок даём свободу для расширения объектов (добавление нового вида оружия) ⭐️ Хороший код спасён и сегодня! ⚠️ А вы можете спасти меня, поставив реакцию! И помните, если нужен профессиональный код - Джун Джуно к вашим услугам!

🔥 КОНТРАКТНОЕ ПРОГРАММИРОВАНИЕ ЧЕРЕЗ АБСТРАКТНЫЙ КЛАСС 🔥 🙂 Представим, класс Player. Также есть родительский класс Gun, у которого два наследника Pistal и AssaulRifle ❗️Каждый из них содержит метод стрельбы Shoot и свойство BulletsPerShoot ✔️ Pistal реализует логику оружия путём бросания Raycast вперед. Вдобавок содержит метод Update, в котором при каждом нажатии клавиши R происходит перезарядка. Это пистолет, поэтому количество пуль за выстрел равно единице ✔️AssaulRifle похож на дробовик: отправляет сразу несколько пулей (Raycast) с неким разбросом. В Update мы перезаряжаемся на клавишу R и меняем режим стрельбы на Q. Значение свойства зависит от режима: есть как и одиночный, так и очередью ❗️ В классе Player через инспектор можно указать пушку. Всё хорошо, пока не осознаём огромную проблему: ⚠️ Мы не можем обратиться к методу Shoot и свойству BulletsPerShoot отдельно взятого пистолета, отдельно взятого дробовика ‼️ Обычное наследование позволяет вывести лишь общую логику ⁉️ Но всё-таки как, обращаясь к методу и свойству Gun, обратиться к логике его наследников AssaulRifle и Pistal? ⚡️Ответ на вопрос - абстрактный класс ❓А в чем разница между обычным и абстрактным классом? 📌 Нельзя создать экземпляр абстрактного класса. От него можно только наследоваться 📌 Нельзя создать объект с компонентом абстрактного класса 📌У абстрактного класса можно сделать абстрактные методы и свойства. Тем самым мы передаем наследникам ответственность за реализацию части логики 📌 У абстрактных членов не может быть модификатора private. Так как у наследников обязательно должен быть доступ к ним 📌 У абстрактных методов нельзя написать реализацию в абстрактном родительском классе, только в наследнике ➡️ Это и есть контрактное программирование 🗣️ Наследник обязан реализовать абстрактные члены класса 🗣️ - то есть выполнять контракт 💥 Вернёмся к коду: ✔️ Сделаем у Gun метод Shoot и свойство BulletsPerShoot абстрактными, то есть разрешим наследникам самим определять логику стрельбы ✔️ Shoot вызывается в публичном методе Fire класса Gun, который тратит патроны. Также есть protected метод Reload для перезарядки оружия ✔️ Методы и свойства в наследниках переопределены с помощью слова override, то есть реализуют свою собственную логику ✔️Есть protected свойства текущего и максимального числа патронов 📈 В итоге, мы создали расширяемую систему оружий, не ведущую при добавлении новой пушки к изменению логики поведения игрока ‼️ Абстрактный класс - лесенка, где мы выбираем ступени, которые можно создать позже ❌ C# запрещает наследоваться от нескольких абстрактных классов ⁉️ Но как эту проблему решить, если уж очень надо?! 🙂 Смог заинтриговать - ставьте реакции! Ждите новый пост завтра. А если нужен профессиональный код - Джун Джуно к вашим услугам!

🔥 БАЗА КОНТРАКТНОГО ПРОЕКТИРОВАНИЯ🔥 🙂 Дорогие читатели, настал переломный момент в осознании проектирования. Мы взглянем н
🔥 БАЗА КОНТРАКТНОГО ПРОЕКТИРОВАНИЯ🔥 🙂 Дорогие читатели, настал переломный момент в осознании проектирования. Мы взглянем на код с другой стороны, разобрав контрактное программирование ⚡️Представим класс Player с полем _gun. Оружие умеет стрелять через метод Fire ⁉️ НО КАК БЫ ТЫ ЭТО РЕАЛИЗОВАЛ?! ✔️ Вариант 1: 📌Пусть у Player есть метод Initialize. В него кто-то передает пистолет. Пусть у нас есть класс Pistal, в котором есть метод для стрельбы. В этом классе также есть и другие методы, которые свойственны только пистолету ⚠️ Вышло обновление в игре: перед матчеи можно выбрать либо пистолет, либо автомат. И тут появляются проблемы. Наш класс Player не готов к таким изменениям: поле _gun типа Pistal и придется создавать новое поле для автомата ✔️Вариант 2: 📌 Наследование в помощь ❗️Метод Initialize игрока изменился: туда передается объект типа Gun. У этого класса есть только один метод - Fire ✨ Класс Pistal наследуется от Gun и хранит все его свойства, обладая при этом собственной логикой ℹ️ Во время обновления мы написали класс AssaulRifle (автомат), который также наследник Gun 📌 Итог: тот кто инициализирует игрока может передать любой объект (оружие), которое наследуется от Gun ❌ Класс Player никак не зависит от того, какое оружие ему передадут 📈 Игрок сможет корректно обработать любое оружие: для него это лишь объект, который умеет стрелять ⚠️ И так мы плавно подходим к основной идеи ‼️ ПРОЕКТИРОВАНИЕ НА УРОВНЕ АБСТРАКЦИИ, А НЕ РЕАЛИЗАЦИИ 🔖 В этом и суть контрактного программирования. Нам не важно чем мы пользуемся: пистолетом, автоматом или бластером. Нам важно, что этот объект умеет стрелять ⭐️ Мы значительно ускорили разработку и упростили себе работу ⚠️ Но, у любой медали есть и обратная сторона! ❗️Если все делать абстрактным и забыть о связях между классами - код будет невозможно поддерживать 💥 Знай золотую середину! А если хочешь узнать, как её нащупать - Джун Джуно к вашим услугам! 🔔 Пожалуйста, поставьте реакцию. Ваша поддержка мотивирует меня и дальше выпускать посты!

🔥ДЖУН ДЖУНО УШЁЛ ИЗ ОБРАЗОВАНИЯ 🔥 🗣️Джун Джуно к вашим услугам! 🗣️ 🙂 Именно эта фраза стала моей коронной, после дня про
🔥ДЖУН ДЖУНО УШЁЛ ИЗ ОБРАЗОВАНИЯ 🔥 🗣️Джун Джуно к вашим услугам! 🗣️ 🙂 Именно эта фраза стала моей коронной, после дня пробуждения. Я использовал её, продавая курсы. Я использовал её, обучая детей. И я использую её сейчас, открывая вам дорогу в мир IT ⚡️Для многих самый шокирующий факт моей биографии - работа учителем информатики в элитной частной школе в 16 лет ‼️Но на этой неделе, произошло ещё более невероятное - я вырос из московской школы в 17 лет и ухожу из образования, чтобы двигаться дальше 👀 Я проработал там с августа. В течение последнего месяца руководство уговаривало меня остаться, даже покинув территорию детского сада, я чувствовал их взгляд надежды, надежды на моё возвращение ❗️ Я смог стать классным учителем. Я вёл три класса в школе и две группы в детском саду. С большим интересом подходил к преподаванию. Я обучал детей монтажу видео, проектированию дизайнов в Figma, созданию презентаций с помощью нейросетей. Ну и конечно же - программированию ⭐️ Но главное - стал их любимчиком. Я весь учебный год с удовольствием выходил на прогулки с детьми. Организовывал игры на свежем воздухе. Мне очень нравилось играть вместе с ними в футбол, где я всегда выступал в качестве комментатора, превращая игру в настоящее шоу 📈 Я поставил себе цель - довести детей до конца учебного года. Хоть из-за этого я плохо спал, живя практически без выходных, но бросить на пол-пути не мог их ✨ Ждите ещё больше невероятных новостей от меня! Тут будет ещё больше занимательного контента! А пока держите милейшую фотографию Джуна Джуно с одной из прогулок 💥 Если нужен профессиональный код - Джун Джуно к вашим услугам!

😭 Анимация с Джуном Джуно отменена ‼️ Из-за недопонимания, наше сотрудничество с художницей, кто должна была нарисовать вдоб
😭 Анимация с Джуном Джуно отменена ‼️ Из-за недопонимания, наше сотрудничество с художницей, кто должна была нарисовать вдобавок и стикеры, к сожалению, прекратилось ⚠️ Сроки выхода первого видео из-за форс-мажора переносятся ( ❌ Стикеры видимо проклялая тема, только за май четырём художникам предлагал заказ, но всегда появлялся камень преткновения 🙂 Но я не буду расстраиваться! Это только начало, впереди огромное количество побед! ⚠️ А если хотите научиться кодить - Джун Джуно к вашим услугам!

🔥 ФУНДАМЕНТАЛЬНАЯ ПРАКТИКА В ПРОЕКТИРОВАНИИ🔥 👀 Представим, у нас есть класс Wallet. В котором можно изменять поле _money,
+1
🔥 ФУНДАМЕНТАЛЬНАЯ ПРАКТИКА В ПРОЕКТИРОВАНИИ🔥 👀 Представим, у нас есть класс Wallet. В котором можно изменять поле _money, хранящее количество монет, через методы AddMoney и SpendMoney. Сделана вдобавок логика отображения монет в текстовом окне, через метод UpdateUI ❓ Какие минусы данного подхода? ❌ Чем больше мы будем добавлять различной логики, тем длиннее будет класс ❌ Если добавить ещё одно окно отображения - придется создавать новое поле и модифицировать метод UpdateUI ❌ Код очень запутанный ⚡️ Для решения нам нужно делить логику на слои, которыми в C# выступают классы ✔️ View - класс, взаимодействия с миром Unity, наследуется от MonoBehaviour ✔️Model - класс, изменения данных и правил. В этом слое хранятся определенные данные. Его особенность - неспособность ссылаться на объекты из других слоев ✔️ Presenter - класс, измененяющий данные Model в зависимости от контекста и передающий их View ‼️ Теперь Джун Джуно покажет это на практике: 📌Класс WalletModel хранит в себе только количество монет и два метода для изменения их количества 📌Класс WalletPresenter хранит в себе ссылку на модель и принимает изменения с View. Когда в модели меняются данные, он меняет визуализацию в View 📌Класс WalletView хранит Presenter и обращается к его методам для изменения данных 📈 Плюсы данного подхода: ✔️Класс Model это простой C# - класс. Он спокойно может хранится как на компьютере, так и на сервере ✔️Класс Model легко сохранять и загружать в любом формате ✔️ Мы можем очень легко менять детали работы Presenter не затрагивая другие слои ✔️У одной Model может быть много мелких классов View. А логика обновления данных хранится в заранее написанном Presenter, следовательно не будет дубляжа кода 💥 Как итог, мы разобрались как разделять логику любой механики на слои! Познали очень важную технику проектирования, познали фундамент для разработки хорошего проекта! ⚠️ Потратьте секунду вашего времени и поставьте реакцию! Мне будет очень приятно! А если нужен профессиональный код - Джун Джуно к вашим услугам!

🔥ОПТИМИЗИРУЙ СВОЙ КОД В 10 РАЗ🔥 🙂 Сегодня мы поговорим о простой, но очень мощной системе в C#, благодарю которой код стан
🔥ОПТИМИЗИРУЙ СВОЙ КОД В 10 РАЗ🔥 🙂 Сегодня мы поговорим о простой, но очень мощной системе в C#, благодарю которой код станет намного лучше ➡️ В предыдущих постах мы использовали эту систему, когда подписывались на нажатие кнопки. Сегодня мы рассмотрим ее более детально ⚠️ Проблема: ❗️У нас есть класс Wallet, в котором хранятся монетки. Также есть класс WalletView, который отображает эти монетки. Как вариант мы можем каждый кадр проверять не изменилось ли количество ⚠️ НО! Это съедает очень много ресурсов 🔔 Решение: ✔️ Каждая вьюшка подписывается на событие об изменении количества монеток. По сути мы сменили связь с PUT(когда мы берем данные) на PUSH(когда мы отправляем данные) ⁉️ Как работать с событиями?! ✔️ Для создания события пишем модификатор доступа, ключевое слово event, Action, по необходимости ставим <>, если хотим, чтобы событие возвышало какое-нибудь значение, и в конце именуем его ❓Как вызвать событие? ✔️ Пишем имя события, ставим вопросительный знак - чтобы убрать ошибки при отсутствии подписчиков, вызываем у события метод Invoke ✔️ Если событие что-то возвращает в аргумент метода Invoke передаем это значение ✔️ Для того чтобы подписаться на событие нужно: слева от знака += написать событие, на которое мы хотим подписаться ✔️ Справа от знака += метод, на который мы хотим подписать без круглых скобок 📈 Пример: _wallet.Changed += OnChanged ⚠️ Всегда нужно следить за тем, что если мы подписались, то мы должны обязательно отписаться ❗️ Самое простое делать подписку в OnEnable, а отписку в OnDisable ✔️ Методы, на которые мы подписываем на событие называются обработчики. Именуются - On + имя события 📌 ПОДВЕДЕМ ИТОГИ!!! 💥 Мы с вами разобрались в самой мощной и часто используемой техникой при написании игр ℹ️ Тренируйтесь и внедряйте в свои проекты;; ⚙️ Если вам было познавательно и интересно - ставьте реакции под постом! А если нужен профессиональный код - Джун Джуно к вашим услугам!

🔥 ВРЕМЯ ДЛЯ ЧТЕНИЯ 🔥 👀 Джун Джуно к вашим услугам! Сегодняшнее утро начинается с чтения замечательной книги от моей учениц
🔥 ВРЕМЯ ДЛЯ ЧТЕНИЯ 🔥 👀 Джун Джуно к вашим услугам! Сегодняшнее утро начинается с чтения замечательной книги от моей ученицы ‼️ Всем добра на день!

🥰 Роман Сакутин, с днём рождения! ⚡️ У каждого из нас есть любимая книга, о которой вы можете говорить часами напролёт. Но всегда остаётся чувство недосказанности.. Закончив длинный разговор о ней, спустя короткое время появляется желание добавить ещё что ⭐️ Хуманизацией такой книги для вашего Джуна Джуно является сегодняшний именинник - Роман Сакутин! 📌 Я весьма много говорил в своих постах о влиянии Романа на формирование личности, но всякий раз ощущал: мне есть что сказать, есть что добавить 🎤 Я произнесу тост за человека, кто стал для меня не просто наставником, а отцом духовным! ✨ Я невероятно горд, что живу на одном свете с таким человеком, как Роман!
Свеча, передав частичку своего пламени другой, не станет гореть слабее
❗️Этим огоньком была его гармония борьбы и сомнения, которую вот уже на протяжении десяти лет, он продвигает в массы 🔼 Он научил нас верить в свои собственные силы. Из токсичного IT- блогера в основателя лучшей IT школы в России - путь, который все увидели, но мало кто прочувствовал 📈 Роман сделал огромный скачок за этот год. Мало кто понимает, насколько это было тяжело и круто.. Мы будто бы с Романом двигались вместе.. Каждый из нас попал на абсолютно новый уровень мироощущения, который был бы непостижим для нас из прошлого ➡️ И говоря про мироощущение, будет уместно вернуться к началу моего поздравления ❓ К какой книге ваш Джун Джуно постоянно возвращается? ℹ️ Ответ: Библия ⌛ Роман открыл для себя совершенно новый мир в последние месяцы. В век радикального атеизма, в век небывалого материализма, у тех немногих людей всё ещё хватает мужества нести бремя идеалиста ✔️ Я невероятно уважаю Романа за его стремление к Богу, за его абсолютно картезианское стремление усомниться во всём и как следствие - расставание с алкоголем ‼️ Советую прочесть Роману "Исповедь" Аврелия Августина. Очень хороший философский труд для тех, кто хочет взглянуть на философию не как на науку, а как на искусство. Без доли иронии советую тем, кому зашёл стиль Шопенгауэра и Ницше 💥 Закончить поздравление хочу очень важной для меня темой - детьми. Я отлично знаю, что такое детская любовь и прекрасно понимаю, какие эмоции Роман испытывал, получив такое поздравление от своей дочери.. Я уже смог почувствовать эту искреннюю симпатию, проработав столько времени и в школе, и в детском саду. Для меня даже рисунок от них огромное счастье и радость, где они так часто рисуют меня в образе собачки или котика.. 🙂 Я хочу пожелать дочери Романа и молодому папаше тёплых взаимоотношений.. Очень хочу, чтобы она не чувствовала себя одинокой из-за развода. Пусть она будет очень счастливой! ℹ️ Я никогда не увижу своего отца, поэтому я мечтаю о дне, когда от той самой женщины появятся свои собственные дети. Хочу проводить с ними время, хочу сделать их счастливыми, хочу чтобы они с гордостью говорили всем: "У меня есть папа!" 👍 Роману пожелаю найти время в своей жизни и для прекрасной дочурки.. Детям очень нужен отец в жизни. Пожелаю больше любви вам обоим! ⚠️ В этот день появился на свет человек, ставший при жизни легендой в первую очередь для меня! 🔥 Роман Сакутин, с днём рождения!

🔥 МНОГО СТИКЕРПАКОВ ДЛЯ ДЕТЕЙ 🔥 🙂 Джун Джуно к вашим услугам! Сегодня вечер воскресенья, завтра у меня рабочий день, а это
🔥 МНОГО СТИКЕРПАКОВ ДЛЯ ДЕТЕЙ 🔥 🙂 Джун Джуно к вашим услугам! Сегодня вечер воскресенья, завтра у меня рабочий день, а это значит.. ‼️ Я купил много-много наклеек и стикеров для моих учеников 👀 Хотели бы взять?