Джун Джуно к вашим услугам! Путь в разработку игр | Движуха Сакутина
270 subscribers
189 photos
19 videos
1 file
75 links
Для связи: @junoscode
Download Telegram
🔥 We Were Here - интерпретируй историю 🔥


🙂 Всем привет! Мы продолжаем нашу увлекательную серию обзоров качественных инди-игр, и сегодня хочу представить вам уникальную игровую франшизу "We Were Here". Если вы любите решать головоломки и хотите провести время с другом, то эта игра точно для вас! К тому же, она создана на движке Unity, что делает ее доступной и визуально приятной

✔️ В каждой части игры вы с вашим напарником будете проходить несколько уровней, полных интересных и разнообразных задач. Один из самых захватывающих аспектов "We Were Here" заключается в том, что вы часто попадаете в разные комнаты, где решения головоломок находятся лишь на стороне вашего партнера. Это создает уникальную ситуацию, когда вам нужно объяснять друг другу, что вы видите, и как это может помочь продвинуться вперед, не имея полного представления о том, что происходит в другой комнате. Эта интерактивная коммуникация добавляет напряжения и повышает интерес к игровому процессу

📈 Игры из этой серии не только прекрасно развивают навыки командной работы и общения, но и являются отличным способом провести время с друзьями в увлекательном и веселом формате. Сюжетные линии игры тоже заслуживают отдельного внимания: они проработаны таким образом, что каждый игрок получает неповторимый взгляд на историю. Это делает игру не только захватывающей, но и неповторяемой, поскольку каждый раз вы можете открыть что-то новое, просто поменяв места с вашим коллегой по команде

💥 Я искренне рекомендуем "We Were Here" всем тем, кто ищет увлекательные и интеллектуальные приключения вместе с друзьями. Присоединяйтесь к нашему туру по качественным инди-играм и не пропустите шанс узреть все прелести этой замечательной франшизы!


⚠️ А если вам нужен специалист в этом туре - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
5🦄1
🔥 Как мультиплеер оживляет игры?🔥


🙂 Всем привет! Вы когда-нибудь задумывались, почему многим людям нравятся мультиплеерные и соревновательные игры? На первый взгляд, может показаться, что это всего лишь набор однородных механик, где команды сражаются друг с другом. Но если взглянуть глубже, становится понятно, что привлекает игроков в этих жанрах

✔️ В каждой игре разработчики могут создать множество увлекательных элементов и контента, однако этот контент, к сожалению, имеет свои пределы — он когда-нибудь заканчивается. В отличие от этого, другие игроки становятся бесконечным источником разнообразия и уникальных ситуаций. Каждый матч или соревнование может складываться совершенно по-разному, в зависимости от того, с кем вы играете. Это создает новизну, которая поддерживает интерес к игре

📌 Когда вы внедряете мультиплеерные элементы или добавляете интересные соревновательные режимы, это не только увеличивает время, проведенное игроками в игре, но и существенно обогащает их опыт. Игроки чувствуют себя вовлеченными и мотивированными к постоянному возвращению, так как каждый матч — это новая возможность, уникальный вызов, и, возможно, шанс показать свои навыки

📈 Таким образом, увеличение вовлеченности игроков в свою очередь может заметно повысить монетизацию — например, на таких платформах, как Яндекс. Игры. Интерес к игре и желание развиваться в ней ведут к покупке внутриигрового контента, что приносит значительные доходы разработчикам. Глубина взаимодействия, возникающая в мультиплеерных играх, — это не просто способ привлечь игроков, а ещё и мощный инструмент для создания устойчивого и прибыльного игрового проекта. А если хотите пост про мультиплеер в Unity - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2🦄1
🔥 PID-контроллер: Основы 🔥


🙂 Всем привет! Сегодня мы немножко углубимся в изучение физики. Поговорим про теорию PID контроллера, что он из себя представляет и рассмотрим его плюсы и минусы


🗣️ PID-контроллер (пропорционально-интегрально-дифференциальный) — это эффективный метод управления в автоматике 🗣️

‼️ Он состоит из трёх компонентов:

✔️ P (пропорциональная): Реагирует на текущее отклонение от заданного значения. Чем больше ошибка, тем больше управление, но без учета устойчивой ошибки

