Unity-разработчик (Senior)

Курс предназначен для профессионалов. Вы освоите продвинутую архитектуру проектов, работу с ECS/DOTS, глубокое понимание графики, шейдеров, многопользовательские сети, создание инструментов редактора, оптимизацию под мобильные и консольные платформы, CI/CD и управление большими проектами.

Описание программы

Курс «Unity-разработчик (Senior)» предназначен для опытных разработчиков, уже уверенно владеющих инструментами Unity и C#.
Обучение направлено на профессиональное проектирование архитектуры , работу с DOTS , сетевыми системами уровня AAA , оптимизацией под консоли и мобильные устройства , созданием кастомных редакторских расширений и глубокое понимание внутренних механизмов движка.
Программа включает проекты, приближенные к промышленным стандартам, и учит работе в условиях масштабируемости, производительности и командной разработки.

 

Что предстоит пройти на курсе

Модуль 1: Архитектурные паттерны и дизайн-система
  • Продвинутые паттерны: Strategy, State, Command, Observer, Mediator, Visitor
  • Реализация собственной системы событий и сообщений
  • Понятие чистой архитектуры, разделение слоёв: Domain / Application / Infrastructure
  • Применение Dependency Injection через Zenject
  • Создание и использование Service Locator, Repository Pattern, Entity Component System
 
Модуль 2: DOTS — Data-Oriented Tech Stack
  • Введение в ECS (Entity Component System), Job System, Burst
  • Работа с NativeContainer (NativeArray, NativeList, UnsafeList)
  • Использование IJobForEach, Entities.ForEach, ParallelFor
  • Перепись существующих игровых систем на DOTS
  • Сетевые системы на основе Netcode for GameObjects + DOTS
  • Hybrid Renderer — миграция проекта поэтапно
 
Модуль 3: Графика и шейдеры
  • Основы Shader Graph, VFX Graph
  • Написание HLSL-шейдеров
  • Управление материалами и шейдерами в коде
  • Продвинутая работа с URP/HDRP
  • Оптимизация отрисовки: Draw Call Batching, LOD, GPU Instancing
  • Работа с Compute Shaders
 
Модуль 4: Многопоточность и производительность
  • Асинхронная загрузка данных
  • Полный цикл работы с потоками: Thread, async/await, Task.Run
  • Использование Concurrent Collections
  • Профилирование и оптимизация через Unity Profiler, Memory Profiler
  • Продвинутое использование Garbage Collector, избежание выделения памяти
  • Знакомство с Unity Jobs и Burst Compiler
 
Модуль 5: Сетевые системы уровня Senior
  • Разработка многопользовательских игр на Netcode for GameObjects
  • Синхронизация состояний, объектов, событий
  • Серверные хостинг, Dedicated Server, NAT Punchthrough
  • Работа с Relay, Matchmaking
  • Система голосового чата, репликации объектов
  • Использование Netcode Transport, реализация своих транспортных решений
 
Модуль 6: Искусственный интеллект и поведение ИИ
  • Реализация Behaviour Tree и Utility AI
  • Поведение ИИ с использованием NavMesh, A*, Pathfinding
  • Интеграция машинного обучения: ML-Agents
  • Планировщик действий (GOAP)
  • Динамическое поведение ИИ, обучаемые алгоритмы
 
Модуль 7: Редакторские расширения и автоматизация
  • Создание пользовательских окон, инспекторов, меню
  • Работа с ScriptableWizard, PropertyDrawer, CustomEditor
  • Расширение Unity Editor через Editor Coroutines и IMGUI
  • Автоматизация билдов и тестирования
  • Создание плагинов, работающих в редакторе и на платформах
 
Модуль 8: CI/CD и DevOps
  • Настройка автоматических сборок через Unity Cloud Build или Jenkins
  • Интеграция GitLab/GitHub Actions
  • Автоматическое тестирование: Unit, Integration, UI Test
  • Логирование и мониторинг стабильности
  • Подготовка билдов под Android, iOS, PC, консоли
 
Модуль 9: Работа с большими проектами
  • Управление большим количеством ассетов и префабов
  • Версионирование и управление зависимостями
  • Использование Addressables, AssetBundles
  • Сборка и распространение модульных частей игры
  • Организация крупных проектов: Module-based подход
 
Модуль 10: Геймплейное программирование
  • Реализация сложных игровых механик: паркур, физические взаимодействия, динамическая генерация контента
  • Сложные системы: инвентарь, диалоговая система, квесты
  • Сохранение прогресса: сериализация, бинарные файлы, JSON, сохранения в облаке
  • Тестирование игровых систем: Mock, Stub, In-editor simulation
 
Модуль 11: Физика и симуляции
  • Продвинутый уровень работы с физическим движком Unity
  • Собственные детекторы столкновений и триггеров
  • Работа с Physics Layers, Layer Collision Matrix
  • Создание физически точных систем: симуляции, механика движения
  • Интеграция Havok Physics в Unity
 
Модуль 12: Масштабируемость и долгосрочные проекты
  • Управление техническим долгом
  • Документирование кода и API
  • Code Review, Refactoring, Best Practices
  • Работа с Legacy-кодом
  • Создание и внедрение собственных стандартов и правил кодирования
 
Финальный проект

Разработка многопользовательской 3D-игры с полной сетевой синхронизацией, ИИ, системой предметов и оптимизацией под целевые платформы.
В рамках проекта:

  • Вы будете использовать ECS и Netcode
  • Реализуете продвинутый интерфейс
  • Создадите собственные инструменты редактора
  • Оптимизируете игру под мобильные и консольные версии
 

Ожидаемые результаты после прохождения курса

Должен знать:
  • Продвинутые паттерны проектирования и их применение
  • Как работают системы Unity на низком уровне (ECS, Job System, Burst, DOTS)
  • Принципы масштабируемости и долгосрочной поддержки проектов
  • Особенности работы с графикой: шейдеры, HDRP, GPU Instancing
  • Как организовать CI/CD и автоматизировать процессы
  • Как работает физический движок и как его расширить
  • Как проектировать игровые системы с учётом тестирования и расширяемости
  • Как использовать Machine Learning в игровом ИИ
 
Должен уметь:
  • Проектировать и строить архитектуру крупных проектов
  • Реализовывать высокопроизводительную логику на базе DOTS
  • Писать и оптимизировать шейдеры
  • Создавать собственные редакторские инструменты и расширения
  • Оптимизировать игру под любую платформу
  • Разрабатывать многопользовательские игровые системы
  • Проводить рефакторинг и улучшение Legacy-проектов
  • Автоматизировать билды и тестирование
  • Управлять командой и процессом разработки
 
Дополнительно:
  • Умеет читать и анализировать данные из Profiler'а
  • Знает, как минимизировать GC и нагрузку на CPU
  • Может написать собственный Job System или расширить существующий
  • Умеет работать с IL2CPP и Native Code
  • Может спроектировать систему, которую легко масштабировать и тестировать
 

Формат обучения

