Game Development | YeaHub
376 subscribers
151 photos
192 videos
530 links
Теория, подготовка к интервью и курсы для Game Dev разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#Собес #assetbundle #manifest #loadasset
🤔 Как организовать использование ассетов в Unity для большого проекта?

💬 Кратко:

Для большого проекта в Unity нужно использовать AssetBundles для организации и загрузки ассетов. Сначала создается манифест для управления зависимостями, затем ассеты группируются в логичные пакеты. Для загрузки можно использовать методы LoadAsset с асинхронной загрузкой. Также важно использовать сжатие для оптимизации.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#Собес #structure #oop #class
🤔 В чем разница между структурой и классом в C#?

💬 Кратко:

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

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#Собес #git_clone
🤔 Что делает Git-клон?

💬 Кратко:

Команда git clone создаёт копию существующего репозитория, включая всю историю изменений, файлы и ветки. Это используется, чтобы начать работу с проектом, который уже находится в удалённом репозитории.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Как проходит типичное техническое собеседование Unity-разработчика

Привет! За свою карьеру я прошёл более 15 собеседований, и сейчас расскажу про наиболее частую структуру.

1. Самопрезентация

После короткого смолтока вас попросят рассказать о себе.
Это не просто формальность - по вашему рассказу формируется первое впечатление.

Расскажите:
• над какими проектами работали
• за что отвечали
• какие задачи решали и чем гордитесь

Совет: запишите рассказ на аудио и послушайте. Поймёт ли человек, который впервые вас видит, чем вы занимались и в чём ваша ценность? Можно отправить запись другу для проверки.

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

2. Технический блок

Здесь проверяют ваши знания по C# и Unity. Список тем зависит от компании, но чаще всего спрашивают:

1. Устройство памяти в C#. Отличия поведения ссылочных и значимых типов.
2. Garbage Collector - что это такое, как работает.
3. Отличия классов и структур. Ограничения структур. Boxing & Unboxing.
4. Коллекции и алгоритмы. Как "под капотом" работают стандартные коллекции, оценка сложности (Big O) операций с этими коллекциями (добавление, удаление, обращение). Могут затронуть популярные алгоритмы сортировки и обхода графа.
5. Асинхронность и многопоточность в C#
6. Блок Unity. Спрашивают что-то из перечисленного: Addressables / Оптимизации / Шейдеры и графический пайплайн / Сборка билда / Клиент-серверное взаимодействие / Unit тесты / Полезный стек - UniTask, Zenject, R3

Подсказка: читайте описание вакансии - по нему можно понять, на чём будет акцент.

3. Вопросы по процессам

В этом блоке собеседующие проверят ваши софт скиллы, используя вопросы о вашем поведении в команде.

Примеры вопросов:
• Как проводите code review?
• Как оцениваете время на выполнение задач?
• Что делаете, если ТЗ неполное?
• Как решаете конфликты?
• Что вас мотивирует в работе?
• Что делаете, если не успеваете в дедлайн?

4. Live-coding

Редкая практика, но бывает - примерно в 1 из 5 собеседований.
Вам дают задачу, вы демонстрируете экран и решаете её в реальном времени.

Примеры задач:
• Алгоритм нахождения матчей на match-3 поле;
• Обход графа;
• Проектирование - например, реализовать инвентарь или отревьюить код.

5. Ваши вопросы

Возможно, это будет неожиданностью - но по этому блоку вас продолжают оценивать.

Необходимо показать, что не просто вы пришли ради денег, а подходите к выбору компании осознанно, настроены на долгосрочное сотрудничество, хотите принести им пользу.

Хорошие вопросы:
• Как проходит онбординг новых сотрудников?
• Как часто проводятся performance review и что учитывается?
• Какие направления развития у компании сейчас в приоритете?
• Есть ли менторство или обмен опытом внутри команды?
• Есть ли единые стандарты кодстайла и архитектуры?
• Как работаете с техдолгом - планово или “по ходу”?
• Используете ли собственные фреймворки / пайплайны?
• По каким метрикам оцениваете успех проекта - доход, удержание, отзывы игроков?
• Какие ближайшие планы на развитие проекта?