✔️ I (интегральная): Устраняет накопленные ошибки во времени, уменьшая постоянное отклонение. Может вызвать колебания при переработке

✔️ D (дифференциальная): Предсказывает будущее поведение системы на основе скорости изменения ошибки, гладит управление и уменьшает колебания


📊 Настройка параметров
Для эффективной работы PID контроллера нужны правильные значения:

1️⃣ Kp (коэффициент P): Определяет реакцию на текущую ошибку

2️⃣ Ki (коэффициент I): Устранение накопленных ошибок

3️⃣ Kd (коэффициент D): Устойчивость и снижение колебаний


📈 Преимущества:

Простота и интуитивность в настройке
Широкая область применения
Эффективность в системах с постоянными и предсказуемыми изменениями

📉 Недостатки:


Может быть неэффективен при высоких динамических изменениях (шум)

Неправильная настройка параметров может привести к нестабильности и колебаниям

Не всегда эффективно в системах с большим запаздыванием


💥 Заключение
PID контроллер является универсальным инструментом в области автоматизации и управления. Правильная настройка его параметров позволяет достигать высокой стабильности и точности в разнообразных приложениях. Несмотря на свои недостатки, он остаётся одним из самых популярных методов контроля, благодаря своей простоте и эффективности. Если хотите поскорее увидеть практику - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
5🦄1
🔥 Реализация PID-регулятора на C# 🔥


🙂 Всем привет! Сегодня мы подробно рассмотрим, как реализовать PID-регулятор на языке C#. При правильной настройке этот класс способен регулировать различные системы, начиная от авиасистем и заканчивая бытовыми приборами, такими как мультиварки


‼️ Структура класса
Начнем с определения основных полей, которые будут использоваться в нашем регуляторе:

📌 _ki, _kp, _kd — коэффициенты, которые необходимо настроить в зависимости от конкретной ситуации. Они являются критически важными для получения правильных реакций регулятора

_targetPoint — целевая точка, на которую мы стремимся, то есть желаемое значение

📌 _error — накопленная ошибка, представляющая собой разницу между текущим состоянием и желаемым значением

📌 _integral — сумма ошибок за определенный период времени, необходимая для корректировки управляемой системы

📌 _currentDelta — разница между текущей и предыдущей ошибками


📊 Основные вычисления:

Все вычисления в нашем регуляторе можно разделить на три ключевые части:

1️⃣ Пропорциональная часть: Это базовый расчет, где мы просто вычитаем текущее значение из целевой точки. Этот шаг нам позволяет определить, насколько далеко мы от цели

2️⃣ Интегральная часть: Здесь мы добавляем текущую ошибку к аккумулятору интеграла и ограничиваем его значение. Это помогает устранять устойчивую неравномерность, которая может возникнуть со временем

3️⃣ Дифференциальная часть: В этом шаге мы вычисляем разницу между предыдущей и текущей ошибками и добавляем ее к интегралу и текущей ошибке. Как и в предыдущем случае, результат также ограничиваем


🔼Публичные методы

Следующим шагом будет реализация публичных методов для удобства работы с контроллером. Мы создадим следующие методы:

✔️ Tick(float time, float input): Этот метод будет принимать время между тиками и текущее значение, к которому мы стремимся. Он выполняет все необходимые расчеты на каждом тике

✔️ SetMinMax(float min, float max): Данный метод будет использоваться для заполнения полей, отвечающих за ограничение значений во время клэмпов. Это обеспечит стабильность и безопасность работы системы

✔️ SetTarget(float target): Через этот метод контроллер будет запоминать желаемое значение, что позволит нам динамически изменять целевые точки в процессе работы


💥 Заключение::
Сегодня мы детально рассмотрели структуру и логику работы PID-регулятора. Важно помнить, что корректная настройка коэффициентов является залогом успешной работы вашего регулятора. Завтра мы продолжим изучение этой темы и поговорим о том, как применить нашу систему в игровом движке Unity. Подготовим примеры и разберем, как реализовать наши идеи на практике. А если хотите оставаться в вечном It-тонусе - Джун Джуно к вашим услугам
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5🦄1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Практическое применение PID контроллера в Unity 🔥