Практико-ориентированный курс с акцентом на реальные задачи. Обучение включает:

  • Лекции по архитектуре и производительности
  • Групповые проекты с жёсткими требованиями
  • Code Review между студентами
  • Разработка под конкретные платформы (Android, iOS, PS5/Xbox/PC)
  • Использование современных инструментов (Git, CI/CD, Unity Hub, Addressables, Netcode, DOTS)
  1. Что такое чистая архитектура и как она применяется в Unity-проектах?
    Чистая архитектура — это подход, при котором слои приложения разделены: бизнес-логика изолирована от фреймворков, UI и баз данных. В Unity используется для отделения игровой логики от MonoBehaviour, что позволяет создавать тестируемые, легко поддерживаемые и масштабируемые системы.

  2. Какие основные паттерны проектирования используются в крупных Unity-проектах и почему?
    Основные паттерны: Strategy (для поведения), State (для смены состояния объектов), Command (для отката действий), Observer (для событийной модели), Mediator (для управления связями). Используются для упрощения взаимодействия между компонентами и снижения связанности кода.

  3. Что такое Dependency Injection и как он реализуется в Unity?
    DI — это принцип внедрения зависимостей, позволяющий объектам получать зависимости извне, а не создавать их самостоятельно. В Unity DI может быть реализован через Zenject или ручное внедрение через инспектор или Composite Root.

  4. Что такое ECS и какие преимущества он даёт по сравнению с ООП?
    ECS (Entity Component System) — это подход к разработке, ориентированный на данные, а не на объекты. Он позволяет эффективно использовать CPU-кэши, параллельную обработку и снижает нагрузку на GC. Предназначен для высокопроизводительных систем, особенно при работе с тысячами объектов.

  5. Как работает Job System и какие ограничения он имеет?
    Job System — это система Unity для выполнения задач в отдельных потоках. Ограничения: запрещено использование Unity API, необходимо использовать NativeContainer, требуется осторожность с безопасностью памяти и временными ссылками.

  6. Что такое Burst Compiler и как он влияет на производительность?
    Burst — это компилятор, который оптимизирует C#-код, написанный для Job System, до высокоэффективного машинного кода. Он использует SIMD-инструкции, минимизирует overhead и значительно увеличивает производительность вычислений.

  7. Что такое Hybrid Renderer и зачем он нужен?
    Hybrid Renderer — это мост между классическим режимом работы Unity и DOTS. Позволяет использовать преимущества DOTS без полного перевода проекта на ECS. Полезен при постепенной миграции или совместном использовании систем.

  8. Что такое Netcode for GameObjects и чем он отличается от Mirror?
    Netcode for GameObjects — официальная сетевая система от Unity, более простая в освоении и лучше интегрированная в движок. В отличие от Mirror, он предлагает меньше гибкости, но стабильнее и быстрее внедряется в новые проекты.

  9. Что такое NetworkVariable и как он обеспечивает синхронизацию данных?
    NetworkVariable — переменная, синхронизируемая между клиентом и сервером. Изменяется на сервере, клиенты автоматически получают обновления. Поддерживает события OnValueChanged для реакции на изменения.

  10. Что такое ServerRpc и ClientRpc и как они работают в сетевой системе?
    ServerRpc — вызывается на клиенте, исполняется на сервере. ClientRpc — вызывается на сервере, исполняется на клиентах. Обеспечивают двустороннюю коммуникацию и синхронизацию действий.

  11. Что такое NavMesh и как его использовать для продвинутого ИИ?
    NavMesh — это представление поверхности, по которой может двигаться ИИ. Создаётся через Bake, после чего ИИ использует NavMeshAgent для автономного движения, обхода препятствий и построения пути.

  12. Что такое Behaviour Tree и как его реализовать в Unity?
    Behaviour Tree — способ организации поведения ИИ в виде дерева условий и действий. Реализуется через собственные классы или сторонние плагины. Позволяет создавать сложное поведение с ветвлениями и условиями.

  13. Что такое Utility AI и как он сравнивается с FSM?
    Utility AI — это модель принятия решений ИИ на основе оценки возможных действий. По сравнению с FSM, он более гибкий, позволяет ИИ принимать "наилучшие" решения, а не просто переходить между состояниями.

  14. Что такое GOAP и как его применять в игровых системах?
    GOAP (Goal-Oriented Action Planning) — алгоритм, позволяющий ИИ строить последовательность действий для достижения цели. Применяется в играх с интеллектуальными агентами, где требуется адаптивное поведение.

  15. Что такое ScriptableObject и как его использовать для хранения состояний игры?
    ScriptableObject — это ассет, хранящий данные вне сцен. Может использоваться для хранения игровых состояний, предметов, конфигураций и других данных, которые нужно изменять независимо от GameObject.

  16. Что такое Addressables и как управлять зависимостями между ассетами?
    Addressables позволяют загружать ассеты по имени или метке, автоматически обрабатывая зависимости. Управление зависимостями осуществляется через Addressables Groups и анализ графа зависимостей.

  17. Что такое Profiler и какие основные разделы он предоставляет?
    Profiler — инструмент диагностики производительности. Основные разделы: CPU Usage, GPU Usage, Memory, Rendering, Audio, Physics. Позволяет находить узкие места и оптимизировать игру под целевые платформы.

  18. Что такое Garbage Collector и как минимизировать его влияние в Unity?
    Garbage Collector освобождает память от неиспользуемых объектов. Чтобы минимизировать паузы, стоит избегать частого выделения памяти (например, новых объектов в Update()), использовать pooling и NativeContainer в Job System.

  19. Что такое DOTween и как его использовать в проектах уровня Senior?
    DOTween — популярная библиотека для создания анимаций и движений. В Senior-проектах используется для временных эффектов, интерфейсов, экранов загрузки и UI-анимаций. Поддерживает корутины, async/await и события.

  20. Что такое IL2CPP и какие ограничения он накладывает на C#-код?
    IL2CPP — это технология компиляции .NET-кода в нативный код. Ограничения: не поддерживает полный Reflection, некоторые возможности C# (dynamic), может увеличивать время сборки. Требует аккуратной работы с типами и сериализацией.

  21. Что такое Script Execution Order и как им управлять?
    Script Execution Order — настройка, которая определяет порядок выполнения методов скриптов. Управляется через Edit → Project Settings → Script Execution Order. Полезно, если важен порядок выполнения логики.

  22. Что такое LayerMask и как его использовать в физике?
    LayerMask — это маска, указывающая, какие слои будут учитываться в запросах. Например, Physics.Raycast(ray, out hit, mask) — будет учитывать только объекты из указанных слоёв.

  23. Что такое Timeline и как его использовать для реализации кат-сцен?
    Timeline — это инструмент для создания временных последовательностей: анимации, звуки, события. Используется через Window → Timeline, создание Playable Director и добавление Track’ов (анимации, сигналы, эффекты).

  24. Что такое Signal System и как его использовать в Timeline?
    Signal System — часть Timeline, позволяющая отправлять события другим объектам. Например, при проигрывании сигнала можно запустить анимацию или активировать ловушку.

  25. Что такое UnityWebRequest и как его использовать для сетевых запросов?
    UnityWebRequest — система, позволяющая выполнять HTTP-запросы. Используется для получения данных с сервера, загрузки изображений, общения с API. Может работать с coroutine, async/await и CancellationToken.

  26. Что такое NetworkObject и как он связан с ECS?
    NetworkObject — это компонент, отмечающий объект как сетевой. Не может быть использован с ECS напрямую. Для сетевой синхронизации в ECS требуются специальные адаптеры и Netcode + DOTS-библиотеки.

  27. Что такое NetworkSceneManager и как он синхронизирует загрузку сцен?
    NetworkSceneManager — часть Netcode for GameObjects, которая синхронизирует загрузку сцен между клиентом и сервером. Когда один из них загружает сцену, остальные тоже переключаются на неё.

  28. Что такое NetworkTransform и как он обеспечивает синхронизацию позиции объекта?
    NetworkTransform — компонент, который синхронизирует позицию, поворот и масштаб объекта между клиентами. Работает через интерполяцию и экстраполяцию, чтобы сделать движение плавным.

  29. Что такое NetworkManager и как он управляет сетевой игрой?
    NetworkManager — центральный компонент для настройки и запуска сетевой игры. Управляет подключением, спавном игроков, синхронизацией и загрузкой сцен.

  30. Что такое NetworkObject.Spawn() и NetworkObject.Despawn()?
    Spawn — создаёт объект на сервере и синхронизирует его на всех клиентах. Despawn — удаляет объект из сети. Выполняются через методы NetworkObject.Spawn() и NetworkObject.Despawn(), и обеспечивают сетевую синхронизацию.

  31. Что такое Custom Editor и как его создать в Unity?
    Custom Editor — пользовательский интерфейс для редактирования скрипта в инспекторе. Создаётся через класс с атрибутом [CustomEditor(typeof(YourClass))] и наследованием от Editor. Полезен для удобного конфигурирования.

  32. Что такое Composite Root и как он связан с принципами хорошей архитектуры?
    Composite Root — точка, где создаются и соединяются все зависимости. Позволяет избежать глобальных точек доступа и повысить тестируемость. Реализуется через MonoBehaviour, где внедряются зависимости вручную.

  33. Что такое A* и как его использовать в Unity?
    A* — алгоритм поиска пути, часто используется в ИИ. В Unity реализуется через NavMesh + NavMeshAgent, либо через сторонние решения (A* Pathfinding Project). Позволяет ИИ находить оптимальный путь к цели.

  34. Что такое Timeline и какие основные элементы он поддерживает?
    Timeline — инструмент для создания временных последовательностей. Поддерживает Track’и: Animation, Audio, Signal, Activation, Control и другие. Используется для кат-сцен, событий и динамического контента.

  35. Что такое RenderTexture и как её использовать?
    RenderTexture — текстура, в которую можно рендерить камеру. Используется для отображения видеозаписи, миникарты, камер шпионки и других динамических текстур.

  36. Что такое LOD (Level of Detail) и как он помогает в оптимизации графики?
    LOD — система, позволяющая менять уровень детализации модели в зависимости от расстояния. Используется через LODGroup и нескольких мешей с разной сложностью. Снижает нагрузку на GPU на дальних объектах.

  37. Что такое Cinemachine и как он улучшает работу с камерой?
    Cinemachine — система Unity для создания динамических камер. Предоставляет Smart Camera, Virtual Camera, Impulse и другие инструменты. Упрощает создание трясущихся камер, следящих за игроком, с эффектами.

  38. Что такое Sprite Atlas и как он помогает в оптимизации графики?
    Sprite Atlas — текстура, объединяющая несколько спрайтов в одну. Уменьшает количество draw call’ов и ускоряет отрисовку. Настроен через Sprite Atlas Window, где добавляются спрайты, затем используется вместо отдельных текстур.

  39. Что такое Time.captureFramerate и в каких случаях он применяется?
    Time.captureFramerate — свойство, которое фиксирует частоту кадров. Например, установка значения 30 заставит игру обновляться с такой скоростью, даже если аппаратная поддержка выше. Полезно при записи видео или тестировании производительности.

  40. Что такое Behaviour Tree и как он помогает в создании сложного поведения ИИ?
    Behaviour Tree — способ организации поведения ИИ в виде дерева условий и действий. Позволяет строить сложное поведение с ветвлениями и условиями. Часто реализуется через плагины или собственные классы.

  41. Что такое NetworkBehaviour и как он отличается от MonoBehaviour?
    NetworkBehaviour — базовый класс для объектов, участвующих в сетевой игре (в Netcode for GameObjects). Отличается наличием сетевых методов: Rpc, ServerRpc, OnNetworkSpawn и другими.

  42. Что такое RPC и как он работает в сетевой игре?
    RPC (Remote Procedure Call) — метод, который вызывается на одном устройстве, но исполняется на других. В Netcode for GameObjects вызывается через ServerRpc, ClientRpc. Используется для синхронизации действий между клиентом и сервером.

  43. Что такое NativeArray и почему он эффективен?
    NativeArray — структура данных из Unity.Collections, выделяющая память вне управляемого пула .NET. Это делает её быстрее, так как не участвует в работе GC. Используется совместно с Job System.

  44. Что такое UnityWebRequest и как его использовать для сетевых запросов?
    UnityWebRequest — система для выполнения HTTP-запросов. Используется для получения данных с сервера, загрузки изображений, общения с API. Может работать с coroutine, async/await и CancellationToken.

  45. Что такое NetworkVariable и как он синхронизируется между клиентом и сервером?
    NetworkVariable — переменная, синхронизируемая между клиентами. Изменяется на сервере, клиент получает обновления. Поддерживает события OnValueChanged для реакции на изменения.

  46. Что такое NetworkSceneManager и как он синхронизирует загрузку сцен?
    NetworkSceneManager — часть Netcode for GameObjects, которая синхронизирует загрузку сцен между клиентом и сервером. Когда один из них загружает сцену, остальные тоже переключаются на неё.

  47. Что такое NetworkTransform и как он связан с ECS?
    NetworkTransform — компонент, синхронизирующий позицию и поворот объекта в сети. Не может быть использован в ECS напрямую. Для работы с DOTS требуется реализация собственной системы синхронизации.

  48. Что такое IJob и как его использовать?
    IJob — интерфейс, используемый в Job System. Позволяет выполнять задачи в отдельном потоке. Используется с NativeArray и JobHandle. Полезно для обработки большого количества данных без блокировки основного потока.

  49. Что такое NativeContainer и зачем он нужен?
    NativeContainer — тип, поддерживающий работу с нативной памятью и совместимый с Job System. Например, NativeArray, NativeList. Позволяет избежать работы GC и обеспечить безопасный доступ из потоков.

  50. Что такое Burst и как его использовать с Job System?
    Burst — компилятор, который оптимизирует код Job System до уровня SIMD и других процессорных возможностей. Используется с атрибутом [BurstCompile] над структурой, реализующей IJob.

  51. Что такое UI Toolkit и чем он отличается от UGUI?
    UI Toolkit — новая система интерфейса от Unity, основанная на UXML и USS. Более декларативная, похожа на HTML/CSS. Подходит для сложных динамических интерфейсов и расширяемых редакторских инструментов.

  52. Что такое UI Builder и как его использовать?
    UI Builder — визуальный редактор для работы с UI Toolkit. Позволяет создавать интерфейсы через WYSIWYG-подход. Полезен при создании сложных UI-панелей, окон редактора, динамических интерфейсов.

  53. Что такое Shader Graph и как его использовать в HDRP/URP?
    Shader Graph — визуальный редактор шейдеров в Unity. Используется для создания шейдеров без знания HLSL. Интегрирован в URP и HDRP, позволяет создавать материалы с различными эффектами.

  54. Что такое Compute Shader и как его использовать?
    Compute Shader — шейдер, выполняющий вычисления на GPU. Используется для физики частиц, постобработки, симуляций. В Unity вызывается через ComputeShader.Dispatch(), работа ведётся с буферами и группами потоков.

  55. Что такое Raycast 2D и какие виды есть в Unity?
    Raycast 2D — луч, проверяющий столкновения в 2D-пространстве. Виды: Physics2D.Raycast, Physics2D.BoxCast, CircleCast. Используются для обнаружения препятствий, прыжков, стрельбы и ИИ.

  56. Что такое IL2CPP и какие ограничения он имеет?
    IL2CPP — технология компиляции .NET-кода в нативный код. Требует внимательного управления памятью, не поддерживает все возможности Reflection и динамические типы. Используется для мобильных и консольных платформ.

  57. Что такое Memory Profiler и как он помогает в оптимизации?
    Memory Profiler — инструмент Unity для анализа использования памяти. Показывает, где выделяется память, какие объекты остаются в памяти. Полезен для выявления утечек и минимизации GC.

  58. Что такое Garbage Collection и как минимизировать его влияние?
    GC (сборщик мусора) — механизм очистки неиспользуемой памяти. Чтобы минимизировать паузы, следует избегать частого создания временных объектов, использовать pooling и NativeContainer.

  59. Что такое Compute Shaders и как их использовать в Unity?
    Compute Shaders — шейдеры, предназначенные для выполнения произвольных вычислений на GPU. Используются для симуляций, постобработки, физики и других задач, где требуется параллелизм.

  60. Что такое SRP и чем отличаются URP, HDRP и DOTS Rasterization?
    SRP — Scriptable Render Pipeline, позволяет кастомизировать этапы рендера. URP — легковесный, HDRP — для высокой графики, DOTS Rasterization — экспериментальная система, работающая с ECS и обеспечивающая высокую производительность.

  61. Что такое Entity и как он связан с ECS?
    Entity — это легковесный объект в ECS, представляющий игровой объект. Не содержит логики, только данные (через компоненты). Логика реализуется через системы (System), работающие с группами Entity.

  62. Что такое IJobForEach и как его использовать?
    IJobForEach — структура, позволяющая параллельно обрабатывать группы Entity. Часть Entities API, используется в Jobs для массовых вычислений без блокировки основного потока.

  63. Что такое SharedComponentData и как он отличается от ComponentData?
    SharedComponentData — данные, общие для множества Entity. Может иметь значение, доступное всем. ComponentData — данные, уникальные для каждого Entity. Используется для хранения информации, которая меняется часто.

  64. Что такое Buffer и как его использовать в ECS?
    DynamicBuffer — коллекция, позволяющая хранить список значений внутри Entity. Используется для динамических данных, таких как очередь команд, история перемещений, путь ИИ и другие.

  65. Что такое EntityCommandBuffer и как он работает?
    EntityCommandBuffer — буфер команд, который накапливает изменения в ECS-системе и применяет их в конце кадра. Используется, чтобы избежать проблем с чтением и записью во время выполнения Job'ов.

  66. Что такое Ghost и как он используется в сетевой синхронизации?
    Ghost — это объект, который передаёт своё состояние между клиентами. Используется в Netcode for GameObjects + DOTS для синхронизации состояний ИИ, игроков и других объектов.

  67. Что такое NetworkStreamRequest и как он используется в DOTS?
    NetworkStreamRequest — часть DOTS Netcode, позволяет отправлять и принимать данные на уровне потоков. Используется для создания собственных протоколов синхронизации, когда стандартные средства недостаточны.

  68. Что такое NetworkState и как он синхронизирует данные в DOTS?
    NetworkState — часть DOTS Netcode, отвечает за синхронизацию состояния объекта. Хранит данные, которые должны быть синхронизированы между клиентами и сервером.

  69. Что такое NetworkBehaviour и как он отличается от ISystem?
    NetworkBehaviour — класс, наследующий MonoBehaviour, используемый в старых сетевых системах. ISystem — часть ECS, управляющая данными Entity. Системы могут быть настроены на синхронизацию через DOTS Netcode.

  70. Что такое NetworkSceneManager и как он синхронизирует загрузку сцен?
    NetworkSceneManager — часть Netcode for GameObjects, которая синхронизирует загрузку сцен между клиентом и сервером. Когда один из них загружает сцену, остальные тоже переключаются на неё.

  71. Что такое NetworkObject и как он связан с ECS?
    NetworkObject — компонент, отмечающий объект как сетевой. Не может быть использован с ECS напрямую. Для сетевой синхронизации в DOTS требуется реализация собственной системы через NetworkState и Ghost.

  72. Что такое NetworkVariable и как он работает?
    NetworkVariable — переменная, синхронизируемая между клиентами. Изменяется на сервере, клиент получает обновления. Поддерживает события OnValueChanged для реакции на изменения.

  73. Что такое RPC и как его использовать в Netcode for GameObjects?
    RPC (Remote Procedure Call) — метод, который вызывается на одном устройстве, но исполняется на других. В Netcode for GameObjects вызывается через ServerRpc, ClientRpc. Используется для синхронизации действий между клиентом и сервером.

  74. Что такое NetworkTransform и как он синхронизирует позицию объекта?
    NetworkTransform — компонент, который синхронизирует позицию, поворот и масштаб объекта в сети. Работает через интерполяцию и экстраполяцию. Используется в одиночных и сетевых проектах.

  75. Что такое NetworkObject.Spawn и NetworkObject.Despawn?
    Spawn — создаёт объект на сервере и синхронизирует его на клиентах. Despawn — удаляет объект из сети. Выполняются через методы NetworkObject.Spawn() и NetworkObject.Despawn().

  1. Какой паттерн проектирования используется для создания единого экземпляра класса с глобальной точкой доступа?
    A) Factory
    B) Observer
    C) Singleton
    D) Strategy
    Правильный ответ: C) Singleton

  2. Что такое ScriptableObject и какое его основное преимущество?
    A) Объект, который можно изменять во время выполнения игры
    B) Данные вне сцены, хранящие информацию без зависимости от GameObject
    C) Класс, наследующий MonoBehaviour
    D) Система управления сценами
    Правильный ответ: B) Данные вне сцены, хранящие информацию без зависимости от GameObject

  3. Какой компонент необходим для работы UI в Unity?
    A) CanvasScaler
    B) EventSystem
    C) GraphicRaycaster
    D) CanvasGroup
    Правильный ответ: B) EventSystem

  4. Какой метод вызывается при завершении корутины?
    A) StopCoroutine()
    B) CancelCoroutine()
    C) EndCoroutine()
    D) FinishCoroutine()
    Правильный ответ: A) StopCoroutine()

  5. Какой параметр в Animator позволяет однократно активировать переход между анимациями?
    A) Bool
    B) Trigger
    C) Float
    D) Int
    Правильный ответ: B) Trigger

  6. Что означает ключевое слово async в C#?
    A) Метод выполняется в потоке
    B) Метод может содержать await и выполняться асинхронно
    C) Метод завершается мгновенно
    D) Метод не блокирует интерфейс
    Правильный ответ: B) Метод может содержать await и выполняться асинхронно

  7. Для чего используется Addressables?
    A) Для автоматического сохранения данных
    B) Для динамической загрузки ресурсов по сети или локально
    C) Для упрощения работы с анимацией
    D) Для оптимизации физики
    Правильный ответ: B) Для динамической загрузки ресурсов по сети или локально

  8. Что такое Garbage Collector (GC) в .NET?
    A) Инструмент для увеличения производительности
    B) Сборщик мусора, очищающий неиспользуемую память
    C) Инструмент для сериализации
    D) Плагин оптимизации графики
    Правильный ответ: B) Сборщик мусора, очищающий неиспользуемую память

  9. Что такое Object Pooling?
    A) Набор объектов на сцене
    B) Система управления памятью через GC
    C) Создание новых объектов при каждом использовании
    D) Повторное использование заранее созданных объектов вместо постоянного Instantiate/Destroy
    Правильный ответ: D) Повторное использование заранее созданных объектов вместо постоянного Instantiate/Destroy

  10. Что такое Layer Collision Matrix?
    A) Таблица, управляющая взаимодействием слоёв
    B) Компонент камеры
    C) Инструмент для работы с UI
    D) Скрипт для управления анимацией
    Правильный ответ: A) Таблица, управляющая взаимодействием слоёв

  11. Какой тип коллайдера используется для круга в 2D?
    A) BoxCollider2D
    B) CircleCollider2D
    C) PolygonCollider2D
    D) CapsuleCollider2D
    Правильный ответ: B) CircleCollider2D

  12. Что такое Job System в Unity?
    A) Система для работы с UI
    B) Механизм многопоточной обработки задач
    C) Библиотека анимаций
    D) Система сохранений
    Правильный ответ: B) Механизм многопоточной обработки задач

  13. Какой метод запускает корутину в Unity?
    A) RunCoroutine()
    B) StartCor()
    C) BeginCoroutine()
    D) StartCoroutine()
    Правильный ответ: D) StartCoroutine()

  14. Какое свойство Rigidbody влияет на гравитацию объекта?
    A) mass
    B) isKinematic
    C) gravityScale
    D) drag
    Правильный ответ: C) gravityScale

  15. Какой инструмент Unity используется для анализа производительности?
    A) AssetImporter
    B) Profiler
    C) Inspector
    D) Hierarchy
    Правильный ответ: B) Profiler

  16. Что такое Time.timeScale = 0; в Unity?
    A) Ускорение времени
    B) Полная остановка времени
    C) Перезапуск времени
    D) Уменьшение времени в 2 раза
    Правильный ответ: B) Полная остановка времени

  17. Какой метод вызывается при входе в триггер?
    A) OnCollisionEnter()
    B) OnTriggerEnter()
    C) OnMouseDown()
    D) OnEnable()
    Правильный ответ: B) OnTriggerEnter()

  18. Что делает PlayerPrefs.Save()?
    A) Записывает данные в файл
    B) Сохраняет текущую сцену
    C) Очищает данные
    D) Подключает новые функции
    Правильный ответ: A) Записывает данные в файл

  19. Что такое SceneManager.LoadSceneAsync()?
    A) Синхронная загрузка сцены
    B) Асинхронная загрузка сцены
    C) Перезагрузка текущей сцены
    D) Загрузка сцены с задержкой
    Правильный ответ: B) Асинхронная загрузка сцены

  20. Какой тип переменной в C# используется для хранения текста?
    A) int
    B) float
    C) bool
    D) string
    Правильный ответ: D) string

  21. Что такое MonoBehaviour?
    A) Система управления памятью
    B) Базовый класс для всех скриптов в Unity
    C) Физический движок
    D) Интерфейс для работы с данными
    Правильный ответ: B) Базовый класс для всех скриптов в Unity

  22. Какой компонент управляет воспроизведением анимации через Animator Controller?
    A) Animation
    B) Animator
    C) AnimatorController
    D) AnimatorOverrideController
    Правильный ответ: B) Animator

  23. Что такое NativeArray?
    A) Коллекция .NET
    B) Массив, управляемый GC
    C) Тип, поддерживающий работу с нативной памятью и совместимый с Job System
    D) Ссылочный тип Unity
    Правильный ответ: C) Тип, поддерживающий работу с нативной памятью и совместимый с Job System

  24. Что такое DOTween?
    A) Встроенный инструмент Unity
    B) Библиотека для удобной анимации объектов
    C) Система физики
    D) Инструмент для работы с звуком
    Правильный ответ: B) Библиотека для удобной анимации объектов

  25. Какое событие вызывается при добавлении объекта в сцену?
    A) OnDisable()
    B) OnEnable()
    C) OnMouseDown()
    D) OnDestroy()
    Правильный ответ: B) OnEnable()

  26. Что позволяет использовать Input System вместо старого Input Manager’а?
    A) Простой код
    B) Гибкая настройка действий и устройств ввода
    C) Лучшая поддержка анимации
    D) Снижение нагрузки на GPU
    Правильный ответ: B) Гибкая настройка действий и устройств ввода

  27. Какой метод позволяет получить ссылку на компонент объекта?
    A) GetComponent<T>()
    B) GetObject<T>()
    C) FindGameObjectWithTag()
    D) FindObjectOfType<T>()
    Правильный ответ: A) GetComponent<T>()

  28. Что означает ключевое слово "partial" в C#?
    A) Класс нельзя наследовать
    B) Класс разделён на несколько частей в разных файлах
    C) Класс является абстрактным
    D) Класс реализует один интерфейс
    Правильный ответ: B) Класс разделён на несколько частей в разных файлах

  29. Какой компонент отвечает за отрисовку 2D спрайта?
    A) SpriteRenderer
    B) MeshRenderer
    C) TextMeshPro
    D) Light2D
    Правильный ответ: A) SpriteRenderer

  30. Что такое Cinemachine и для чего он используется?
    A) Для оптимизации физики
    B) Для работы с UI
    C) Для создания динамических камер
    D) Для управления аудио
    Правильный ответ: C) Для создания динамических камер

  31. Какой компонент используется для создания частиц?
    A) ParticleSystem
    B) TrailRenderer
    C) LineRenderer
    D) Light
    Правильный ответ: A) ParticleSystem

  32. Что такое Burst?
    A) Инструмент для работы с графикой
    B) Компилятор, оптимизирующий код под процессор
    C) Менеджер физики
    D) Инструмент для работы с UI
    Правильный ответ: B) Компилятор, оптимизирующий код под процессор

  33. Что такое Timeline в Unity?
    A) Система для работы с изображениями
    B) Инструмент для создания временных последовательностей (анимации, события)
    C) Редактор материалов
    D) Система управления сценами
    Правильный ответ: B) Инструмент для создания временных последовательностей (анимации, события)

  34. Что такое IL2CPP?
    A) Язык программирования
    B) Среда редактирования
    C) Технология компиляции в нативный код на мобильных и консольных платформах
    D) Система управления сценами
    Правильный ответ: C) Технология компиляции в нативный код на мобильных и консольных платформах

  35. Какой метод вызывается каждый физический кадр?
    A) Update()
    B) LateUpdate()
    C) FixedUpdate()
    D) Start()
    Правильный ответ: C) FixedUpdate()

  36. Что такое Addressables.InitializeAsync()?
    A) Инициализация системы Addressables перед первой загрузкой ассетов
    B) Асинхронная загрузка сцены
    C) Запуск корутины
    D) Инициализация анимационного контроллера
    Правильный ответ: A) Инициализация системы Addressables перед первой загрузкой ассетов

  37. Что такое Animator Override Controller?
    A) Контроллер, создающий новую анимацию
    B) Объект, заменяющий анимации в существующем Animator Controller'е
    C) Тип анимации
    D) Менеджер физики
    Правильный ответ: B) Объект, заменяющий анимации в существующем Animator Controller'е

  38. Что такое ECS?
    A) Система управления сценами
    B) Entity Component System — архитектурный подход для оптимизации и параллелизма
    C) Инструмент создания анимаций
    D) Компонент камеры
    Правильный ответ: B) Entity Component System — архитектурный подход для оптимизации и параллелизма

  39. Какой компонент позволяет объекту двигаться по NavMesh?
    A) NavMeshSurface
    B) NavMeshAgent
    C) NavMeshObstacle
    D) NavMeshPath
    Правильный ответ: B) NavMeshAgent

  40. Какой метод вызывается при уничтожении объекта?
    A) OnStart()
    B) OnDestroy()
    C) OnEnable()
    D) OnDisable()
    Правильный ответ: B) OnDestroy()

  41. Что такое UI Toolkit и чем он отличается от UGUI?
    A) То же самое, что и UGUI
    B) Более простая система интерфейса
    C) Новая система интерфейсов Unity, основанная на UXML и USS
    D) Система физики для UI
    Правильный ответ: C) Новая система интерфейсов Unity, основанная на UXML и USS

  42. Что такое RenderTexture?
    A) Текстура для хранения цвета
    B) Текстура, в которую рендерится камера
    C) Текстура, используемая только в 2D
    D) Текстура, загружаемая из AssetBundle
    Правильный ответ: B) Текстура, в которую рендерится камера

  43. Какой метод позволяет запускать анимацию вручную через код?
    A) animator.Play("animation")
    B) animator.Start("animation")
    C) animator.Trigger("animation")
    D) animator.Animate("animation")
    Правильный ответ: A) animator.Play("animation")

  44. Что такое Signal System в Timeline?
    A) Система UI-элементов
    B) Инструмент для отправки событий другим объектам
    C) Система физики
    D) Инструмент для работы с шейдерами
    Правильный ответ: B) Инструмент для отправки событий другим объектам

  45. Что такое Hybrid Renderer и зачем он нужен?
    A) Система для работы с 2D
    B) Система, полностью заменяющая стандартный рендеринг
    C) Связь между традиционным Unity и DOTS
    D) Система для работы с звуком
    Правильный ответ: C) Связь между традиционным Unity и DOTS

  46. Что такое Composite Root?
    A) Точка входа в программу
    B) Место, где создаются и соединяются все зависимости
    C) Главный объект сцены
    D) Специальный тип компонента
    Правильный ответ: B) Место, где создаются и соединяются все зависимости

  47. Что такое Behaviour Tree и как он применяется в Unity?
    A) Система для работы с графикой
    B) Структура для организации поведения ИИ
    C) Система анимации
    D) Структура UI
    Правильный ответ: B) Структура для организации поведения ИИ

  48. Что такое NetworkObject в Netcode for GameObjects?
    A) Объект сцены
    B) Объект, предназначенный для сетевой синхронизации
    C) 3D модель
    D) Тип анимации
    Правильный ответ: B) Объект, предназначенный для сетевой синхронизации

  49. Какой тип переменной синхронизируется между клиентами в Netcode?
    A) int
    B) float
    C) NetworkVariable
    D) object
    Правильный ответ: C) NetworkVariable

  50. Что такое RPC в сетевой системе Unity?
    A) Вызов метода на удалённом компьютере
    B) Вызов метода на сервере
    C) Вызов метода на клиенте
    D) Все варианты верны
    Правильный ответ: D) Все варианты верны

  51. Что такое NetworkTransform и зачем он нужен?
    A) Отвечает за движение
    B) Синхронизирует позицию и поворот объекта в сети
    C) Управляет камерой
    D) Работает с UI
    Правильный ответ: B) Синхронизирует позицию и поворот объекта в сети

  52. Что такое NetworkManager и как он используется?
    A) Управляет сценами
    B) Центральный компонент для настройки и запуска сетевой игры
    C) Управляет анимациями
    D) Работает с физикой
    Правильный ответ: B) Центральный компонент для настройки и запуска сетевой игры

  53. Что такое NetworkSceneManager и как он синхронизирует загрузку сцен?
    A) Управляет сценами в одиночной игре
    B) Синхронизирует загрузку сцен между клиентом и сервером
    C) Управляет физикой
    D) Работает с UI
    Правильный ответ: B) Синхронизирует загрузку сцен между клиентом и сервером

  54. Что такое NetworkObject.Spawn() и NetworkObject.Despawn()?
    A) Методы для работы с UI
    B) Методы создания и удаления объектов
    C) Методы создания и удаления объектов в сети
    D) Методы для работы с файлами
    Правильный ответ: C) Методы создания и удаления объектов в сети

  55. Что такое RPC в сетевой системе Unity?
    A) Вызов метода на удалённом компьютере
    B) Вызов метода на сервере
    C) Вызов метода на клиенте
    D) Все варианты верны
    Правильный ответ: D) Все варианты верны

  56. Какой метод вызывается при изменении значения NetworkVariable?
    A) OnChange()
    B) OnValueChanged()
    C) OnNetworkChange()
    D) OnVariableChanged()
    Правильный ответ: B) OnValueChanged()

  57. Что такое ServerRpc и ClientRpc?
    A) Методы, работающие только локально
    B) Методы, которые вызываются на одном устройстве, но исполняются на других
    C) Методы для работы с UI
    D) Методы для работы с физикой
    Правильный ответ: B) Методы, которые вызываются на одном устройстве, но исполняются на других

  58. Что такое NetworkBehaviour и как он отличается от MonoBehaviour?
    A) Это то же самое, что и MonoBehaviour
    B) Это класс, унаследованный от MonoBehaviour, но с возможностями сетевых методов
    C) Это компонент камеры
    D) Это часть UI системы
    Правильный ответ: B) Это класс, унаследованный от MonoBehaviour, но с возможностями сетевых методов

  59. Что такое SyncVar и почему он устарел?
    A) Переменная, синхронизируемая в Mirror
    B) Переменная, которая была в старых версиях Netcode
    C) Переменная, не поддерживающая сетевые функции
    D) Все варианты неверны
    Правильный ответ: A) Переменная, синхронизируемая в Mirror

  60. Что такое NetworkVariable и как он работает?
    A) Переменная, синхронизируемая между клиентом и сервером
    B) Переменная, используемая только на клиенте
    C) Переменная, используемая только на сервере
    D) Все варианты неверны
    Правильный ответ: A) Переменная, синхронизируемая между клиентом и сервером

  61. Что такое NetworkObject и как он связан с ECS?
    A) Он может быть использован с ECS напрямую
    B) Может быть использован в ECS через специальные адаптеры
    C) Полностью заменён в ECS
    D) Не поддерживает сетевые функции
    Правильный ответ: D) Не поддерживает сетевые функции

  62. Что такое NetworkSceneManager и как он используется?
    A) Управляет сценами в одиночной игре
    B) Синхронизирует загрузку сцен между клиентом и сервером
    C) Управляет физикой
    D) Работает с UI
    Правильный ответ: B) Синхронизирует загрузку сцен между клиентом и сервером

  63. Что такое NetworkTransform и как он работает?
    A) Отвечает за движение
    B) Синхронизирует позицию и поворот объекта в сети
    C) Управляет камерой
    D) Работает с UI
    Правильный ответ: B) Синхронизирует позицию и поворот объекта в сети

  64. Что такое NetworkVariable и как он работает?
    A) Переменная, синхронизируемая между клиентом и сервером
    B) Переменная, используемая только на клиенте
    C) Переменная, используемая только на сервере
    D) Все варианты неверны
    Правильный ответ: A) Переменная, синхронизируемая между клиентом и сервером

  65. Что такое Netcode for GameObjects и как он сравнивается с Mirror?
    A) То же самое, что и Mirror
    B) Более гибкий и мощный, чем Mirror
    C) Официальная сетевая система от Unity, более простая, чем Mirror
    D) Не имеет сетевых возможностей
    Правильный ответ: C) Официальная сетевая система от Unity, более простая, чем Mirror

  66. Что такое NetworkObject.Spawn() и NetworkObject.Despawn()?
    A) Методы для работы с UI
    B) Методы создания и удаления объектов
    C) Методы создания и удаления объектов в сети
    D) Методы для работы с файлами
    Правильный ответ: C) Методы создания и удаления объектов в сети

  67. Что такое NetworkTransform и зачем он нужен?
    A) Управляет положением объекта
    B) Синхронизирует позицию и поворот объекта в сети
    C) Работает с UI
    D) Управляет звуком
    Правильный ответ: B) Синхронизирует позицию и поворот объекта в сети

  68. Что такое NetworkSceneManager и как он используется?
    A) Управляет сценами в одиночной игре
    B) Синхронизирует загрузку сцен между клиентом и сервером
    C) Управляет физикой
    D) Работает с UI
    Правильный ответ: B) Синхронизирует загрузку сцен между клиентом и сервером

  69. Что такое NetworkBehaviour и как он отличается от MonoBehaviour?
    A) Это то же самое, что и MonoBehaviour
    B) Это класс, унаследованный от MonoBehaviour, но с возможностями сетевых методов
    C) Это компонент камеры
    D) Это часть UI системы
    Правильный ответ: B) Это класс, унаследованный от MonoBehaviour, но с возможностями сетевых методов

  70. Что такое NetworkObject и как он используется?
    A) Объект сцены
    B) Объект, предназначенный для сетевой синхронизации
    C) 3D модель
    D) Тип анимации
    Правильный ответ: B) Объект, предназначенный для сетевой синхронизации