🚀 Пост Guru Unity: @Minerope
Please open Telegram to view this post
VIEW IN TELEGRAM
#course #ооп #case
📚 Практический анализ ПО с моделированием на UML

Целью курса является обучение слушателей теоретическим основам объектно-ориентированного подхода, практическим методам визуального проектирования и технологии разработки программного обеспечения с использованием компьютеризированных систем разработки (CASE

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #prefab #instantiation #components
🤔 Что такое префаб в Unity и как бы вы использовали его в реальном проекте?

💬 Кратко:

Prefab в Unity — это сохраненный шаблон игрового объекта, который можно многократно использовать в проекте. Это позволяет создать объект (например, врага с AI, модель, анимации) один раз и повторно использовать его в разных частях игры, что упрощает управление и обновление.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
MV* паттерны в Unity: разложим по полочкам

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

И в этом посте я раскрою этот смысл, чтобы стало понятно зачем использовать эти паттерны, без необходимости запоминать куда стрелочки на схеме смотрят.

Принцип, из которого выросли все MV*

Любой UI или игровой экран можно разложить на три слоя:

1. Бизнес-логика (Model) - хранит и обрабатывает данные.
Пример: здоровье персонажа, инвентарь, внутренняя экономика.

2. Презентация (View) - показывает игроку информацию.
Пример: полоска HP, надписи, окна, анимации.

3. Связующее звено (Controller / Presenter / ViewModel) - решает, когда и что обновить.

Главная идея MV* - разные причины для изменений должны быть в разных местах.

Так, если мы поменяем бизнес-логику, то не придётся изменять код UI.
И наоборот - сменили виджет отображения UI (с текстового поля со значением процентов на полоску здоровья с конкретными значениями) - вся игровая логика здоровья осталась нетронутой.

Пример без разделения:

public class Health : MonoBehaviour
{
[SerializeField] private TMP_Text _text;
[SerializeField] private Image _bar;

private float _hp = 100;

public void TakeDamage(float dmg)
{
_hp -= dmg;
_text.SetText($"{_hp}");
_bar.fillAmount = _hp / 100;
}
}


Пока одна панель - всё ок.
Но потом приходит геймдизайнер и говорит:

“Добавь полоску над персонажем и окно статистики.”


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

Чтобы избежать постоянного переписывания UI кода, необходимо создать:

1. HealthModel, в которой будет находиться бизнес-логика
2. HealthView, который будет заниматься отображением (UI)
3. HealthPresenter, который связывает Model и View. Например, просто слушает события из Model и вызывает методы по обновлению View

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

Посмотреть изменённый код можно тут

Смысл, который стоит запомнить

MV* - паттерн не ради паттерна.
Он необходим, чтобы изолировать причины изменений и отображение изменений.

И когда завтра геймдизайнер захочет 3 разных шкалы HP, ты просто подключишь новые View — без изменения логики HP и переписывания старого кода View.

🚀 Пост Guru Unity: @Minerope
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
#Собес #mvc #cpp #csharp

🤔 Senior Game разработчик в RedRift

Техническое собеседование. Вилка: 3000$-4000$. Были классические вопросы по работе в команде, оптимизациям, Addressables, архитектуре.

💬 Вопросы:

- Какие отличия между C++ и C# бросаются в глаза?

- Где применим паттерн MVC (или MV-паттерны в целом)?

- Если MonoBehaviour удалён, но ассет через Addressables не выгружен — что произойдёт?

- Если использовать Addressables, как выгрузить ассет из памяти?

- В какой момент в Addressables ассеты выгружаются из памяти?

👉 Все вопросы из этого собеседования (16)

📣 Хочешь больше собесов?
Подпишись на наш главный канал
1
#Собес #application_layer #mail_services #file_transfer
🤔 Назовите некоторые службы, предоставляемые прикладным уровнем в интернет-модели.

💬 Кратко:

Прикладной уровень предоставляет такие службы, как электронная почта (SMTP), передача файлов (FTP), управление доступом (SSH) и сетевой виртуальный терминал (Telnet).

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#podcast #всё
📚 Подкасты Y_LAB

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

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #unity #addressables #memory_management
🤔 Если использовать Addressables, как выгрузить ассет из памяти?

💬 Кратко:

Для выгрузки ассета используйте Addressables.Release(handle) или Addressables.ReleaseInstance(gameObject). Для полной очистки кэша используйте CleanBundleCache. Выгрузка происходит не мгновенно, а при следующей сборке мусора.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Структура кадра в Unity и почему это важно

Сегодня разберём благодаря каким операциям мы получаем картинку в юнити, что такое Performance Bottleneck и как эти знания помогут оптимизировать вашу игру.

Что такое кадр и как он формируется

Наверняка, каждый знаком с понятием FPS.
Если игра работает на 60 FPS - это 60 циклов формирования кадра в секунду.

Каждый кадр - это последовательность операций, где участвуют:
• CPU - выполняет код Unity и ваш код, готовит геометрию кадра.
• GPU - получает подготовленные данные и рендерит финальное изображение.

Загвоздка - CPU и GPU не могут работать параллельно

GPU не может начать раскрашивать картинку, геометрия которой ещё не подготовлена от CPU. И наоборот - CPU не может начать работать над следующим кадром, пока GPU не раскрасила прошлый.

Это видно на приложенной схеме - у CPU присутствует блок "Wait", так как GPU ещё занимается прошлым кадром. В это время CPU просто простаивает.

Такая ситуация называется Performance Bottleneck

Performance bottleneck - это компонент (CPU или GPU), который ограничивает FPS. У нас есть "затык" в одном из компонентов.

Неопытный разработчик захочет оптимизировать игру, не разберётся в "затыке" производительности и пойдёт оптимизировать CPU (код или геометрию сцены).
Если bottleneck в GPU - весь эффект оптимизаций будет в увеличении ожидания от CPU.

• Было: CPU — 10 мс работы + 10 мс ожидания GPU.
• Стало: CPU — 8 мс работы + 12 мс ожидания GPU.

CPU стал работать быстрее, но FPS не вырос, потому что настоящая проблема - GPU.
Если оптимизировать не тот компонент, результат будет нулевым.

Зачем это знать

Перед любыми оптимизациями нужно определить:

• упираетесь вы в CPU или в GPU,
• какое именно место внутри них тормозит: логика, физика, UI, рендер, память.

Так вы сможете реально оптимизировать свою игру и не терять время зря.

В следующих постах от Guru разберём работу с Profiler и научимся определять Performance Bottleneck

🚀 Пост Guru Unity: @Minerope
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🏆2
#Собес #c++ #object-oriented #oop
🤔 Что такое C++?

💬 Кратко:

C++ — это мощный императивный язык программирования общего назначения, разработанный как расширение языка C. Он поддерживает объектно-ориентированное программирование, шаблоны и другие дополнительные функции. C++ используется для разработки различных приложений, включая операционные системы, игры и высокопроизводительное ПО.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #git_commit
🤔 Что делает команда git commit?

💬 Кратко:

Команда git commit сохраняет изменения из индекса в историю репозитория. Она фиксирует текущий прогресс, позволяя вернуться к этой точке в будущем. Каждый коммит сопровождается описанием, которое помогает понять, что было сделано.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#tool #графы
📚 Терялся в собственном коде?

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

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #linq #query #ienumerable
🤔 Что такое LINQ в C#?

💬 Кратко:

LINQ (Language Integrated Query) — это встроенный в C# инструмент для удобного запроса данных. Он позволяет работать с коллекциями, базами данных, XML и другими источниками с использованием SQL-подобного синтаксиса.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Как пользоваться Unity Profiler, чтобы реально оптимизировать игру

Привет! Сегодня разбираем инструмент, которого не должен бояться Unity разработчик — Unity Profiler. Если ты всё ещё смотришь на лаги через FPS - этот пост для тебя

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

1. Главное правило профилирования - профилировать на целевом устройстве

В Editor режиме профайлер врёт. Он профайлит сам себя - таким образом попадает лишняя информация.
Если игра на мобильные устройства - собирай проект на мобильное устройство и профилируй там.
Запускай Build на устройство с опцией Development Build и Autoconnect Profiler → Profiler запустится сам → смотри реальную картину.

2. Определяем что тормозит

Вспоминаем прошлый пост - мы не хотим терять время и оптимизировать то, что не нужно.

Переходишь в Profiler → Timeline и смотришь на две строки:

• CPU — пользовательский код, работа движка, события UI, GC
• GPU — рендер, шейдеры, batching, пост-процессинг

Если CPU забит - исправляем тяжёлые функции, GC.
Если GPU забит - смотрим рендеринг - draw calls, overdraw, тяжёлые шейдеры.

3. Разворачиваем стек вызовов

Поставив полоску Timeline'а на любое место - снизу будут выведен весь стек вызова функций в конкретном кадре.
Так, мы можем посмотреть какие из функций были тяжёлыми, и оптимизировать их.

Тут многих ждёт ловушка: профайлер показывает странные функии движка вроде:

• Gfx.WaitForPresent
• WaitForTargetFPS
• WaitForLastPresentation
• Semaphore.WaitForSignal

Это не значит что эти функции надо оптимизировать.

Например, Gfx.WaitForPresent - это момент, когда CPU ждёт GPU.
Что-то вроде: "Графическая подсистема не готова принять следующий кадр - подожди"

И это значит, что твой bottleneck - GPU и оптимизировать надо его.

Описание всех подобных функций можно найти в документации.

4. Используй Deep Profile

Этот пункт будет показывать все вызовы функций, до самых глубоких функций движка.
Данных получается больше - видно абсолютно всё.

Минусы - из-за большого количества данных труднее ориентироваться и сильно нагружает устройство. Лагать игра на устройстве в таком режиме будет сильно.

Правило простое - если не получается понять проблему без режима Deep Profile - то включай.

5. Используй маркеры

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

ProfilerMarker marker = new ProfilerMarker("MyMethod");

void Update()
{
marker.Begin();

// твой код

marker.End();
}


Таким образом, в профайлере будет виден вызов "MyMethod" на выделенный маркером промежуток

6. Итог - план оптимизации

Мой порядок действий:

1. Собрать приложение на целевое устройство
2. Развернуть стек вызовов в проблемном месте
3. Определить CPU или GPU bottleneck
4. Отделить системный код от своего
5. Исправить → снова прогнать → сравнить

🚀 Пост Guru Unity: @Minerope
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
#Собес #csharp #delegate #unity

🤔 Senior Game разработчик в компанию Awem Games

Техническое собеседование. Весна 2024. Большое количество вопросов по процессам, работе в команде, опыту.

💬 Вопросы:

- В чем разница между структурой и классом в C++?

- Когда уместно вместо Addressables использовать свою реализацию?

- Расскажи про использование async await.

- Как подойти к выбору коллекции для задачи? Как учитывать алгоритмическую сложность при выборе?

- Что такое ивенты в C#?

👉 Все вопросы из этого собеседования (27)

📣 Хочешь больше собесов?
Подпишись на наш главный канал
#Собес #git_revert
🤔 Когда вы используете git revert?

💬 Кратко:

git revert используется для создания нового коммита, который отменяет изменения, сделанные в предыдущем коммите. Эта команда полезна, когда нужно откатить изменения без изменения истории репозитория.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#repository #godotengine
📚 Godot Engine

Официальный исходный код открытого кросс‑платформенного игрового движка Godot. Это полноценная среда для разработки 2D‑ и 3D‑игр, включающая редактор, скриптовый язык GDScript (похожий на Python), систему сцен и узлов, инструменты анимации, физику и рендеринг. Репозиторий содержит всю кодовую базу движка, документацию, примеры, а также систему отслеживания задач и обсуждений. Подходит как для изучения архитектуры движка, так и для внесения собственных изменений, создания плагинов или сборки кастомных версий.

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #actor #unreal_engine
🤔 Напишите функцию на C++ для применения урона актеру при столкновении с другим актером.

💬 Кратко:

Для применения урона актеру при столкновении с другим актером используйте событие OnActorHit для обнаружения столкновений и вызовите функцию TakeDamage на затронутом актере, передав параметры урона.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
🔥3