🙂 Всем привет! В этом посте мы погрузимся в практическое применение PID-регулирования в движковой среде Unity. В рамках нашего примера мы создадим упрощенную систему амортизации, которую можно использовать в различных игровых механиках

✔️ Первым шагом будет создание класса PidRegulated, который будет отвечать за передачу усилий на RigidBody управляемого объекта. Этот класс станет связующим звеном между целевым значением и фактическим положением объекта, позволяя нам точно настраивать движение

📊 Основным аспектом работы PID-контроллера является правильная настройка его коэффициентов: Kp (пропорциональный), Ki (интегральный) и Kd (дифференциальный). Каждый из этих коэффициентов влияет на реакцию системы на изменения и может существенно повлиять на стабильность и быстроту отклика

На видео, вы увидите динамику работы системы: нижний куб перемещается вдоль оси X, в то время как верхний куб пытается адаптироваться к его движениям. Если коэффициенты будут правильно настроены, нижний куб будет мгновенно и безупречно подстраиваться под верхний, создавая плавное и естественное взаимодействие объектов

📈 Попробуйте поэкспериментировать с различными значениями коэффициентов Kp, Ki и Kd, чтобы увидеть, как меняется поведение системы. Подобная практика не только улучшит ваши навыки в программировании, но и даст лучшее понимание принципов управления в игровых движках

💥 Надеюсь, этот пример вдохновит вас на создание собственных уникальных решений с использованием PID-регулирования в ваших проектах! А если хотите больше таких видео по разработке игр - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
4🦄1
🔥 Мощный плагин от Agava 🔥


🙂 Всем привет! Сегодня мы с радостью анонсируем импорт еще одного SDK от нашей любимой компании Agava. Мы говорим о WebUtility — мощной утилите, которая включает в себя ряд удобных функций, значительно облегчающих жизнь разработчиков.


📊 Давайте подробнее рассмотрим возможности этой утилиты:

1️⃣ Управление звуком игры:
WebUtility позволяет автоматически заглушать звук в момент, когда игрок сворачивает окно игры. Это особенно важно для успешной модерации на платформе Яндекс. Игроки ценят правильное поведение игры, когда они переключаются между окнами. Для реализации данной функции необходимо подписаться на событие. .InBackgroundChangeEvent. Оно возвращает логическое значение: если true — игра свернута, если false — игрок остаётся на странице

2️⃣ Определение устройства:
С помощью свойства Device.IsMobile разработчики могут легко определить, на каком устройстве играет пользователь. Эта информация позволяет адаптировать пользовательский интерфейс и функциональность игры под конкретные характеристики устройства, обеспечивая лучшую производительность и удобство для пользователей

3️⃣ Проверка наличия AdBlock:
Ещё одна полезная функция утилиты — это возможность проверки, включён ли у игрока AdBlock. Это осуществляется через свойство AdBlock.Enabled. Зная, используется ли блокировка рекламы, разработчики могут принимать более обоснованные решения относительно монетизации своих игр.


💥 Заключение:
Несмотря на то, что у WebUtility всего три ключевые функции, каждая из них чрезвычайно полезна и существенно упростит жизнь разработчикам при выполнении требований Яндекс-модерации. Используя эту утилиту, вы сможете сосредоточиться на создании качественного игрового контента, не беспокоясь о нюансах, которые она эффективно решает. Хотите больше крутых плагинов - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5🦄1
🔥 Ответы на вопросы с собеседований 🔥


🙂 Всем привет! Посидел сегодня и подумал, а может стоит записать пост о вопросах которые задают на собеседованиях. Будит цикл постов по несколько вопросов и ответов на них. Начнем с вопросов про C#


1️⃣ Чем отличается динамическая типизация от статической?
Самый просто ответ. При статической типизации тип переменных определяется на этапе компиляции, а в динамической в процессе выполнения. Так же можно отметить, что при статической типизации код становится чуть понятнее за счет явных типов, но при динамической можно упростить код, ведь одной переменной может хватить для одного класса

2️⃣ Значимые и ссылочные типы. Спецификаторы аргументов функций ref, out
Начнем с места хранения. Значимые типы храниться в стеке. Ссылочные типы хранятся в куче, а ссылки на них в стеке. При попытке скопировать значимый тип - мы копируем значение. При попытке скопировать ссылочный тип - мы копируем только ссылку