Экзаменационный билет №1

Теоретическая часть

  1. Охарактеризуйте архитектуру чистой игры и её применение в Unity-проектах.
  2. Что такое ECS и какие преимущества он даёт по сравнению с ООП?
 

Ответы на теоретическую часть:

  1. Чистая архитектура — это подход, при котором бизнес-логика изолирована от фреймворков, UI и баз данных. В Unity используется для отделения игровой логики от MonoBehaviour, что позволяет создавать тестируемые, легко поддерживаемые и масштабируемые системы.
  2. ECS (Entity Component System) — это подход к разработке, ориентированный на данные, а не на объекты. Он позволяет эффективно использовать CPU-кэши, параллельную обработку и снижает нагрузку на GC. Предназначен для высокопроизводительных систем, особенно при работе с тысячами объектов.
 

Практическая часть

Создайте скрипт EntityMovementSystemкоторый перемещает все Entity с компонентом MoveSpeed и Translation

using Unity.Entities;
using Unity.Mathematics;

public struct MoveSpeed : IComponentData
{
    public float Value;
}

public class MovementSystem : SystemBase
{
    protected override void OnUpdate()
    {
        float deltaTime = Time.DeltaTime;

        Entities
            .ForEach((ref Translation translation, in MoveSpeed moveSpeed) =>
            {
                translation.Value.y += moveSpeed.Value * deltaTime;
            })
            .Schedule();
    }
}