Ref - ключевое слово, которое позволяет передавать не значение, а ссылку на переменную где хранится это значение. Меняя значения внутри метода мы меняем значение переменной которую передовали

3️⃣ Что такое ref и out?
Out - ключевое слово, которое обязует проинициализировать параметр метода внутри. Бывает полезно когда нужно вернуть несколько типов из одного метода


💥 Если вам понравился пост - оставляйте комментарии и ставьте реакции. Много сил было потрачено сегодня, надеюсь, вам понравилось! А если хотите больше советов с собеседований - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
18🦄1
🔥 Готовься к этим вопросам на собесе! 🔥


🙂 Всем привет! Сегодня мы продолжаем изучать вопросы, которые могут задать на собеседованиях

1️⃣ Что такое класс? Что такое структура? В чем отличие между структурой и классом?

✔️ Класс - данные и методы, которые используются для изменения этих данных. Отметим, что класс является ссылочным типом. Он используется для моделирования более сложного поведения или для таких данных, которые будут изменятся после создания объекта класса

❗️ Понятие структура - очень схоже с понятием класса, но главное отличие - является значимым типом. Она лучше подходит для небольшого набора данных, информация в котором не должна изменятся после создания структуры

2️⃣ Какие есть модификаторы доступа?

Private - объект виден только в текущем классе

Private protected - то же что и protected, но только внутри одной dll сборки

Protected - объекты видны в пределах текущего класса и его наследников

Internal - доступ к этим объектам имеют только объекты и текущей сборки. По сути тот же public, но доступ для объектов внутри своей dll


Protected internal - то же что и internal, но в добавок виден наследникам из других dll сборок

Public - у этого модификатора нет ограничений по доступу


💥 Спасибо за реакции под предыдущим постом. Очень мотивируют делать контент для вас! Буду благодарен за обратную реакцию снова! Ну и если хотите видеть больше детализированных картинок - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🦄1
🔥 Вопросы про интерфейсы на собеседовании 🔥


🙂 Всем привет! Сегодня мы уделим внимание вопросам про интерфейсы, которые могут задать вам на собеседовании


1️⃣ Что такое интерфейс? Какие члены можно описывать в интерфейсе?

✔️ Самое просто объяснение которое можно дать. Интерфейс - контракт который мы накладываем на класс. Почему это контракт? Потому что мы обязываем класс реализовать все члены этого интерфейса

✔️ Интерфейс может описывать методы, свойства и события. После версии C# 8.0 в нем допускается использование любых модификаторов доступа, кроме private. Модификатор доступа по умолчанию public


2️⃣ Отличие интерфейса и абстрактного класса.

В первую очередь стоит сказать - интерфейс мы реализуем, а от абстрактного класса наследуемся

Один класс может реализовывать бесконечное количество интерфейсов, а унаследоваться язык программирования позволяет только от одного класса

Абстрактный класс может хранить в себе логику, могут быть приватные члены


3️⃣ Может ли структура реализовывать интерфейс?

✔️ ДА!


💥 Надеюсь, данная информация была полезной! Не забывайте про обратную реакцию - это лучшая ваша поддержка. А если хотите разбираться лучше в C# - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2🦄1
🔥 Что такое замыкание? Пример с замыканием 🔥


🙂 Всем привет! Скорее всего вы даже не слышали о таком понятии как замыкание. Оно используется в функциональном программировании. Сегодня я попытаюсь простыми словами объяснить эту тему, чтобы в дальнейшем вы не посыпались на этом вопросе во время собеседования на работу мечты

‼️ По сути замыкание состоит из трех элементов:

1️⃣ Пользователь - в нашем случае это метод Main

2️⃣ Внешняя функция - метод GetClouser

3️⃣ Внутренняя функция - анонимная функция внутри внешней функции


📈 Принцип работы

Внешняя функция при вызове возвращает экземпляр внутренней функции

Пользователь сохраняет этот экземпляр в переменную

При каждом вызове этой переменной мы вызываем одну и ту же внутреннюю функцию

Внутренняя функция увеличивает переменную X, которая хранится во внешней функции

Таким образом внутренняя функция запоминает значение X