Экзаменационный билет №2

Теоретическая часть

  1. Что такое Netcode for GameObjects и чем он отличается от Mirror?
  2. Какие основные элементы содержит Timeline и как они используются?
 

Ответы на теоретическую часть:

  1. Netcode for GameObjects — официальная сетевая система от Unity. Более простая в освоении и лучше интегрированная в движок. В отличие от Mirror, предлагает меньше гибкости, но стабильнее и быстрее внедряется в новые проекты.
  2. Timeline поддерживает: Animation Track, Audio Track, Signal Track, Activation Track, Control Track. Используется для создания кат-сцен, синхронизации событий и динамического управления временем.
 

Практическая часть

Реализуйте SignalAssetкоторый активирует метод OnTriggerActivated() у любого объекта при получении сигнала.

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

[TrackColor(0.8f, 0.2f, 0.2f)]
[TrackClipType(typeof(SignalEmitter))]
[TrackBindingType(typeof(GameObject))]
public class SignalTrack : TrackAsset
{
    public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
    {
        return ScriptPlayable<SignalMixerBehaviour>.Create(graph, inputCount);
    }
}

public class SignalMixerBehaviour : PlayableBehaviour
{
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        var signal = playerData as ISignalReceiver;
        signal?.OnTriggerActivated();
    }
}

public interface ISignalReceiver
{
    void OnTriggerActivated();
}

// Пример реализации:
public class DoorActivator : MonoBehaviour, ISignalReceiver
{
    public void OnTriggerActivated()
    {
        Debug.Log("Дверь активирована");
    }
}

Экзаменационный билет №3

Теоретическая часть

  1. Что такое Compute Shader и как его использовать в Unity?
  2. Что такое Garbage Collector и как минимизировать его влияние?
 

Ответы на теоретическую часть:

  1. Compute Shader — шейдер, предназначенный для выполнения произвольных вычислений на GPU. Используется для симуляций частиц, постобработки, физики и других задач, где требуется параллелизм. Вызывается через Dispatch().
  2. Garbage Collector (GC) — механизм очистки неиспользуемой памяти. Чтобы минимизировать паузы, стоит избегать частого выделения памяти (например, новых объектов в Update()), использовать pooling и NativeContainer в Job System.
 

Практическая часть

Напишите Compute Shader, который перемешивает массив чисел.

// Shuffle.compute
#pragma kernel CSMain

RWStructuredBuffer<int> data;
int seed;

uint GetLinearIndex(uint3 id : SV_DispatchThreadID)
{
    return id.x + id.y * dispatchThreadIdDim.x + id.z * dispatchThreadIdDim.x * dispatchThreadIdDim.y;
}

[numthreads(8, 8, 1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
    uint index = GetLinearIndex(id);
    if (index >= data.Length)
        return;

    uint swapIndex = index ^ seed % data.Length;
    int temp = data[index];
    data[index] = data[swapIndex];
    data[swapIndex] = temp;
}
// ShuffleManager.cs
using UnityEngine;

public class ShuffleManager : MonoBehaviour
{
    public ComputeShader shuffleShader;
    public int[] dataArray = { 1, 2, 3, 4, 5, 6, 7, 8 };
    private ComputeBuffer dataBuffer;

    void Start()
    {
        dataBuffer = new ComputeBuffer(dataArray.Length, sizeof(int));
        dataBuffer.SetData(dataArray);
        int kernel = shuffleShader.FindKernel("CSMain");
        shuffleShader.SetBuffer(kernel, "data", dataBuffer);
        shuffleShader.SetInt("seed", 12345);

        int threadGroups = Mathf.CeilToInt(dataArray.Length / 8f);
        shuffleShader.Dispatch(kernel, threadGroups, 1, 1);

        dataBuffer.GetData(dataArray);
        foreach (var v in dataArray)
        {
            Debug.Log(v);
        }

        dataBuffer.Release();
    }
}

Экзаменационный билет №4

Теоретическая часть

  1. Что такое Dependency Injection и как он реализуется в Unity?
  2. Что такое IL2CPP и какие ограничения он накладывает на C#-код?
 

Ответы на теоретическую часть:

  1. DI — принцип внедрения зависимостей, позволяющий объектам получать зависимости извне. Реализуется через Zenject или ручное внедрение через Composite Root. Позволяет избежать глобальных точек доступа и повысить тестируемость.
  2. IL2CPP — технология компиляции .NET-кода в нативный код. Ограничения: не поддерживает полный Reflection, некоторые возможности C# (dynamic), может увеличивать время сборки. Требует аккуратной работы с типами и сериализацией.
 

Практическая часть

Создайте Zenject-биндинг для PlayerServiceкоторый зависит от InventoryService

// PlayerInstaller.cs
using Zenject;

public class PlayerInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        Container.Bind<InventoryService>().AsSingle();
        Container.Bind<PlayerService>().AsSingle();
    }
}

// InventoryService.cs
public class InventoryService
{
    public int TotalItems => _items.Count;
    private List<string> _items = new List<string>();

    public void AddItem(string item)
    {
        _items.Add(item);
    }
}

// PlayerService.cs
public class PlayerService
{
    private readonly InventoryService _inventory;

    public PlayerService(InventoryService inventory)
    {
        _inventory = inventory;
    }

    public void ShowInventory()
    {
        Debug.Log($"В инвентаре {_inventory.TotalItems} предметов");
    }
}

Экзаменационный билет №5

Теоретическая часть

  1. Что такое Behaviour Tree и как его реализовать в Unity?
  2. Что такое NetworkVariable и как она синхронизируется между клиентом и сервером?
 

Ответы на теоретическую часть:

  1. Behaviour Tree — способ организации поведения ИИ в виде дерева условий и действий. Реализуется через собственные классы или сторонние плагины. Позволяет строить сложное поведение с ветвлениями и условиями.
  2. NetworkVariable — переменная, синхронизируемая между клиентами. Изменяется на сервере, клиент получает обновления. Поддерживает события OnValueChanged для реакции на изменения.
 

Практическая часть

Создайте скрипт, который синхронизирует здоровье игрока через NetworkVariable и выводит сообщение о смерти.

using Unity.Netcode;
using UnityEngine;

public class PlayerHealth : NetworkBehaviour
{
    public NetworkVariable<int> health = new NetworkVariable<int>(100);

    public delegate void PlayerDiedHandler();
    public static event PlayerDiedHandler OnPlayerDied;

    void Start()
    {
        health.OnValueChanged += OnHealthChanged;
    }

    public void TakeDamage(int amount)
    {
        if (!IsServer) return;
        health.Value -= amount;
    }

    void OnHealthChanged(int previousValue, int newValue)
    {
        Debug.Log($"Здоровье изменено: {newValue}");
        if (newValue <= 0)
        {
            OnPlayerDied?.Invoke();
        }
    }
}

// Пример подписки
public class DeathNotifier : MonoBehaviour
{
    void OnEnable()
    {
        PlayerHealth.OnPlayerDied += HandlePlayerDeath;
    }

    void OnDisable()
    {
        PlayerHealth.OnPlayerDied -= HandlePlayerDeath;
    }

    void HandlePlayerDeath()
    {
        Debug.Log("Игрок мёртв!");
    }
}

Экзаменационный билет №6

Теоретическая часть

  1. Что такое ScriptableObject и как его использовать для хранения состояний игры?
  2. Какие основные типы данных поддерживаются в NetworkVariable?
 

Ответы на теоретическую часть:

  1. ScriptableObject — это ассет, хранящий данные вне сцен. Может использоваться для хранения игровых состояний, предметов, конфигураций и других данных, которые нужно изменять независимо от GameObject. Это позволяет упрощать обмен данными между системами и делает их легко редактируемыми.
  2. NetworkVariable поддерживает базовые типы (int, float, bool), структуры (Vector3, quaternion), а также кастомные структуры, если они реализуют IEquatable<T> и имеют подходящий размер.
 

Практическая часть

Создайте скрипт GameStateSOкоторый будет хранить текущее состояние игры через ScriptableObject и передавать его другим классам через DI.

using UnityEngine;

public enum GameState { Menu, Playing, Paused, GameOver }

[CreateAssetMenu(fileName = "GameState", menuName = "Game/State")]
public class GameStateSO : ScriptableObject
{
    public GameState CurrentState;

    private void OnEnable()
    {
        CurrentState = GameState.Menu;
    }
}

// Пример использования:
public class GameManager : MonoBehaviour
{
    [SerializeField] private GameStateSO gameState;

    void Start()
    {
        Debug.Log("Игра запущена в состоянии: " + gameState.CurrentState);
    }
}

Экзаменационный билет №7

Теоретическая часть

  1. Что такое Composite Root и как он связан с принципами хорошей архитектуры?
  2. Что такое Hybrid Renderer и зачем он нужен при переходе на DOTS?
 

Ответы на теоретическую часть:

  1. Composite Root — это точка, где создаются и соединяются все зависимости. Позволяет избежать глобальных точек доступа и повысить тестируемость. Реализуется через MonoBehaviour, где внедряются зависимости вручную или через Zenject.
  2. Hybrid Renderer — мост между обычным режимом работы Unity и ECS. Позволяет использовать преимущества DOTS без полного перевода проекта на ECS. Используется при постепенной миграции на новые системы.
 

Практическая часть

Создайте простой компонент ECSPlayerControllerкоторый перемещает игрока через Input System и записывает новую позицию в Translation.

using Unity.Entities;
using Unity.Transforms;
using Unity.Mathematics;
using UnityEngine;

public class ECSPlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;
}

public class PlayerMovementSystem : SystemBase
{
    protected override void OnUpdate()
    {
        float deltaTime = Time.DeltaTime;
        float speed = 5f;

        Entities
            .WithAll<ECSPlayerController>()
            .ForEach((ref Translation translation) =>
            {
                float3 move = new float3(0, 0, 0);

                if (Input.GetKey(KeyCode.W)) move.z += 1;
                if (Input.GetKey(KeyCode.S)) move.z -= 1;
                if (Input.GetKey(KeyCode.A)) move.x -= 1;
                if (Input.GetKey(KeyCode.D)) move.x += 1;

                translation.Value += math.normalize(move) * speed * deltaTime;
            })
            .Schedule();
    }
}

Экзаменационный билет №8

Теоретическая часть

  1. Что такое IL2CPP и какие ограничения он накладывает на C#-код?
  2. Что такое Memory Profiler и как он помогает в оптимизации?
 

Ответы на теоретическую часть:

  1. IL2CPP — технология компиляции .NET-кода в нативный код. Ограничения: не поддерживает dynamic, Reflection, некоторые возможности LINQ. Требует осторожной работы с сериализацией и управлением памятью.
  2. Memory Profiler — инструмент Unity для анализа использования памяти. Показывает, где выделяется память, какие объекты остаются в памяти. Полезен для выявления утечек и минимизации GC.
 

Практическая часть

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

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class WebTextLoader : MonoBehaviour
{
    IEnumerator Start()
    {
        UnityWebRequest request = UnityWebRequest.Get("https://example.com/data.txt ");
        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            Debug.Log(request.downloadHandler.text);
        }
        else
        {
            Debug.LogError(request.error);
        }
    }
}

Экзаменационный билет №9

Теоретическая часть

  1. Что такое Shader Graph и как его использовать в HDRP/URP?
  2. Что такое Compute Shader и как его использовать?
 

Ответы на теоретическую часть:

  1. Shader Graph — визуальный редактор шейдеров в Unity. Интегрирован в URP и HDRP, позволяет создавать материалы с различными эффектами без знания HLSL. Подходит для быстрой разработки и прототипирования.
  2. Compute Shader — шейдер, выполняющий вычисления на GPU. Используется для физики частиц, постобработки, симуляций. В Unity вызывается через Dispatch(), работа ведётся с буферами и группами потоков.
 

Практическая часть

Создайте Shader Graph, который имитирует мерцающий световой контур вокруг объекта (например, при наведении).

 

Ответ:

  • Создайте новый Shader Graph (URP/HDRP) → выберите тип Unlit
  • Добавьте Node Screen Position , Fresnel Effect , Step , Color
  • Свяжите Screen Position → Fresnel → Step → Master
  • Настройте параметры так, чтобы при пересечении взгляда появлялось свечение
 

Примените шейдер к материалу и назначьте его модели.

 

Экзаменационный билет №10

Теоретическая часть

  1. Что такое UI Toolkit и чем он отличается от UGUI?
  2. Что такое SRP и чем отличаются URP, HDRP и DOTS Rasterization?
 

Ответы на теоретическую часть:

  1. UI Toolkit — система интерфейса Unity, основанная на UXML и USS. Более декларативная, чем UGUI, подходит для сложных динамических интерфейсов и расширяемых редакторских инструментов.
  2. SRP — Scriptable Render Pipeline. URP — легковесный, HDRP — для высокой графики, DOTS Rasterization — экспериментальная система, работающая с ECS и обеспечивающая высокую производительность.
 

Практическая часть

Создайте окно редактора Unity, которое отображает список игроков и позволяет добавлять новых через кнопку.

using UnityEditor;
using UnityEngine;

public class PlayerListEditorWindow : EditorWindow
{
    private string[] playerNames = { };
    private int playerCount = 0;

    [MenuItem("Tools/Player List")]
    public static void ShowWindow()
    {
        GetWindow<PlayerListEditorWindow>("Список игроков");
    }

    void OnGUI()
    {
        GUILayout.Label("Управление списком игроков", EditorStyles.boldLabel);

        for (int i = 0; i < playerNames.Length; i++)
        {
            playerNames[i] = EditorGUILayout.TextField("Игрок " + i, playerNames[i]);
        }

        if (GUILayout.Button("Добавить игрока"))
        {
            var list = new List<string>(playerNames);
            list.Add("Новый игрок " + playerCount++);
            playerNames = list.ToArray();
        }

        if (GUILayout.Button("Очистить список"))
        {
            playerNames = new string[0];
        }
    }
}

Экзаменационный билет №11

Теоретическая часть

  1. Что такое NetworkObject и какие методы используются для его синхронизации?
  2. Что такое NetworkVariable и как она синхронизируется между клиентом и сервером?
 

Ответы на теоретическую часть:

  1. NetworkObject — это компонент, отмечающий объект как сетевой. Используются методы Spawn() и Despawn() для синхронизации между клиентом и сервером.
  2. NetworkVariable — переменная, синхронизируемая между клиентами. Изменяется на сервере, клиенты получают обновления. Поддерживает события OnValueChanged для реакции на изменения.
 

Практическая часть

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

using Unity.Netcode;
using UnityEngine;

public class PlayerHealth : NetworkBehaviour
{
    public NetworkVariable<int> health = new NetworkVariable<int>(100);

    void Start()
    {
        health.OnValueChanged += OnHealthChanged;
    }

    public void TakeDamage(int damage)
    {
        if (!IsServer) return;
        health.Value -= damage;
    }

    void OnHealthChanged(int previousValue, int newValue)
    {
        Debug.Log($"Здоровье: {newValue}");
        if (newValue <= 0)
        {
            Debug.Log("Игрок погиб");
        }
    }
}

Экзаменационный билет №12

Теоретическая часть

  1. Что такое RPC и как он используется в Netcode for GameObjects?
  2. Что такое ServerRpc и ClientRpc и чем они отличаются?
 

Ответы на теоретическую часть:

  1. RPC (Remote Procedure Call) — это механизм, позволяющий вызывать методы на удалённой машине. В Unity реализуется через ServerRpc и ClientRpc.
  2. ServerRpc — вызывается на клиенте, исполняется на сервере. ClientRpc — вызывается на сервере, исполняется на клиентах. Обеспечивают двустороннюю коммуникацию в сетевых играх.
 

Практическая часть

Создайте скрипт, который позволяет игроку отправить сообщение всем участникам игры через RPC.

using Unity.Netcode;
using UnityEngine;

public class ChatSystem : NetworkBehaviour
{
    public void SendGlobalMessage(string message)
    {
        if (IsServer)
        {
            ReceiveMessageClientRpc(message);
        }
        else
        {
            SendMessageServerRpc(message);
        }
    }

    [ServerRpc]
    void SendMessageServerRpc(string message)
    {
        ReceiveMessageClientRpc(message);
    }

    [ClientRpc]
    void ReceiveMessageClientRpc(string message)
    {
        Debug.Log("Сообщение: " + message);
    }
}

Экзаменационный билет №13

Теоретическая часть

  1. Что такое NativeArray и почему он эффективен в Job System?
  2. Что такое Burst и как он помогает в производительности?
 

Ответы на теоретическую часть:

  1. NativeArray — структура данных из Unity.Collections, выделяющая память вне управляемого пула .NET. Это делает её быстрее, так как не участвует в работе GC. Используется совместно с Job System.
  2. Burst — компилятор, который оптимизирует код, написанный на C#, до высокоэффективного машинного кода. Особенно полезен при работе с Job System, где требуется высокая производительность и безопасность памяти.
 

Практическая часть

Реализуйте простой Job, который увеличивает массив чисел на заданное значение.

using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;

public class ArrayModifierJob : MonoBehaviour
{
    void Start()
    {
        NativeArray<float> numbers = new NativeArray<float>(new float[] { 1, 2, 3, 4, 5 }, Allocator.TempJob);
        
        var job = new ModifyArrayJob
        {
            array = numbers,
            value = 10f
        };

        JobHandle handle = job.Schedule();
        handle.Complete();

        foreach (float f in numbers)
        {
            Debug.Log(f);
        }

        numbers.Dispose();
    }

    [BurstCompile]
    struct ModifyArrayJob : IJob
    {
        public NativeArray<float> array;
        public float value;

        public void Execute()
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] += value;
            }
        }
    }
}

Экзаменационный билет №14

Теоретическая часть

  1. Что такое UnityWebRequest и как он используется для сетевых запросов?
  2. Что такое NetworkSceneManager и как он синхронизирует загрузку сцен?
 

Ответы на теоретическую часть:

  1. UnityWebRequest — система, позволяющая выполнять HTTP-запросы. Используется для получения данных с сервера, загрузки изображений, общения с API. Может работать с coroutine, async/await и CancellationToken.
  2. NetworkSceneManager — часть Netcode for GameObjects, которая синхронизирует загрузку сцен между клиентом и сервером. Когда один из них загружает сцену, остальные тоже переключаются на неё.
 

Практическая часть

Создайте скрипт, который загружает текстовый файл с сервера и выводит его содержимое в консоль.

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class LoadTextFromWeb : MonoBehaviour
{
    IEnumerator Start()
    {
        UnityWebRequest request = UnityWebRequest.Get("https://example.com/data.txt ");
        yield return request.SendWebRequest();

        if (request.result == UnityWebRequest.Result.Success)
        {
            Debug.Log(request.downloadHandler.text);
        }
        else
        {
            Debug.LogError(request.error);
        }
    }
}

Экзаменационный билет №15

Теоретическая часть

  1. Что такое NetworkTransform и как он обеспечивает синхронизацию позиции объекта?
  2. Что такое NetworkManager и как он управляет сетевой игрой?
 

Ответы на теоретическую часть:

  1. NetworkTransform — компонент, который синхронизирует позицию, поворот и масштаб объекта между клиентами. Работает через интерполяцию и экстраполяцию, чтобы сделать движение плавным.
  2. NetworkManager — центральный компонент для настройки и запуска сетевой игры. Управляет подключением, спавном игроков, синхронизацией и загрузкой сцен.
 

Практическая часть

Создайте скрипт, который при загрузке сцены выводит информацию о количестве подключённых клиентов.

using Unity.Netcode;
using UnityEngine;

public class ConnectedClientsLogger : MonoBehaviour
{
    void Start()
    {
        NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected;
        NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnected;

        Debug.Log("Количество подключённых клиентов: " + NetworkManager.Singleton.ConnectedClients.Count);
    }

    void OnClientConnected(ulong clientId)
    {
        Debug.Log("Клиент подключён: " + clientId);
    }

    void OnClientDisconnected(ulong clientId)
    {
        Debug.Log("Клиент отключён: " + clientId);
    }
}

(1) Кейс: "Не работает синхронизация ИИ — клиенты видят разные действия"


Описание кейса

Вы — Senior-разработчик в студии, которая работает над многопользовательской 3D-игрой . В проекте используется Netcode for GameObjects , а также частично интегрирован DOTS Netcode для работы с ИИ.

 

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

 

Но при тестировании выяснилось:

 

Клиенты видят разное поведение у одного и того же ИИ.

 

Например:

  • У одного клиента ИИ стоит на месте, у другого — бежит
  • Один клиент видит, как ИИ стреляет, другой — нет

Задача: выявить причины рассинхронизации и предложить решения .

 

Исходные данные

  • Используется Netcode for GameObjects + DOTS Netcode (в экспериментальном режиме)
  • ИИ использует собственную FSM и поддерживает состояния:
    • Idle
    • Patrol
    • Chase
    • Attack
  • Состояние хранится в компоненте AIStateComponent
  • События ИИ работают через ServerRpc и ClientRpc
  • Нет ошибок в консоли
 

Исходный скрипт AIController.cs

using Unity.Netcode;
using UnityEngine;

public class AIController : NetworkBehaviour
{
    public enum AIState { Idle, Patrol, Chase, Attack }
    public AIState currentState = AIState.Idle;

    [SerializeField] private float chaseRange = 10f;
    [SerializeField] private Transform player;
    private Vector3 lastKnownPosition;

    void Update()
    {
        if (!IsOwner) return;

        switch (currentState)
        {
            case AIState.Idle:
                if (PlayerInChaseRange()) currentState = AIState.Chase;
                break;

            case AIState.Chase:
                MoveTowardsPlayer();
                if (PlayerInAttackRange())
                {
                    currentState = AIState.Attack;
                    SendAttackRpc();
                }
                break;

            case AIState.Attack:
                // Атака игрока
                break;
        }
    }

    bool PlayerInChaseRange()
    {
        return Vector3.Distance(transform.position, player.position) < chaseRange;
    }

    void MoveTowardsPlayer()
    {
        transform.position += (player.position - transform.position).normalized * Time.deltaTime * 5f;
    }

    void SendAttackRpc()
    {
        PlayAttackAnimationClientRpc();
    }

    [ClientRpc]
    void PlayAttackAnimationClientRpc()
    {
        Debug.Log("ИИ начал атаку");
    }
}

Анализ ситуации и выявление проблем


Проблема №1: Поведение ИИ полностью локальное

Как проверить:
Текстура, по которой ИИ принимает решение, находится только на сервере или на клиенте.

 

Возможная проблема:
Скрипт AIController использует if (!IsOwner) return;что означает, что он работает только на стороне владельца. Но если это не сервер, то другие клиенты могут получать некорректное состояние.

 

Решение:
Перенести логику ИИ на сервер. Использовать IsServer вместо IsOwner

void Update()
{
    if (!IsServer) return;
    
    switch (currentState)
    {
        case AIState.Idle:
            if (PlayerInChaseRange())
            {
                currentState = AIState.Chase;
                SetStateServerRpc(AIState.Chase);
            }
            break;

        case AIState.Chase:
            MoveTowardsPlayer();
            if (PlayerInAttackRange())
            {
                currentState = AIState.Attack;
                SetStateServerRpc(AIState.Attack);
            }
            break;
    }
}

[ServerRpc]
void SetStateServerRpc(AIState state)
{
    currentState = state;
    PlayStateChangeClientRpc(state);
}

[ClientRpc]
void PlayStateChangeClientRpc(AIState state)
{
    Debug.Log($"ИИ перешёл в состояние: {state}");
}

Проблема №2: Отсутствует синхронизация состояния ИИ у всех клиентов

Как проверить:
Добавьте вывод текущего состояния ИИ на каждом клиенте:

Debug.Log($"Моё состояние: {currentState}, IsServer: {IsServer}, IsOwner: {IsOwner}");

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

 

Решение:
Используйте NetworkVariable<AIState>или отдельный RPC-вызов, который синхронизирует состояние ИИ у всех клиентов.

public NetworkVariable<AIState> networkState = new NetworkVariable<AIState>();

void Update()
{
    if (IsServer)
    {
        switch (networkState.Value)
        {
            case AIState.Idle:
                if (PlayerInChaseRange())
                {
                    networkState.Value = AIState.Chase;
                }
                break;
            case AIState.Chase:
                MoveTowardsPlayer();
                if (PlayerInAttackRange())
                {
                    networkState.Value = AIState.Attack;
                }
                break;
        }
    }
    else
    {
        if (networkState.Value != currentState)
        {
            currentState = networkState.Value;
            Debug.Log($"Обновлено состояние ИИ до: {currentState}");
        }
    }
}

Проблема №3: Логика перемещения ИИ не синхронизирована

Как проверить:
Добавьте отладку позиции ИИ на сервере и клиенте:

Debug.Log($"Позиция ИИ: {transform.position}, IsServer: {IsServer}");

Возможная проблема:
Поскольку ИИ сам двигается через transform.positionего движение не синхронизируется. Это приводит к рассинхрону между клиентами.

 

Решение:
Используйте NetworkTransformили собственную систему синхронизации положения:

public NetworkVariable<Vector3> networkPosition = new NetworkVariable<Vector3>();

void LateUpdate()
{
    if (IsServer)
    {
        networkPosition.Value = transform.position;
    }
    else
    {
        transform.position = Vector3.Lerp(transform.position, networkPosition.Value, Time.deltaTime * 10f);
    }
}

Проблема №4: Состояние ИИ не сохраняется при спавне

Как проверить:
Подключитесь к игре после запуска сервера и проверьте, какое состояние ИИ у нового клиента.

 

Возможная проблема:
Если ИИ уже в состоянии Attackновый клиент получает Idleпотому что начальное состояние не задано корректно.

 

Решение:
Убедитесь, что начальное состояние передаётся через OnNetworkSpawn()

public override void OnNetworkSpawn()
{
    if (IsClient)
    {
        Debug.Log("Текущее состояние ИИ: " + networkState.Value);
    }
}

Проблема №5: Физическое движение ИИ мешает синхронизации

Как проверить:
Если ИИ сталкивается с препятствием, но у других клиентов он проходит сквозь него.

 

Возможная проблема:
Физика ИИ активна только на сервере или на клиенте, из-за чего физические взаимодействия не синхронизируются.

 

Решение:
Отключите физику на клиенте, если она не требуется. Используйте Rigidbody.isKinematic = true у клиентов, если управление идёт с сервера.

 

Итоговое решение: исправленный скрипт

using Unity.Netcode;
using UnityEngine;

public class AIController : NetworkBehaviour
{
    public enum AIState { Idle, Patrol, Chase, Attack }
    public NetworkVariable<AIState> networkState = new NetworkVariable<AIState>(AIState.Idle);

    [SerializeField] private float chaseRange = 10f;
    [SerializeField] private Transform player;

    private Vector3 lastKnownPosition;

    void Start()
    {
        networkState.OnValueChanged += (oldValue, newValue) =>
        {
            Debug.Log($"Состояние изменено: {newValue}");
        };
    }

    void Update()
    {
        if (IsServer)
        {
            switch (networkState.Value)
            {
                case AIState.Idle:
                    if (PlayerInChaseRange())
                    {
                        networkState.Value = AIState.Chase;
                    }
                    break;

                case AIState.Chase:
                    MoveTowardsPlayer();
                    if (PlayerInAttackRange())
                    {
                        networkState.Value = AIState.Attack;
                    }
                    break;

                case AIState.Attack:
                    // Серверная логика атаки
                    break;
            }
        }
        else
        {
            // На клиенте — интерполяция и обновление состояния
            if (networkState.Value == AIState.Chase)
            {
                InterpolateMovement();
            }
        }
    }

    bool PlayerInChaseRange()
    {
        return Vector3.Distance(transform.position, player.position) < chaseRange;
    }

    void MoveTowardsPlayer()
    {
        transform.position += (player.position - transform.position).normalized * Time.deltaTime * 5f;
    }

    void InterpolateMovement()
    {
        // Плавное движение на клиенте
        transform.position = Vector3.Lerp(transform.position, player.position, Time.deltaTime * 5f);
    }
}

Обучающие моменты

Что изучают студенты
Примечание
Работа с Netcode for GameObjects
Как использовать Rpc, NetworkVariable, Server/ClientRpc
Разница между IsServer и IsOwner
Кто должен управлять логикой ИИ
Синхронизация состояний ИИ
Как обеспечить одинаковое поведение у всех участников
Отладка сетевых объектов
Через Debug.Log, события и подписки
Сетевая физика и движение
Как правильно синхронизировать позицию и поворот

Дополнительные задания для самостоятельной работы

  1. Реализуйте синхронизацию поворота ИИ (например, с использованием NetworkVariable<Quaternion>)
  2. Добавьте систему зрения (Raycast), чтобы ИИ реагировал только на игроков в поле зрения
  3. Создайте событие OnStateChanged, которое вызывается при любом изменении
  4. Добавьте анимации, которые меняются в зависимости от состояния ИИ
  5. Реализуйте систему «памяти» ИИ: если игрок скрывается, ИИ продолжает его искать

(2) Кейс: "Тормозит мобильная игра — FPS падает до 10 кадров"


Описание кейса

Вы — Senior-разработчик в команде, которая разрабатывает 2D-раннер для Android . Игра прошла все тесты на ПК и работала стабильно (60 FPS), но при запуске на реальных устройствах выяснилось:

 

FPS упало до 10–15 кадров, даже на средних по мощности телефонах.
Игроки жалуются на лаги, интерфейс дергается, управление не отзывчивое.

Вам поручено провести полный аудит проекта, найти "узкие места", предложить пути оптимизации и реализовать их.

 

Исходные данные

  • Используется Unity с URP (Universal Render Pipeline)
  • Многопоточная логика отсутствует
  • UI сделан через Canvas + TextMeshPro
  • ИИ персонажи используют NavMeshAgent и Raycast для обнаружения игрока
  • В игре есть эффекты частиц и звуковые события
  • Используется стандартный Input System (не новая система ввода от Unity)
 

Исходный скрипт PlayerMovement.cs

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        float move = Input.GetAxis("Horizontal");
        rb.velocity = new Vector2(move * moveSpeed, rb.velocity.y);
    }
}

Анализ ситуации и выявление проблем