💥 Заключение
Суть замыкания заключается в том, что происходит изменение переменной внешней функции через вызовы внутренней функции. Мы бы смогли добиться того же самого эффекта, если бы сделали X полем класса. Тогда бы при вызове метода он также увеличивал X на один при каждом вызове. Таким образом замыкание избавляет нас от создания лишнего поля


⚠️ Буду благодарен за обратную реакцию! А если хотите больше информации про фишки нашего любимого языка программирования - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6🦄1
🔥 Что такое делегат? 🔥


🙂 Всем привет! Сегодня мы рассмотрим тему, с которой работал каждый, но не каждый смог понять. В очень редких случаях приходится работать с чистыми делегатами, но для собеседования стоит иметь понимание как это работает

🗣️ Делегат — это тип, который представляет собой ссылку на метод с определенным списком параметров и типом возвращаемого значения🗣️

🕯 При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвращаемого значения

📌 По сути, наша система событий работает на основе делегатов. При подписке на событие мы передаем ссылку на наш метода, а при вызове события вызывается и наш метод

‼️ Пример: [модификатор доступа] delegate [возвращаемый тип] PerformCalculation([аргументы]);

✔️ Если создавая класс - мы создаем новый тип объекта. То создавая делегат - мы создаем новый тип функции. На изображении можно увидеть, что мы создаем экземпляр делегата в параметр new() передаем ссылку на метод. Если мы хоти добавить больше методов, то добавляем через +=. Соответственно если мы хотим убрать ссылку на метод мы используем -=


💥 Заключение
Стоит понимать, что создавая делегат мы создаем новый тип функции. При создании экземпляра - мы добавляем в него любые методы которые подходят по сигнатуре. Сколько методов добавим - столько и активируется при вызове делегата. А если остались вопросы - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2🦄1
🔥 В чем разница между array и List? 🔥


🙂 Всем привет! Достаточно часто встречающийся вопрос на собеседовании. В C# есть несколько коллекций, предназначенных для хранения данных, и две из самых популярных из них — это массивы (Arrays) и списки (Lists). Несмотря на то, что обе структуры данных могут использоваться для хранения коллекций элементов, между ними есть несколько ключевых отличий

1️⃣ Статичность vs Динамичность:

Array: Массив в C# имеет фиксированный размер, который нужно задавать при его создании. После создания массива его размер изменить нельзя. Если необходимо увеличить или уменьшить количество элементов, придется создавать новый массив и копировать в него данные

List: Список (List<t>) является динамической коллекцией. Его размер может изменяться в процессе выполнения программы, что делает его более гибким в работе. Добавление и удаление элементов осуществляется проще и быстрее

2️⃣ Методы и свойства:

Array: У массивов есть ограниченное количество встроенных методов и свойств. Например, они имеют свойство Length, которое показывает количество элементов в массиве

List: Списки имеют обширный набор методов для работы с данными, такие как Add(), Remove(), Sort(), Contains() и другие, что делает работу с коллекциями гораздо более удобной. Кроме того, у списка есть свойство Count, которое возвращает количество элементов в списке


3️⃣ Типизация:

Array: Массив может хранить элементы одного типа. Тип массива определяется при его создании и, следовательно, все элементы должны соответствовать этому типу

List: Список также типизирован, но при этом он более абстрактен. Вы можете использовать генерацию типов (generics), и это позволяет создавать списки любого типа без необходимости указывать конкретный тип при работе с данными

4️⃣ Производительность:

Array: Массивы могут быть более производительными при доступе к элементам, так как они расположены в памяти последовательно. Это позволяет значительно ускорить операции чтения и записи

List: Хотя списки могут быть немного медленнее из-за своей динамической природы и управления памятью, они предлагают лучшую гибкость, особенно при частых изменениях в количестве элементов

💥 Заключение
Выбор между массивом и списком в C# зависит от конкретных потребностей вашего приложения. Если вам нужен фиксированный набор данных и требуется высокая производительность, массив может быть лучшим выбором. Если же вы ожидаете частые изменения в размерах коллекции или необходимость в более простых операциях, таких как добавление и удаление элементов, то список будет более подходящим вариантом. А если остались вопросы - Джун Джуно к вашим услугам!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2🦄1