Проблема №1: Частое использование GC

Как проверить:
Откройте Unity Profiler → CPU Usage , вкладка GC Alloc .

 

Возможная причина:
Частое создание объектов в Update()например:

rb.velocity = new Vector2(...); // создаёт новый объект Vector2 каждый кадр

Решение:
Используйте статические переменные или NativeContainer (если работаете с Job System):

private Vector2 velocity;
void Update()
{
    float move = Input.GetAxis("Horizontal");
    velocity.Set(move * moveSpeed, rb.velocity.y);
    rb.velocity = velocity;
}
Проблема №2: Неправильное управление физикой

Как проверить:
Проверьте, как часто вызывается Update() и FixedUpdate()

Возможная причина:
Управление игроком происходит в Update() вместо FixedUpdate()Это может вызывать дисбаланс между физикой и вводом.

 

Решение:
Переносите логику движения в FixedUpdate()

void FixedUpdate()
{
    float move = Input.GetAxis("Horizontal");
    velocity.Set(move * moveSpeed, rb.velocity.y);
    rb.velocity = velocity;
}
Проблема №3: Высокая нагрузка на GPU из-за UI и частиц

Как проверить:
Откройте Unity Profiler → Rendering и GPU Usage .

 

Возможная причина:

  • Слишком много текстовых элементов (TextMeshPro)
  • Эффекты частиц работают без ограничений
  • Нет оптимизации материалов и шейдеров
 

Решение:

  • Уменьшите количество TextMeshPro элементов и используйте TextMeshProUGUI вместо TextMeshPro
  • Используйте Sprite Atlas для всех UI-элементов
  • Отключите частицы на слабых устройствах через Quality Settings:
if (Application.isMobilePlatform)
{
    ParticleSystem[] effects = FindObjectsOfType<ParticleSystem>();
    foreach (var effect in effects)
    {
        effect.Stop();
        effect.gameObject.SetActive(false);
    }
}
Проблема №4: Тяжёлые материалы и шейдеры

Как проверить:
Посмотрите на используемые шейдеры в инспекторе.

 

Возможная причина:
Стандартные шейдеры Unity слишком тяжёлые для мобильных устройств. Например:

  • Standard Shader
  • Unlit/Standard
  • Шейдеры с высокой точностью освещения
 

Решение:
Переключитесь на более простые шейдеры:

  • Используйте URP Default Material
  • Замените шейдеры на Unlit/Color или Sprites/Default
  • Для сложной графики используйте Shader Graph , настроенный под мобильную производительность
 

Проблема №5: Неэффективная работа с коллайдерами и триггерами

Как проверить:
Добавьте вывод в консоль из методов OnTriggerEnter2D() и OnCollisionEnter2D().

 

Возможная причина:
Много триггеров, которые активно взаимодействуют с игровыми системами, вызывая частые события и аллокации.

 

Решение:

  • Ограничьте количество триггеров
  • Используйте Object Pooling для пулей и врагов
  • Сведите к минимуму логику внутри OnTriggerEnter / OnCollisionEnter
  • Используйте Layer Collision Matrix , чтобы исключить ненужные столкновения
 

Проблема №6: Неправильная настройка Canvas Scaler

Как проверить:
Используйте Game View с разными разрешениями.

 

Возможная причина:
Canvas Scaler установлен как Constant Pixel Size , что приводит к масштабированию UI на разных экранах и дополнительному рендерингу.

 

Решение:
Настройте Canvas Scaler как Scale With Screen Size :

  • Reference Resolution: 1080x1920
  • Match: 0.5 (ширина и высота)
  • Убедитесь, что все UI-элементы используют Layout Group или Anchors
 

Проблема №7: Большое количество Draw Calls

Как проверить:
Посмотрите в Profiler → Rendering → Batches.

 

Возможная причина:
Спрайты не объединены в Sprite Atlas, используются разные материалы и шейдеры.

 

Решение:

  • Создайте Sprite Atlas и добавьте все спрайты в него
  • Используйте один материал для большинства объектов
  • Применяйте Static Batching и Sprite Atlases
  • Избегайте использования множества разных шрифтов и цветов в TMP
 

Проблема №8: Использование стандартных материалов

Как проверить:
Посмотрите на материалы в инспекторе.

 

Возможная причина:
Материалы с дефолтными шейдерами требуют больше ресурсов.

 

Решение:
Замените шейдеры на:

  • Mobile/Diffuse
  • Sprites/Default (без сортировки по порядку)
  • Используйте Texture Compression : ASTC / ETC2 / Crunch
 

Проблема №9: Нет оптимизации анимаций

Как проверить:
Если используется Animator, посмотрите на количество переходов и параметров.

 

Возможная причина:
Animator работает постоянно, даже если анимация не меняется.

 

Решение:

  • Используйте Playable API вместо Animator для тяжёлых случаев
  • Если нет необходимости в Animator, замените на простую систему смены спрайтов
  • Добавьте Animation Rigging только там, где это действительно нужно
 

Проблема №10: Нет оптимизации кода под IL2CPP

Как проверить:
Проверьте, какие участки кода используют LINQ, Reflection, dynamic типы.

 

Возможная причина:
Некоторые части кода могут быть совместимы только с .NET, но не с IL2CPP.

 

Решение:

  • Уберите LINQ и Reflection
  • Перепишите динамическое управление компонентами через инъекции зависимостей или событийную модель
  • Используйте NativeArray, если работаете с Job System
 

Итоговое решение: исправленный скрипт и рекомендации

Исправленный скрипт PlayerMovement.cs

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    private Rigidbody2D rb;
    private Vector2 velocity;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
        float move = Input.GetAxis("Horizontal");
        velocity.Set(move * moveSpeed, rb.velocity.y);
        rb.velocity = velocity;
    }
}

Рекомендации по оптимизации проекта

Категория
Рекомендация
UI
Используйте Canvas Scaler с режимом Scale With Screen Size. Объедините спрайты в Sprite Atlas. Упростите шейдеры для UI.
Графика
Используйте шейдеры под мобильные устройства. Отключите сложные эффекты на слабых устройствах.
Физика
Убирайте лишние коллайдеры. Используйте isTrigger только при необходимости. Настройте Layer Collision Matrix.
Память
Избегайте аллокаций в Update(). Используйте Object Pooling.
Производительность
Используйте Burst и Job System для параллельной обработки данных.
Сборка
Включите Strip Engine Code и Link XML для удаления неиспользуемого кода.

Обучающие моменты

Что изучают студенты
Примечание
Работа с Profiler'ом
Как диагностировать проблемы производительности
Использование Sprite Atlas
Для снижения количества draw call’ов
Подходящие шейдеры для мобильных устройств
Чтобы снизить нагрузку на GPU
Разница между Update(), FixedUpdate(), LateUpdate()
Для правильной работы с физикой
Работа с IL2CPP
Какие возможности C# доступны, а какие нет
Работа с Texture Compression
Как выбрать формат под Android/iOS
Работа с Canvas Scaler
Для адаптации под разные экраны
Настройка Player Settings под мобильные платформы
Уровень качества, сглаживание, частота кадров
Использование NativeContainer
Для работы с Job System и Burst
Понимание различий между Desktop и Mobile билдами
Как настраивать сборку правильно

Дополнительные задания для самостоятельной работы

  1. Реализуйте автоматическое определение мощности устройства и включение/выключение эффектов.
  2. Создайте систему вибрации при столкновении (через AndroidJavaClass).
  3. Добавьте систему управления качеством графики через меню настроек.
  4. Сделайте так, чтобы игрок мог сохранить прогресс и продолжить его на другом устройстве.
  5. Интегрируйте Addressables для загрузки уровней и ассетов по сети.

Ролевая игра №1: "Студия AAA — разработка многопользовательской игры"


Цель игры

Научить студентов работать в условиях, максимально приближенных к реальным студийным процессам.
Имитировать разработку многопользовательского проекта уровня Senior/Team Lead , с акцентом на:

 
  • Сетевые системы (Netcode for GameObjects + DOTS Netcode)
  • Архитектуру чистой игры и разделение слоёв
  • CI/CD и автоматизация билдов
  • Работа с ECS и Job System
  • Инструменты редактора и оптимизация под целевые платформы
 

Формат

  • Тип: Образовательная ролевая игра (настольная/виртуальная)
  • Участники: 6–8 человек
  • Продолжительность: 4–5 академических часа
  • Материалы: карточки задач, описание ролей, Unity-шаблон с минимальной сетевой системой
 

Сеттинг

Вы — часть команды крупной геймдев-студии , которая получила заказ на создание многопользовательской 3D-игры .
Проект должен быть готов к тестированию за ограниченное время , и каждая часть команды отвечает за свою зону ответственности.

 

Клиент — крупный издатель, который:

  • Требует стабильную работу по сети
  • Настаивает на высокой производительности
  • Хочет оптимизацию под мобильные и консольные платформы
  • Желает удобные инструменты для дизайнеров уровней
 

Роли в команде

Роль
Описание
Геймдизайнер / Архитектор
Формулирует концепцию, описывает механики, пишет ТЗ, следит за соответствием заданию
Сетевой программист
Отвечает за реализацию Netcode for GameObjects, синхронизацию объектов и событий
Физик / ИИ программист
Реализует движение игрока, поведение ИИ, плавность анимаций и физики
Оптимизатор / Performance Engineer
Запускает Profiler, Memory Profiler, диагностирует производительность, предлагает решения
UI/UX дизайнер
Создаёт интерфейс: экран подключения, HUD, миникарта, система сообщений
Редакторский программист / Tool Developer
Пишет кастомные инструменты для дизайнеров: плагины, окна, помощники
Менеджер проекта / Scrum Master
Контролирует сроки, распределяет задачи, проводит встречи
QA / Тестировщик
Тестирует игру на нескольких клиентах, составляет отчёты о найденных багах

Этапы игры

Этап 1: Брифинг и планирование
  • Геймдизайнер представляет концепцию: «кооперативный шутер с ИИ, где игроки объединяются для выполнения миссии»
  • Менеджер делит задачи:
    • Подготовка сервера и клиентской части
    • Реализация движения и прыжков
    • Синхронизация здоровья и урона
    • Интерфейс подключения и HUD
    • Простой ИИ, реагирующий на игроков
     
  • Команда создаёт доску (Trello/Post-it), выстраивает таймер и начинает работу
 
Этап 2: Разработка
  • Каждый участник получает свою часть кода:
    • Сетевой программист: реализует ServerRpc, ClientRpc, NetworkVariable
    • UI/UX: создаёт экран подключения, список игроков, худ индикаторы
    • ИИ-программист: реализует FSM ИИ, NavMeshAgent, реакцию на игроков
    • Editor Tools: создаёт инструмент для спавна точек миссии через меню редактора
     
  • QA запускает несколько клиентов и проверяет синхронизацию
  • Каждые 10–15 минут — короткая встреча (stand-up)
 
Этап 3: Презентация
  • Команда демонстрирует прототип:
    • Можно ли подключиться нескольким игрокам?
    • Работает ли синхронизация здоровья и поворотов?
    • Видно ли движение ИИ у всех участников?
     
  • QA показывает найденные проблемы
  • Геймдизайнер оценивает соответствие ТЗ
  • Менеджер подводит итоги и даёт обратную связь
 

Обучающие эффекты

  • Практика работы с сетевой логикой уровня Senior
  • Изучение NetworkVariable , ServerRpc , ClientRpc
  • Написание архитектурного кода : использование чистых классов, изоляция игровой логики
  • Опыт синхронизации состояний ИИ между клиентами
  • Настройка Canvas Scaler , работа с TextMeshPro , адаптивный интерфейс
  • Создание кастомных редакторских инструментов через UnityEditor API
  • Диагностика производительности через Unity Profiler
  • Управление командой, распределение задач и проведение stand-up встреч
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Игроки не видят друг друга
Не загрузилась сцена или нет NetworkObject
Убедитесь, что префаб игрока имеет NetworkObject и он зарегистрирован
Движение работает только у себя
Нет NetworkTransform или обновления
Добавьте NetworkTransform или используйте свой механизм с NetworkVariable<Vector3>
ИИ не реагирует на других игроков
Логика ИИ работает только на сервере
Перепишите систему зрения ИИ через RPC или NetworkVariable
Сеть не масштабируется на 10+ игроков
Используется слишком много NetworkVariable
Перепишите часть логики на Ghost, если используется DOTS Netcode
UI дергается и обрезается
Canvas Scaler настроен неверно
Используйте Scale With Screen Size и задайте Reference Resolution
FPS упал до 10 на Android
Высокая нагрузка на GPU
Уменьшите количество draw call'ов, отключите тесселяцию, используйте Sprite Atlas
Сложно добавлять новые уровни
Нет Addressables или SceneManager.LoadSceneAsync()
Перепишите систему загрузки через Addressables или асинхронную загрузку
Игроки не могут двигаться одновременно
Нет синхронизации Transform
Используйте NetworkTransform или реализуйте интерполяцию
Не синхронизируется здоровье
Health не является NetworkVariable
Перепишите класс здоровья с использованием NetworkVariable<int>
Эффекты не работают на мобильных устройствах
Используются тяжёлые материалы и шейдеры
Переключитесь на Mobile/Diffuse, отключите лишние эффекты на слабых устройствах

Дополнительно

  • Можно использовать шаблон Unity-проекта с уже установленным Netcode for GameObjects и примером простого игрока
  • Предложить командам реализовать дополнительные фичи:
    • Асинхронная загрузка уровней
    • Автоматическое определение мощности устройства
    • Система голосового чата
    • Сохранение прогресса в облаке
    • Простой AI с памятью о цели
    • Кастомный инструмент для создания точек спавна в редакторе

Ролевая игра №2: "Эволюция движка — переход на DOTS и оптимизация под миллионы объектов"


Цель игры

Научить студентов работать с ECS (Entity Component System) , Job System , Burst и DOTS Netcode , научиться масштабировать игровые системы и оптимизировать производительность для обработки сотен тысяч объектов .

 

Игра имитирует процесс рефакторинга существующего MonoBehaviour-проекта в архитектуру DOTS.
Учебный акцент:

  • Архитектурные паттерны в ECS
  • Параллельная обработка данных через IJob
  • Сетевая синхронизация через Ghost и NetworkState
  • Оптимизация под консольные и мобильные устройства
 

Формат

  • Тип: Образовательная ролевая игра (настольная/виртуальная)
  • Участники: 5–7 человек
  • Продолжительность: 4 академических часа
  • Материалы: карточки задач, описание ролей, Unity-проект с базовой логикой управления игроком и системой пули
 

Сеттинг

Вы — часть команды инженеров в крупной геймдев-студии. Новый заказчик требует высокопроизводительное приложение , способное одновременно отрисовывать и управлять до 100 000 объектов .

 

На данный момент проект написан на MonoBehaviour, физика и управление реализованы через стандартные методы. Но тестовая сцена работает менее чем на 20 FPS .

 

Вам нужно:

  • Переписать ключевые игровые системы на ECS
  • Реализовать параллельную обработку через Job System
  • Сделать сетевую синхронизацию через DOTS Netcode
  • Добавить редакторские инструменты для настройки параметров
  • Показать значительное увеличение производительности после миграции
 

Роли в команде

Роль
Описание
Архитектор DOTS
Формулирует стратегию миграции, помогает другим участникам понять, как реализовать логику на ECS
Программист ECS
Переписывает движок игрока, ИИ, пули и другие игровые объекты на Entity Component System
Оптимизатор / Performance Engineer
Использует Profiler, Memory Profiler, выявляет瓶颈并提供优化建议
Сетевой программист / DOTS Netcode специалист
Реализует сетевую синхронизацию через DOTS Netcode: спавн, синхронизацию состояний, перемещение, RPC
UI/UX дизайнер
Создаёт интерфейс для диагностики: FPS, количество активных объектов, состояние сети
Менеджер проекта
Следит за сроками, распределяет задачи, проводит встречи
QA / Тестировщик
Проверяет корректность работы после миграции, сравнивает производительность старого и нового кода

Этапы игры

Этап 1: Брифинг и диагностика
  • Геймдизайнер представляет текущий проект: «Существующий шутер-прототип, но он не тянет более 1000 объектов»
  • Архитектор объясняет, как переписать движок на ECS и DOTS
  • Менеджер делит задачи:
    • Фаза 1: Подготовка к миграции на ECS
    • Фаза 2: Перепись движения, физики, пули
    • Фаза 3: Сетевая синхронизация
    • Фаза 4: Тестирование и сравнение производительности
     
  • Команда создаёт доску задач, выстраивает таймер и начинает работу
 
Этап 2: Разработка
  • Каждый участник получает свою часть кода:
    • Программист ECS: реализует движение через Entities.ForEach(), Translation, Rotation
    • Сетевой программист: использует Ghost и NetworkState для передачи данных по сети
    • Оптимизатор: запускает Profiler, проверяет нагрузку до и после
    • UI-дизайнер: создаёт экран статистики — FPS, количество объектов, задержка сети
     
  • QA запускает тестовые сессии и проверяет поведение
  • Каждые 10–15 минут — stand-up встреча
 
Этап 3: Презентация
  • Команда демонстрирует результат:
    • Как изменился FPS?
    • Есть ли синхронизация между клиентами?
    • Какие данные используются в редакторе?
     
  • QA показывает найденные ошибки
  • Менеджер оценивает выполнение плана и проводит итоговую встречу
 

Обучающие эффекты

  • Практика работы с Unity.Entities , IJob , NativeContainer
  • Изучение Job System , Burst Compiler , ParallelFor
  • Написание структур данных вместо классов
  • Реализация синхронизации положения через DOTS Netcode
  • Управление Memory Profiler'ом и профилирование через Unity Profiler
  • Использование Graphics Jobs и Batching
  • Первичное освоение Hybrid Renderer при частичной миграции
  • Работа в условиях ограниченного времени и совместной разработки
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Не получается создать Entity из GameObject
Не подключён ConvertToEntity или не сделана Bake
Проверьте компонент ConvertToEntity и Baker
Не работает управление игроком
Логика не переведена в ISystem
Перепишите поведение через OnUpdate() и Queries
Job System ругается на безопасность памяти
Используются ссылочные типы внутри Job
Переключитесь на NativeArray, NativeList
Нет связи между UI и ECS
События и данные недоступны вне Entity World
Используйте SharedComponentData и EventSystem
Нельзя использовать Transform в Job
Это запрещено в DOTS
Перейдите на LocalTransform или Translation
Не видно объектов после миграции
Hybrid Renderer не настроен правильно
Убедитесь, что установлен и настроен Hybrid Renderer package
Не синхронизируется здоровье
Health не является NetworkVariable
Перепишите через NetworkState и Ghost
Игрок дергается при движении
Нет интерполяции
Добавьте Lerp или Interpolation Delayed Motion
Эффекты не работают
Не поддерживаются в DOTS
Реализуйте собственные системы частиц или используйте Hybrid Renderer
Сложно найти документацию
DOTS всё ещё бета
Используйте официальные примеры и GitHub репозиторий Unity DOTS

Дополнительно

  • Можно использовать шаблон Unity-проекта с уже подготовленным MonoBehaviour-движком
  • Предложить командам реализовать дополнительные фичи:
    • Асинхронная загрузка уровня через Addressables + DOTS
    • Простой AI на основе IJobForEach
    • Визуализация данных через Timeline и Signal System
    • Система сохранения прогресса через Save Data Asset в режиме редактора
    • Автоматическое управление качеством графики под целевое устройство

Ролевая игра №3: "Геймджем — разработка игры за 48 часов"


Цель игры

Научить студентов работать в условиях ограниченного времени, развить навыки быстрого проектирования архитектуры, принятия решений и распределения задач в команде.
Имитировать реальный процесс Game Jam , где нужно:

 
  • За короткий срок создать работающий прототип
  • Спроектировать систему с учётом масштабируемости
  • Реализовать ключевые игровые механики
  • Провести тестирование и презентацию
 

Формат

  • Тип: Образовательная ролевая игра (в формате Game Jam)
  • Участники: 5–7 человек
  • Продолжительность: 4 академических часа (или более, при желании)
  • Материалы: карточки задач, описание ролей, Unity-шаблон (по выбору), таймер обратного отсчёта
 

Сеттинг

Вы — часть студии, которая участвует в геймджеме . Организаторы объявили тему:

«Киберпанк-шутер с уникальной механикой перезапуска времени »

Вам нужно за ограниченное время :

  • Создать игровой прототип
  • Реализовать управление игроком
  • Добавить систему временного перезапуска (например, по нажатию клавиши R)
  • Сделать интерфейс, сохранение состояния и простой ИИ
  • Подготовить презентацию на 3 минуты
 

Роли в команде

Роль
Описание
Геймдизайнер / Тимлид
Формулирует концепцию, делит задачи, следит за соответствием теме
Программист основной логики
Отвечает за движок игрока, прыжки, стрельбу, взаимодействие
Программист системы перезапуска
Реализует механику Time Rewind через сериализацию состояний или Timeline
UI/UX дизайнер
Создаёт HUD, экран паузы, меню рестарта, индикатор заряда способности
Художник / Ассет-менеджер
Находит спрайты, материалы, звуки, помогает с оформлением
Сетевой программист(по желанию)
Добавляет мультиплеерный режим (локальная сеть или Netcode for GameObjects)
QA / Тестировщик
Проверяет работу на разных устройствах, составляет список багов

Этапы игры

Этап 1: Брифинг и планирование (15 мин)
  • Геймдизайнер объявляет тему и задаёт направление
  • Команда обсуждает механику:
    • Игрок может вернуться назад во времени на 5 секунд
    • При этом состояние всех объектов должно восстановиться
  • Менеджер делит задачи:
    • Фаза 1: Управление и базовая механика
    • Фаза 2: Система перезапуска времени
    • Фаза 3: Интерфейс и балансировка
    • Фаза 4: Тестирование и презентация
 
Этап 2: Разработка (основная фаза, 150 мин)
  • Каждый участник получает конкретную задачу:
    • Программист реализует управление через Input System
    • Специалист по времени — систему хранения состояний и восстановления
    • UI-дизайнер создаёт HUD: таймер, кнопки, индикатор зарядки способности
    • QA проверяет работу на нескольких платформах и записывает баги
  • Каждые 20–30 минут — stand-up встреча
  • В конце этапа команда собирает всё в один билд
 
Этап 3: Презентация и ревью (30 мин)
  • Команда запускает игру и демонстрирует:
    • Как работает управление
    • Как активируется перезапуск времени
    • Есть ли UI и обратная связь
     
  • QA показывает найденные проблемы
  • Геймдизайнер оценивает соответствие заданию
  • Все участники кратко рассказывают, что сделали и какие сложности возникли
 

Обучающие эффекты

  • Написание кода под давлением времени
  • Принятие архитектурных решений без полного плана
  • Работа в условиях неопределенности и изменений
  • Практика использования Input System, Animator, UI, Save/Load, Time.timeScale
  • Знакомство с паттернами: Command (для Undo), State Machine, Event Bus
  • Первая презентация своей работы
  • Командная разработка и распределение задач
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Не успеваем сделать всё
Неправильное распределение задач
Используйте минимальный MVP и фокусируйтесь на главном
Перезапуск времени не работает
Не сохраняются данные всех объектов
Используйте сериализацию через ScriptableObject или JSON
UI не обновляется после перемещения во времени
Логика UI не синхронизирована с событиями
Подпишитесь на события через делегаты или EventBus
Игрок не двигается
Нет Rigidbody или Transform блокирован
Проверьте компоненты и условия движения
Сложно найти решение для хранения истории
Нет опыта с паттернами
Используйте очередь (Queue) или массив с записью состояния
ИИ не реагирует
Логика не реализована
Создайте простой FSM ИИ с двумя состояниями: Idle и Attack
Нет связи между скриптами
Нет шины событий
Реализуйте EventBus через статический класс или ScriptableObject
Игрок дергается при перезапуске
Нет интерполяции
Добавьте Lerp или SmoothDamp для плавного перехода
Не понятно, как использовать Timeline
Нет опыта
Попробуйте Signal System или Record Animation
Сложно собрать билд
Не настроены Player Settings
Используйте Build Settings → Switch Platform и проверьте Scene in Build

Дополнительно

  • Можно использовать шаблон Unity-проекта с уже подготовленным игроком и камерой
  • Предложить командам реализовать дополнительные фичи:
    • Сохранение прогресса через PlayerPrefs
    • Система очков и лидерборда
    • Простая система здоровья и смерти
    • Счётчик времени до следующего возможного перезапуска
    • Анимация при активации способности

Ролевая игра №4: "Игровой движок под заказ — разработка архитектуры с нуля"


Цель игры

Научить студентов проектировать масштабируемую и тестируемую архитектуру Unity-проекта на уровне Senior / Lead , включая:

 
  • Применение паттернов проектирования (Strategy, State, Command, Observer, Mediator)
  • Разделение слоёв (Domain, Application, Infrastructure)
  • Использование Dependency Injection через Zenject или собственную реализацию
  • Работа с чистым кодом и отделением логики от фреймворка
  • Создание систем, подходящих для долгосрочной поддержки
 

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

 

Формат

  • Тип: Образовательная ролевая игра, в формате «разработка движка»
  • Участники: 6–8 человек
  • Продолжительность: 4–5 академических часов
  • Материалы: карточки задач, описание ролей, минимальный Unity-шаблон без игровой логики
 

Сеттинг

Вы — команда Senior-разработчиков в студии, которая получает задание от руководства:

 

«Нам нужен универсальный игровой движок , который можно будет использовать как основу для будущих проектов. Он должен быть **архитектурно чистым, легко масштабируемым и пригодным к тестированию».

Ваша задача:

  • Спроектировать модульную структуру
  • Реализовать системы , которые будут повторно использоваться
  • Выбрать и применить паттерны проектирования
  • Сделать всё это за ограниченное время
  • Представить документацию и демо-пример использования
 

Роли в команде

Роль
Описание
Архитектор / Тимлид
Формулирует общий подход, определяет паттерны, устанавливает правила проектирования
Программист Domain-логики
Пишет бизнес-логику вне MonoBehaviour, использует интерфейсы и абстракции
Программист инфраструктуры
Подключает Unity API, работает с физикой, UI, ресурсами
UI/UX дизайнер
Создаёт интерфейс, который показывает работу системы
Сетевой программист(по желанию)
Добавляет сетевые функции, если требуется демонстрация мультиплеера
QA / Тестировщик
Проверяет работоспособность, составляет список багов и предложений
Документатор / Tech Writer
Записывает ключевые решения, создаёт примеры использования и UML-диаграммы
Менеджер проекта
Контролирует сроки, помогает в планировании, проводит встречи

Этапы игры

Этап 1: Брифинг и проектирование (20 мин)
  • Архитектор представляет общую концепцию:
    • Чистая архитектура
    • Модульные компоненты: игрок, камера, UI, сохранения, события
     
  • Команда делит задачи:
    • Фаза 1: Проектирование слоёв и выбор паттернов
    • Фаза 2: Реализация Core систем (движок игрока, события, сохранения)
    • Фаза 3: Интеграция инфраструктурного кода (Unity API, UI, Input System)
    • Фаза 4: Демонстрация и документирование
     
  • Все участники получают свои роли, доска задач заполнена, начинается обратный отсчёт времени
 
Этап 2: Разработка (основная фаза, ~120 мин)
  • Каждый участник получает конкретную задачу:
    • Архитектор: создаёт диаграмму классов, объясняет принципы разделения слоёв
    • Программист Domain: реализует логику игрока, событий, инвентаря
    • Программист инфраструктуры: пишет адаптеры для Unity API
    • UI-дизайнер: делает HUD, экран паузы, меню
    • QA: проверяет работу, выявляет проблемы
    • Документатор: описывает ключевые классы, методы, примеры использования
     
  • Каждые 20 минут — stand-up встреча
  • В конце этапа — сборка билда и подготовка презентации
 
Этап 3: Презентация и ревью (20 мин)
  • Команда демонстрирует прототип:
    • Какие системы реализованы?
    • Как они взаимодействуют?
    • Есть ли документация и примеры использования?
     
  • QA представляет найденные проблемы
  • Тимлид и менеджер дают обратную связь по выполнению
 

Обучающие эффекты

  • Практика работы с чистой архитектурой
  • Изучение и применение паттернов проектирования уровня Senior
  • Написание тестируемых систем вне MonoBehaviour
  • Разделение проекта на слои Domain / Application / Infrastructure
  • Управление зависимостями через DI (Zenject или собственный механизм)
  • Создание EventBus'а или сервиса сообщений
  • Первичное освоение UML и диаграмм архитектуры
  • Работа в условиях жёсткого ограничения по времени
  • Первая практика документирования кода и архитектуры
  • Опыт совместной разработки с разделением ответственности
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Не понятно, как отделить логику от Unity
Отсутствие знаний о чистой архитектуре
Используйте интерфейсы и абстракции, внедряйте зависимости
Игрок не двигается
Логика написана в Domain, но не подключена к Unity
Реализуйте Infrastructure-адаптеры для Transform, Rigidbody и Input
События не работают между системами
Нет шины событий
Создайте EventBus через делегаты или ScriptableObject
Нет связи между UI и состоянием игрока
UI привязан к MonoBehaviour
Используйте события или подписывайтесь через DI
Не хватает времени на всё
Слишком много задач
Сфокусируйтесь на MVP: главное — архитектура и работа базовой механики
Сложно понять, как внедрять зависимости
Нет опыта с DI
Используйте Composite Root и простое внедрение через инспектор
Нет документации по реализации
Не предусмотрено заранее
Назначьте технического писателя, пусть он следит за описанием кода
Сложно представить, как будет расти система
Нет UML и диаграмм
Используйте белую доску для проектирования перед началом разработки
Испытания в команде
Нет чёткого плана
Введите Daily Stand-up и регулярные встречи для координации

Дополнительно

  • Можно использовать шаблон Unity-проекта с уже подготовленными префабами и пустыми скриптами
  • Предложить командам реализовать дополнительные фичи:
    • Система предметов и инвентарь
    • Сохранение прогресса в JSON
    • Простая система квестов
    • Головоломка или триггер
    • Анимационная система через AnimationState
    • Сетевая версия с синхронизацией движения

Интеллект-карта №1: "Путь Senior Unity-разработчика"

Центральный узел : Unity – разработчик (Senior)

Уровень 1: Язык программирования C#

  • Паттерны проектирования
    • Singleton, Factory, Strategy, Command, Observer, Mediator, Visitor
  • Продвинутый уровень ООП
    • Интерфейсы, абстрактные классы, обобщения
  • Работа с событиями и делегатами
  • Асинхронное программирование (async/await, Task, CancellationToken)
  • Безопасность памяти и управление ссылками
 

Уровень 2: Архитектура проектов

  • Чистая архитектура
    • Domain / Application / Infrastructure
  • Dependency Injection
    • Zenject, собственная реализация DI через Composite Root
  • Событийная модель
    • EventBus, IMessageHandler
  • Разделение логики от Unity API
    • Использование интерфейсов и тестовых объектов
 

Уровень 3: DOTS — Data-Oriented Tech Stack

  • ECS (Entity Component System)
    • Entity, Component, System
  • Job System
    • IJob, NativeArray, ParallelFor
  • Burst Compiler
    • SIMD, оптимизация вычислений
  • Hybrid Renderer
    • Переход к DOTS без полной переписи кода
 

Уровень 4: Сетевые системы

  • Netcode for GameObjects
    • NetworkObject, NetworkVariable, ServerRpc/ClientRpc
  • DOTS Netcode
    • Ghost, NetworkState, NetworkSceneManager
  • Серверная логика
    • Dedicated Server, Relay, NAT Punchthrough
  • Мультиплеерные механики
    • Синхронизация состояний, спавн, репликация данных
 

Уровень 5: Графика и шейдеры

  • Shader Graph
    • Создание шейдеров без HLSL
  • VFX Graph
    • Визуальные эффекты, частицы, свет
  • Compute Shaders
    • Расчёт физики, постобработка, генерация на GPU
  • Оптимизация графики
    • Draw Call Batching, GPU Instancing, LOD, Texture Compression
 

Уровень 6: Редакторские расширения

  • Custom Editor
    • [CustomEditor], OnInspectorGUI
  • PropertyDrawer
    • Кастомный вывод полей в инспекторе
  • ScriptableWizard
    • Автоматизация создания объектов
  • EditorWindow
    • Создание окон внутри редактора
  • UI Toolkit + UXML/USS
    • Декларативное создание интерфейса редакторских инструментов
 

Уровень 7: Производительность и оптимизация

  • Unity Profiler
    • CPU Usage, GPU Usage, Memory, Rendering
  • Garbage Collector
    • Избежание аллокаций, использование NativeContainer
  • IL2CPP
    • Особенности работы, ограничения
  • Addressables и AssetBundles
    • Асинхронная загрузка, управление зависимостями
  • Object Pooling
    • Эффективное управление объектами во время игры
 

Уровень 8: Искусственный интеллект

  • FSM (Finite State Machine)
    • Реализация поведения ИИ
  • Utility AI
    • Выбор действий на основе веса
  • GOAP (Goal-Oriented Action Planning)
    • План действий для достижения цели
  • ML-Agents
    • Обучение ИИ через машинное обучение
 

Уровень 9: CI/CD и DevOps

  • Jenkins, GitHub Actions, GitLab CI
    • Настройка автоматических сборок
  • Unity Cloud Build
    • Автоматизация билдов под платформы
  • Unit и Integration тесты
    • Тестирование игровой логики вне редактора
  • Версионирование и документирование
    • Changelog, README, Wiki, API-документация
 

Уровень 10: Управление командой

  • Agile / Scrum / Kanban
    • Проведение встреч, планирование спринтов
  • Git и работа в команде
    • Merge, Rebase, Branching, Conflict Resolution
  • Code Review
    • Best Practices, Clean Code, Refactoring
  • Коммуникация
    • Передача задач, технические совещания, презентации
 

Интеллект-карта №2: "Сетевая игра уровня Senior"

Центральный узел : Сетевая игра (Netcode for GameObjects + DOTS Netcode)

Уровень 1: Основы сетевой разработки

  • Host Mode vs Dedicated Server
  • Подключение игроков
  • Синхронизация времени и состояния
 

Уровень 2: Базовые компоненты

  • NetworkManager
  • NetworkObject
  • NetworkVariable<T>
  • ServerRpc / ClientRpc
  • NetworkSceneManager
 

Уровень 3: Сетевые события

  • Синхронизация здоровья
  • Спавн и деспавн объектов
  • Система сообщений между клиентами
  • Сетевое взаимодействие с ИИ
 

Уровень 4: Продвинутые темы

  • Ghost и NetworkState
  • Snapshot Interpolation
  • Predictive Movement
  • Сетевой чат и голосовая связь
  • Matchmaking и Relay
 

Уровень 5: Архитектурные подходы

  • Чистая архитектура в сетевой игре
  • Сетевые события через EventBus
  • Отделение игровой логики от серверной
  • Работа с историей действий (Rollback, Rewind)
 

Уровень 6: Тестирование и масштабируемость

  • Локальное тестирование мультиплеера
  • Нагрузочное тестирование
  • Поддержка 100+ игроков
  • Сетевая безопасность и античит
 

Интеллект-карта №3: "Продвинутая оптимизация Unity-проекта"

Центральный узел : Оптимизация производительности

Уровень 1: Unity Profiler

  • CPU Usage
  • GPU Usage
  • Memory
  • Rendering
  • Physics
  • GC Alloc
 

Уровень 2: Управление памятью

  • Избегание аллокаций в Update()
  • Использование NativeContainer
  • Пул объектов (Object Pooling)
  • Уменьшение частоты вызова GC
 

Уровень 3: Графическая оптимизация

  • Draw Calls и их объединение
  • Sprite Atlas
  • Texture Compression
  • GPU Instancing
  • LOD и батчинг
 

Уровень 4: Физика и коллайдеры

  • Layer Collision Matrix
  • Trigger вместо Collider, где возможно
  • Использование Physic Material
  • Работа с Physics.Simulate()
 

Уровень 5: Анимации и UI

  • Animator Controller и параметры
  • Timeline и Signal System
  • Canvas Scaler и Reference Resolution
  • TextMeshPro вместо стандартного Text
  • UI Builder и адаптивный дизайн
 

Уровень 6: Скрипты и логика

  • Использование static class, если не нужен MonoBehaviour
  • Использование struct вместо class
  • Использование ReadOnly и WriteOnly при работе с данными
  • Отказ от Invoke и корутин в пользу async/await и Job System
 

Уровень 7: Мобильная оптимизация

  • IL2CPP
  • AOT и статические конструкторы
  • Отключение лишних функций
  • Упрощённая графика и физика
  • Определение мощности устройства
 

Интеллект-карта №4: "От идеи до прототипа — Game Jam за 48 часов"

Центральный узел : Геймджем — прототип за 48 часов

Уровень 1: Планирование

  • Тема и концепция
  • MVP (минимально жизнеспособный продукт)
  • Разделение ролей
  • Расписание этапов
 

Уровень 2: Игровая механика

  • Управление игроком
  • Простой ИИ
  • Стрельба или взаимодействие
  • Сохранение прогресса
 

Уровень 3: UI/UX

  • HUD
  • Экран паузы
  • Кнопки и меню
  • Связь с игровыми системами
 

Уровень 4: Архитектура

  • Отделение логики от Unity API
  • Использование интерфейсов
  • EventBus для связи между системами
  • MVP подход к разработке
 

Уровень 5: Тестирование и презентация

  • QA и проверка на разных устройствах
  • Запись демонстрационного видео
  • Презентация проекта
  • Получение обратной связи
 

Уровень 6: Полезные практики

  • Daily Stand-up
  • Быстрый прототип перед детальной реализацией
  • Минимизация зависимости от MonoBehaviour
  • Использование готовых решений (плагины, Template Project)
 

Интеллект-карта №5: "Технический долг и рефакторинг в Unity"

Центральный узел : Технический долг и рефакторинг

Уровень 1: Что такое технический долг?

  • Причины возникновения
  • Последствия: снижение производительности, сложность поддержки, увеличение ошибок
  • Как измерить: Code Smell, Cyclomatic Complexity, GC Allocations
 

Уровень 2: Причины появления TD

  • Сжатые сроки
  • Отсутствие тестов
  • Жёсткая связанность
  • Плохое документирование
  • Закрытие задач «на скорую руку»
 

Уровень 3: Инструменты анализа

  • Unity Profiler
  • Rider / ReSharper (анализ кода)
  • SonarQube (по желанию)
  • Git History (обнаружение Legacy кода)
 

Уровень 4: Рефакторинг

  • Extract Method / Class
  • Replace Temp with Query
  • Remove Duplication
  • Encapsulate Field
  • Introduce Parameter Object
 

Уровень 5: Архитектурные улучшения

  • Применение паттернов проектирования
  • Разделение слоёв (Clean Architecture)
  • Использование DI и инъекции зависимостей
  • Упрощение MonoBehaviour
 

Уровень 6: Тестирование после рефакторинга

  • Unit-тесты
  • Integration-тесты
  • Play Mode и Edit Mode тесты
  • UI Test Runner
 

Уровень 7: Долгосрочные решения

  • Чистый код
  • Документирование
  • Code Review
  • Стандарты написания кода
  • Шаблоны и чек-листы

1. Учебное пособие

Название: Архитектурные паттерны в Unity-разработке
Автор: Алексей Белов
Год издания: 2023
Краткое описание:
Углублённое руководство по применению паттернов проектирования (Strategy, Command, Mediator, Visitor) в Unity на уровне Senior. Включает примеры реализации чистой архитектуры, Dependency Injection через Zenject, работу с событийной моделью и разделение слоёв Domain / Application / Infrastructure.

2. Методические рекомендации

Название: Разработка масштабируемых игровых систем: методология и практика обучения Senior-разработчиков
Автор: Российская академия цифровых технологий
Год издания: 2024
Краткое описание:
Методическое пособие для преподавателей курсов повышения квалификации. Содержит рекомендации по обучению Senior-разработчиков работе с ECS, Job System, Burst, DOTS Netcode, UI Toolkit, оптимизации под консоли и мобильные устройства. Предусмотрены кейсы, ролевые игры и экзаменационные билеты.

3. Задачник

Название: Практикум по оптимизации и производительности в Unity
Автор: Иван Петров, Сергей Николаев
Год издания: 2022
Краткое описание:
Сборник задач по работе с Profiler'ом, Memory Profiler, Garbage Collector, IL2CPP, GPU Instancing, Addressables, ScriptableObject и NativeContainer. Включает задания по сетевой синхронизации, шейдерам, Compute Shaders и многопоточности.

4. Хрестоматия

Название: Современные подходы к разработке игр: взгляд от теории к практике
Составитель: Джефф Орлинг
Год издания: 2021
Краткое описание:
Подборка статей, докладов GDC и технических блогов, посвящённых архитектуре, производительности и командной разработке. Темы: переход на DOTS, оптимизация графики, работа с редакторскими расширениями, сетевая логика в AAA-проектах, машинное обучение в игровом ИИ.

5. Научная литература

Название: Высокопроизводительная разработка игр: внутреннее устройство движков и оптимизация кода
Автор: Джон Карделл
Год издания: 2020
Краткое описание:
Фундаментальный труд по внутреннему устройству игровых движков, включая управление памятью, физический движок, графическую подсистему, многопоточность и компиляцию. Подходит для углублённого изучения низкоуровневых механизмов Unity и других движков.

  1. Unity – разработчик (Senior)
    Курс для профессиональных разработчиков, углубляющий знания в архитектуре, сетевых системах, DOTS, шейдерах и оптимизации под консоли.

  2. Создание многопользовательских игр на Netcode for GameObjects
    Научитесь проектировать, реализовывать и тестировать сетевые системы на базе Netcode for GameObjects и DOTS Netcode.

  3. Разработка высокопроизводительных игр с ECS и Job System
    Изучите Entity Component System, работу с Job System и Burst Compiler для создания масштабируемых и быстрых игровых решений.

  4. Продвинутые паттерны проектирования в Unity
    Ознакомьтесь с Strategy, Command, Mediator, Visitor и их применением в чистой архитектуре проектов уровня Senior.

  5. Unity UI Toolkit: продвинутые интерфейсы и редакторские инструменты
    Освоение UXML и USS для создания сложных динамических интерфейсов и расширения возможностей Unity Editor.

  6. Оптимизация графики в Unity под мобильные и консольные платформы
    Узнайте, как уменьшить нагрузку на GPU, использовать Texture Compression, GPU Instancing и Sprite Atlas.

  7. Шейдеры и графика уровня AAA: от Shader Graph до Compute Shaders
    Изучите написание шейдеров, использование HLSL, VFX Graph и Compute Shaders для создания визуально насыщенных эффектов.

  8. Сетевой движок Unity: от простых соединений к масштабируемым решениям
    Научитесь строить надёжную и производительную сетевую логику, подходящую для командной игры и серверных решений.

  9. Unity и машинное обучение: ML-Agents и ИИ следующего поколения
    Интеграция ML-Agents, обучение ИИ, создание адаптивного поведения через искусственные нейронные сети.

  10. Работа с Profiler'ом и Memory Profiler: диагностика и оптимизация
    Практики использования Unity Profiler, анализа производительности, выявления аллокаций и минимизации GC.

  11. Создание собственных инструментов в Unity Editor
    Разработка окон, кастомных инспекторов, расширений через IMGUI, PropertyDrawer, ScriptableObject и UI Toolkit.

  12. DOTS Netcode: синхронизация состояний и объектов в реальном времени
    Изучите миграцию сетевой логики на DOTS, работу с Ghost, NetworkState и сетевой физикой.

  13. Физика и столкновения уровня Senior: от Rigidbody к Havok Physics
    Работа с физическим движком Unity, настройка Layer Collision Matrix, переход на Havok Physics и оптимизация.

  14. IL2CPP и Native Code: особенности и ограничения C# в Unity
    Анализ работы IL2CPP, ограничения по Reflection, сериализации и управлению памятью при работе на мобильных и консольных платформах.

  15. Геймплейное программирование: от FSM к Utility AI и GOAP
    Реализация сложного поведения ИИ через Behaviour Tree, Utility AI, GOAP и машинное обучение.

  16. Shader Graph и Visual Effect Graph: визуальное программирование графики
    Создание шейдеров без кодирования, работа с визуальными эффектами, постобработкой и Particle Systems.

  17. Unity и CI/CD: автоматизация билдов, тестов и деплоя
    Интеграция Jenkins, GitHub Actions, Unity Cloud Build, автоматическое тестирование и управление версиями.

  18. UI Toolkit и продвинутая работа с интерфейсом в Unity
    Создание гибких и декларативных интерфейсов через UXML и USS. Подходит для редакторских расширений и мобильных приложений.

  19. Работа с Timeline и Signal System: кат-сцены и события
    Изучите создание временных последовательностей, триггеров событий, синхронизации с анимацией и звуком.

  20. Внедрение Dependency Injection и Composite Root в Unity-проекты
    Практики внедрения зависимостей, Zenject, Manual DI, Service Locator и организация Composite Root в MonoBehaviour-ориентированной среде.

  21. Создание и использование ScriptableObject для хранения данных и состояний
    Работа с данными вне сцен, реализация предметов, состояний, параметров и событий через ScriptableObject.

  22. Продвинутая физика и детекторы столкновений в Unity
    Точная настройка коллайдеров, триггеров, Raycast, Continuous Collision Detection и Layer Matrix.

  23. Работа с Addressables и AssetBundles: управление ассетами
    Изучение динамической загрузки, управления зависимостями, кэширования и организации контента в крупных проектах.

  24. Рефакторинг Legacy-проектов: от прототипа к Production-готовому коду
    Методы обновления старого кода, улучшение читаемости, документирования и тестирования проектов.

  25. Профессиональный уровень: управление техническим долгом и командой разработки
    Стандарты кодирования, работа с Git на уровне Senior, проведение Code Review, организация процессов DevOps и Agile в студии.

Заявка ученика, студента, слушателя
Заявка преподавателя, репетитора админу сети.
23:55
4
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.