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

Курс предназначен для тех, кто уже владеет основами Unity и хочет выйти на новый уровень. Вы изучите продвинутую работу с анимацией, системой физики, UI/UX, паттерны проектирования, оптимизацию проектов и командную разработку. Курс поможет перейти от создания прототипов к полноценным игровым системам.

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

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

 

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

Модуль 1: Продвинутое программирование на C#

  • Работа с делегатами, событиями, лямбда-выражениями
  • Использование Generic-типов и коллекций
  • Асинхронное программирование (async/await)
  • Понятие владения памятью и управление ссылками
 

Модуль 2: Паттерны проектирования в Unity

  • Singleton, Factory, Observer, State, Command
  • Реализация через интерфейсы и абстракции
  • Практика применения паттернов в игровых системах
 

Модуль 3: Системы игры

  • Управление состояниями персонажа (Finite State Machine)
  • Сложные механики взаимодействия объектов
  • Система предметов, инвентаря и использования
  • Создание и работа с квестовой системой
 

Модуль 4: UI/UX и анимации

  • Advanced работы с Canvas и TextMeshPro
  • Динамический интерфейс (меню, HUD, экран паузы)
  • Сложные анимации через Animator и ScriptableObjects
  • Связь анимаций с игровыми состояниями
 

Модуль 5: Физика и коллизии

  • Работа с физическим движком на продвинутом уровне
  • Написание собственных систем детекторов столкновений
  • Использование Layer Collision Matrix
  • Триггерные зоны и реакция на них
 

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

  • Работа с Profiler'ом
  • Оптимизация Draw Calls и памяти
  • Object Pooling
  • Адаптация под мобильные устройства
 

Модуль 7: Многопоточность и корутины

  • Продвинутое использование корутин
  • Работа с потоками (Thread), ограничения в Unity
  • Использование Job System и Burst (на базовом уровне)
 

Модуль 8: Работа в команде

  • Разделение ответственности между членами команды
  • Совместная работа с Git
  • Работа с префабами, ассетами, версионированием
  • Code Review и документирование кода
 

Финальный проект

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

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

Должен знать:
  • Продвинутые возможности языка C#
  • Распространённые паттерны проектирования и их применение в Unity
  • Как устроены игровые системы и как их проектировать
  • Принципы оптимизации графики и производительности
  • Основы многопоточной обработки задач
  • Особенности работы с большим количеством ассетов и командная разработка
 
Должен уметь:
  • Проектировать гибкие и расширяемые игровые системы
  • Реализовывать сложную логику поведения персонажей и объектов
  • Работать с UI/UX на профессиональном уровне
  • Писать эффективный и чистый код
  • Оптимизировать игру под целевые платформы
  • Использовать Git для совместной разработки
  • Применять асинхронную загрузку ресурсов и работу с потоками
 
Дополнительно:
  • Понимать принципы масштабируемости и тестируемости кода
  • Уметь использовать ScriptableObject для хранения данных
  • Знать, как работают AssetBundle и Addressables
  • Уметь создавать собственные инструменты и редакторские расширения
 

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

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

  1. Что такое паттерн Singleton и в каких случаях его стоит использовать в Unity?
    Singleton — это порождающий паттерн, гарантирующий существование только одного экземпляра класса и предоставляющий глобальную точку доступа к нему. В Unity используется для менеджеров (звук, сохранения, управление сценой), где требуется один общий объект. Однако злоупотребление может привести к проблемам тестируемости и зависимости.

  2. Охарактеризуйте работу делегатов и событий в C#.
    Делегаты — это типы, которые ссылаются на методы. События — это механизм, позволяющий подписываться на вызов делегата извне, но не вызывать его напрямую. Используются для реализации систем событий, таких как UI-кнопки, изменения состояний персонажей, триггеры.

  3. Как работают Generic-типы и зачем они нужны?
    Generic-типы позволяют создавать классы, методы и структуры, которые могут работать с любыми типами данных без потери типобезопасности. Они помогают избежать дублирования кода и улучшают производительность, особенно при работе с коллекциями.

  4. Что такое интерфейсы и как их использовать в игровых системах?
    Интерфейсы определяют контракт поведения, который должны реализовать классы. Они полезны для абстракции, когда разные типы объектов должны иметь одинаковый функционал (например, IInteractable для взаимодействия).

  5. Что такое асинхронное программирование и как оно реализуется в C#?
    Асинхронное программирование позволяет выполнять задачи параллельно, не блокируя основной поток. В C# используется async/await, что удобно для загрузки ресурсов, сетевых запросов или сложных вычислений.

  6. Что такое Finite State Machine и как она применяется в Unity?
    FSM (конечный автомат) — это модель поведения, которая имеет ограниченное количество состояний и правила перехода между ними. В Unity FSM часто используется для реализации поведения ИИ: бег, атака, защита и т.д.

  7. Что такое Observer и как он применяется в Unity?
    Observer — это поведенческий паттерн, позволяющий одному объекту уведомлять другие объекты о произошедших изменениях. В Unity реализуется через события и делегаты, например, для обновления интерфейса при изменении здоровья.

  8. Как работает система Layer Collision Matrix в Unity?
    Это инструмент, позволяющий указать, какие слои взаимодействуют друг с другом. Полезен, когда нужно отключить столкновение между конкретными группами объектов, например, игрок и пули своего же типа.

  9. Что такое ScriptableObject и в чём его преимущества перед обычными классами?
    ScriptableObject — это объект данных, который можно сохранить как ассет. Он позволяет хранить данные вне сцен, делиться ими между объектами и легко редактировать в инспекторе.

  10. Какие существуют способы оптимизации Draw Calls в Unity?
    Draw Call — это команда GPU на отрисовку объекта. Чтобы уменьшить их количество: объединять спрайты в Sprite Atlas, использовать Static Batching, группировать объекты с одинаковыми материалами и шейдерами.

  11. Что такое Object Pooling и зачем он нужен?
    Object Pooling — это паттерн управления объектами, при котором заранее создаются экземпляры, которые переиспользуются вместо постоянного создания и удаления. Уменьшает нагрузку на GC, особенно при частом появлении объектов (пули, эффекты).

  12. Что такое Job System и какие ограничения он имеет?
    Job System — это система Unity для выполнения задач в отдельных потоках. Требует соблюдения ограничений безопасности памяти, запрещает использование Unity API из потока и требует работы с NativeContainer.

  13. Что такое Addressables и чем они отличаются от Resources?
    Addressables — это система динамической загрузки ассетов, поддерживающая локальные и удалённые источники. В отличие от Resources, они дают больше контроля над загрузкой и выгрузкой, поддерживают зависимые ассеты и кэширование.

  14. Что такое Profiler и как им пользоваться для оптимизации игры?
    Profiler — это инструмент диагностики, позволяющий анализировать потребление CPU, GPU, памяти и других ресурсов. Позволяет находить "узкие места" и оптимизировать производительность.

  15. Что такое Garbage Collector и как минимизировать его влияние в Unity?
    Garbage Collector (GC) — сборщик мусора, освобождает память от неиспользуемых объектов. Его работа может вызвать фризы. Чтобы минимизировать влияние, следует избегать частого создания временных объектов и использовать pooling.

  16. Как работает корутина и чем она отличается от асинхронного кода?
    Корутина — это метод, который может приостанавливать своё выполнение. Используется внутри Unity для задержек и последовательного выполнения. Асинхронный код (async/await) работает вне Unity Main Thread и требует осторожного использования.

  17. Что такое MonoBehaviour и почему нельзя создавать его в отдельном потоке?
    MonoBehaviour — базовый класс всех скриптов в Unity, связанный с GameObject. Он не потокобезопасен, так как весь движок Unity работает в основном потоке. Работа с ним в потоке вызывает ошибки.

  18. Что такое AssetBundle и зачем он нужен?
    AssetBundle — это контейнер, содержащий ресурсы, загружаемые во время выполнения. Используется для снижения размера начальной загрузки, динамического обновления контента и гибкости в доставке.

  19. Какие виды коллайдеров есть в 2D и 3D и в чём их различие?
    В 2D: BoxCollider2D, CircleCollider2D, PolygonCollider2D. В 3D: BoxCollider, SphereCollider, CapsuleCollider. Разница в том, что 2D коллайдеры работают с Rigidbody2D и физикой 2D, 3D — с Rigidbody и физикой 3D.

  20. Что такое EventSystem и как он работает в Unity UI?
    EventSystem — это компонент, управляющий взаимодействием с UI. Он обрабатывает события мыши, клавиатуры и сенсоров. Без него UI-элементы не будут реагировать на действия пользователя.

  21. Как работают параметры Animator и какие типы бывают?
    Animator Controller использует параметры (bool, int, float, trigger) для управления переходами между анимациями. Trigger — это одноразовое событие, которое сбрасывается автоматически.

  22. Что такое Canvas Scaler и какие режимы он поддерживает?
    Canvas Scaler регулирует масштаб интерфейса под разные разрешения экрана. Режимы: Constant Pixel Size (размер не меняется), Scale With Screen Size (масштабируется по разрешению), Constant Physical Size (размер в миллиметрах).

  23. Что такое TextMeshPro и чем он лучше стандартного Text?
    TextMeshPro — это расширенный текстовый элемент, предлагающий лучшее качество рендеринга, поддержку шрифтов, эффектов (свечения, затенения), символы Unicode и более гибкое форматирование.

  24. Что такое Raycast и как его использовать в Unity?
    Raycast — это «луч», выпускаемый из точки в заданном направлении. Используется для обнаружения столкновений, например, для стрельбы, выбора объекта мышью, проверки земли под персонажем.

  25. Как реализовать систему инвентаря в Unity?
    Система инвентаря обычно включает класс Item (свойства предмета), список или словарь для хранения предметов, UI для отображения. При добавлении предмета проверяется вместимость, затем обновляется UI. Возможно использование ScriptableObject для хранения данных предметов.

  26. Что такое State Machine и как её реализовать в Unity?
    State Machine — это модель поведения, которая определяет состояния объекта и переходы между ними. В Unity можно реализовать через enum и switch-логику, отдельные классы для каждого состояния или с использованием паттерна State. Применяется для управления ИИ, персонажами, игровыми состояниями.

  27. Как работают асинхронные загрузки сцен в Unity и зачем они нужны?
    Асинхронная загрузка сцен выполняется через SceneManager.LoadSceneAsync(). Она позволяет загружать сцены без зависания игры, что особенно важно при больших объемах данных. Можно добавить прогресс-бар или фоновую логику во время загрузки.

  28. Что такое MonoBehaviour и какие основные ограничения он имеет?
    MonoBehaviour — базовый класс для всех скриптов, привязанных к GameObject. Основные ограничения: нельзя создавать экземпляры напрямую (только через GameObject), нельзя использовать в потоках, работает только внутри Unity Main Thread.

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

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

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

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

  33. Как реализовать систему сохранения и загрузки игры через PlayerPrefs?
    PlayerPrefs позволяет хранить простые данные (int, float, string). Для сохранения игры нужно сериализовать данные в JSON и сохранить строкой. При загрузке — считать строку и десериализовать обратно в объекты.

  34. Что такое Scriptable Object и как его использовать для хранения данных предметов?
    ScriptableObject — это ассет, который может хранить данные вне сцен. Для предметов создаётся класс Item : ScriptableObject с полями (название, описание, иконка, тип и т.д.). Такие данные легко редактировать и использовать в разных частях игры.

  35. Что такое Pooling и как его реализовать в Unity?
    Pooling — это паттерн, при котором объекты создаются заранее и переиспользуются. Реализуется через список активных/неактивных объектов. При необходимости берётся неактивный, при удалении — помечается как неактивный, а не уничтожается.

  36. Что такое AssetBundle и как его использовать для динамической загрузки контента?
    AssetBundle — это бандл ассетов, который можно загружать по сети или с диска. После сборки бандла он загружается через AssetBundle.LoadFromFile() или WWW/UnityWebRequest, затем извлекаются нужные объекты.

  37. Как работает Input System и чем он лучше старого Input Manager’а?
    Input System — это современная система ввода от Unity, поддерживающая гибкую настройку действий, устройств и их обработки. В отличие от старого Input Manager’а, позволяет легко менять схемы управления и поддерживает новые устройства.

  38. Что такое Animator Override Controller и когда он применяется?
    Animator Override Controller позволяет заменять анимации в существующем Animator Controller'е без изменения оригинала. Часто используется для персонажей с разными наборами анимаций, но одинаковой логикой переходов.

  39. Что такое Coroutines и как они взаимодействуют с жизненным циклом Unity?
    Coroutines — это методы, которые могут приостанавливаться и продолжаться. Они запускаются в контексте MonoBehaviour и останавливаются при уничтожении объекта. Не являются многопоточными, но удобны для задержек и последовательной логики.

  40. Что такое Burst и как он помогает в производительности?
    Burst — это компилятор от Unity, который оптимизирует код, написанный на C#, до высокоэффективного машинного кода. Особенно полезен при работе с Job System, где требуются высокая производительность и безопасность памяти.

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

  42. Что такое Event Trigger и как его использовать в UI?
    EventTrigger — это компонент, позволяющий обрабатывать сложные события UI (наведение мыши, клик, колесо и др.) через UnityEvent. Полезен, когда стандартных возможностей Button недостаточно.

  43. Что такое Animation Rigging и как его использовать?
    Animation Rigging — это система, позволяющая изменять анимацию на лету, например, следить за курсором или корректировать положение рук. Используется через Rig Builder и дополнительные Constraint-ы.

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

  45. Что такое DOTween и как его использовать в проекте?
    DOTween — популярная библиотека для создания анимаций и движений. Позволяет плавно перемещать объекты, менять параметры цвета, масштаба и т.д. Используется через цепочки вызовов: transform.DOMove(...).SetDelay(...);

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

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

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

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

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

  51. Что такое Addressables.InitializeAsync() и зачем он нужен?
    InitializeAsync() — это метод, который инициализирует систему Addressables перед первой загрузкой. Обязателен при первом использовании Addressables и может содержать настройки загрузки (локально, удалённо и т.д.).

  52. Что такое Code Smell и как его избежать в Unity?
    Code Smell — это признак плохого дизайна кода (например, длинные методы, дублирование, жёсткая связь). Чтобы избежать: применять SOLID, делить логику на модули, использовать паттерны проектирования.

  53. Что такое Dependency Injection и как его использовать в Unity?
    Dependency Injection — это подход, при котором объект получает свои зависимости извне, а не создаёт их сам. В Unity можно реализовать через ручное назначение ссылок или сторонние фреймворки, такие как Zenject.

  54. Что такое ECS и какие компоненты входят в Unity DOTS?
    ECS (Entity Component System) — это архитектурный подход, ориентированный на производительность и параллелизм. Unity DOTS включает: Entities, Jobs System, Burst, Collections. Используется для оптимизации и работы с большими объёмами данных.

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

  56. Что такое MonoBehaviour.Invoke и в чём его ограничения?
    Invoke — это метод, запускающий другой метод через заданный интервал. Ограничения: не поддерживает передачу параметров, сложно управлять множественными вызовами, может быть трудно отладить.

  57. Что такое Animation Events и как их использовать?
    Animation Events — это событие, которое вызывается в определённый момент анимации. Добавляются в окне анимации, вызывают методы в скрипте. Используются для воспроизведения звуков, запуска частиц, изменения состояний.

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

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

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

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

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

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

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

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

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

  67. Что такое Singleton и как сделать его потокобезопасным?
    Singleton — это паттерн, гарантирующий один экземпляр класса. Для потокобезопасности используются блокировки (lock), Lazy<T>, или реализация через static class, чтобы исключить одновременный доступ из разных потоков.

  68. Что такое Composite Root и как его использовать в Unity?
    Composite Root — это точка, где создаются и соединяются все зависимости. В Unity это MonoBehaviour, где создаются объекты и внедряются зависимости, формируя дерево. Позволяет избежать глобальных точек доступа и повысить тестируемость.

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

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

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

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

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

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

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

  76. Что такое NetworkObject и как его использовать?
    NetworkObject — это компонент, отмечающий объект как сетевой. Он должен быть на каждом объекте, который будет синхронизироваться между клиентом и сервером. Управляет жизненным циклом объекта в сетевой игре.

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

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

  79. Что такое Host Mode и как он отличается от Client/Server?
    Host Mode — это режим, в котором один клиент выступает и как сервер, и как клиент. Отличается от Client/Server тем, что не требуется отдельный сервер, но ограничена производительность и масштабируемость.

  80. Что такое Netcode for GameObjects и как он сравнивается с Mirror?
    Netcode for GameObjects — официальная сетевая система от Unity. По сравнению с Mirror, она более интегрирована в движок, имеет меньший порог входа, но пока уступает в гибкости и функциональности.

  1. Какой паттерн проектирования используется для создания единого точки доступа к объекту в Unity?
    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?
    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. Какой тип коллайдера лучше всего подходит для создания триггерной зоны в 3D?
    A) BoxCollider
    B) SphereCollider
    C) CapsuleCollider
    D) Все вышеперечисленные, при включённом isTrigger
    Правильный ответ: D) Все вышеперечисленные, при включённом isTrigger

  52. Что такое NavMeshAgent и как он используется?
    A) Система управления камерой
    B) Компонент, позволяющий объекту двигаться по NavMesh
    C) Скрипт для работы с UI
    D) Тип анимации
    Правильный ответ: B) Компонент, позволяющий объекту двигаться по NavMesh

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  70. Какой компонент необходим для работы Timeline?
    A) PlayableDirector
    B) AnimationController
    C) Animator
    D) Director
    Правильный ответ: A) PlayableDirector

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

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

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

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

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

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

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

  1. Охарактеризуйте паттерн проектирования Singleton и приведите пример его использования в Unity.
  2. Что такое ScriptableObject и в чём его преимущества перед обычными классами?
 

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

  1. Singleton — это порождающий паттерн, гарантирующий существование одного экземпляра класса и предоставляющий к нему глобальную точку доступа. В Unity используется для менеджеров (звук, сохранения, управление сценой), где требуется один общий объект. Однако злоупотребление может привести к проблемам тестируемости и зависимости.
  2. ScriptableObject — это объект данных, который можно сохранить как ассет. Он позволяет хранить данные вне сцен, делиться ими между разными частями игры и легко редактировать в инспекторе.
 

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

Создайте ScriptableObject ItemDataсодержащий поля: itemNamedescriptioniconvalueРеализуйте простой скрипт Inventoryкоторый может добавлять и выводить информацию о предмете.

// ItemData.cs
using UnityEngine;

[CreateAssetMenu(fileName = "NewItem", menuName = "ScriptableObjects/ItemData", order = 0)]
public class ItemData : ScriptableObject
{
    public string itemName;
    public string description;
    public Sprite icon;
    public int value;
}

// Inventory.cs
using UnityEngine;

public class Inventory : MonoBehaviour
{
    public ItemData item;

    void Start()
    {
        AddItem(item);
    }

    public void AddItem(ItemData item)
    {
        Debug.Log($"Добавлен предмет: {item.itemName}, Значение: {item.value}");
    }
}

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

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

  1. Что такое Animator Override Controller и когда он применяется?
  2. Как работает система Layer Collision Matrix в Unity?
 

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

  1. Animator Override Controller позволяет заменять анимации в существующем Animator Controller'е без изменения оригинала. Часто используется для персонажей с разными наборами анимаций, но одинаковой логикой переходов.
  2. Layer Collision Matrix — таблица, управляющая взаимодействием слоёв. Позволяет указать, какие слои могут сталкиваться друг с другом. Например, можно отключить столкновения между игроком и пулями своего же типа.
 

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

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

using UnityEngine;

public class TriggerZone : MonoBehaviour
{
    public delegate void PlayerEntered();
    public static event PlayerEntered OnPlayerEnter;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            Debug.Log("Игрок вошёл в зону");
            OnPlayerEnter?.Invoke();
        }
    }
}

// Пример подписки
public class ZoneEventHandler : MonoBehaviour
{
    void OnEnable()
    {
        TriggerZone.OnPlayerEnter += HandlePlayerEnter;
    }

    void OnDisable()
    {
        TriggerZone.OnPlayerEnter -= HandlePlayerEnter;
    }

    void HandlePlayerEnter()
    {
        Debug.Log("Событие: игрок вошёл в зону!");
    }
}

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

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

  1. Что такое Addressables и чем они отличаются от стандартного метода Resources.Load()?
  2. Какие основные разделы предоставляет Profiler в Unity?
 

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

  1. Addressables позволяют загружать ассеты по имени или метке, автоматически обрабатывая зависимости. Поддерживают локальные и удалённые источники. Resources.Load() ограничен статичной загрузкой и не поддерживает динамическое управление.
  2. Profiler показывает использование CPU, GPU, памяти, физики, аудио и других ресурсов. Используется для диагностики производительности и поиска «узких мест».
 

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

Создайте скрипт, который асинхронно загружает префаб через Addressables и создаёт его на сцене.

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;

public class LoadPrefabWithAddressables : MonoBehaviour
{
    public AssetReference prefabReference;

    public void LoadAndInstantiate()
    {
        prefabReference.LoadAssetAsync<GameObject>().Completed += OnLoadDone;
    }

    void OnLoadDone(AsyncOperationHandle<GameObject> handle)
    {
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            Instantiate(handle.Result);
        }
        else
        {
            Debug.LogError("Не удалось загрузить префаб");
        }
    }
}

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

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

  1. Что такое Object Pooling и зачем он нужен в Unity?
  2. Что такое Job System и какие ограничения он имеет?
 

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

  1. Object Pooling — это паттерн управления объектами, при котором заранее создаются экземпляры, которые переиспользуются вместо постоянного создания и удаления. Уменьшает нагрузку на GC, особенно при частом появлении объектов (пули, эффекты).
  2. Job System — это система многопоточной обработки задач. Требует соблюдения ограничений безопасности памяти, запрещает использование Unity API из потока и требует работы с NativeContainer.
 

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

Реализуйте простую систему пула объектов, которая позволяет повторно использовать пули.

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    [SerializeField] private GameObject prefab;
    [SerializeField] private int poolSize = 10;

    private Queue<GameObject> objectPool = new Queue<GameObject>();

    void Awake()
    {
        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefab);
            obj.SetActive(false);
            objectPool.Enqueue(obj);
        }
    }

    public GameObject GetObject()
    {
        GameObject obj = objectPool.Dequeue();
        obj.SetActive(true);
        return obj;
    }

    public void ReturnObject(GameObject obj)
    {
        obj.SetActive(false);
        objectPool.Enqueue(obj);
    }
}

// Использование:
public class Shooter : MonoBehaviour
{
    public ObjectPool bulletPool;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameObject bullet = bulletPool.GetObject();
            bullet.transform.position = transform.position + Vector3.forward;
        }
    }
}

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

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

  1. Что такое NavMesh и как его использовать для ИИ?
  2. Что такое Behaviour Tree и как его реализовать в Unity?
 

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

  1. NavMesh — это представление поверхности, по которой может двигаться ИИ. Создаётся через Bake, после чего ИИ использует NavMeshAgent для автономного движения, обхода препятствий и построения пути.
  2. Behaviour Tree — это способ организации поведения ИИ в виде дерева условий и действий. В Unity реализуется через собственные классы или сторонние плагины. Позволяет создавать сложное поведение с ветвлениями и условиями.
 

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

Создайте скрипт, который позволяет ИИ следовать за игроком, используя NavMeshAgent.

using UnityEngine;
using UnityEngine.AI;

public class AIFollowPlayer : MonoBehaviour
{
    public Transform player;
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        if (player == null)
        {
            player = GameObject.FindGameObjectWithTag("Player").transform;
        }
    }

    void Update()
    {
        if (player != null && agent != null)
        {
            agent.SetDestination(player.position);
        }
    }
}

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

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

  1. Что такое Time.captureFramerate и в каких случаях он применяется?
  2. Что такое RenderTexture и как она используется в Unity?
 

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

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

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

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

using UnityEngine;

public class RenderToTexture : MonoBehaviour
{
    public Camera renderCamera;
    public Renderer targetRenderer;

    void Start()
    {
        if (renderCamera != null && targetRenderer != null)
        {
            RenderTexture rt = new RenderTexture(512, 512, 24);
            renderCamera.targetTexture = rt;
            renderCamera.Render();

            targetRenderer.material.mainTexture = rt;
        }
    }
}

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

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

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

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

  1. DOTween — популярная библиотека для создания анимаций и движений. В отличие от Animator, он не требует создания контроллеров, работает через код и удобен для временных эффектов и UI-анимаций.
  2. Composite Root — это точка, где создаются и соединяются все зависимости. Позволяет избежать глобальных точек доступа и повысить тестируемость. Реализуется через MonoBehaviour, где внедряются зависимости вручную.
 

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

Реализуйте плавное перемещение объекта с помощью DOTween по нажатию клавиши "E".

using UnityEngine;
using DG.Tweening;

public class MoveWithDOTween : MonoBehaviour
{
    public Transform targetPosition;
    public float duration = 1f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            transform.DOMove(targetPosition.position, duration).SetEase(Ease.OutQuad);
        }
    }
}

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

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

  1. Что такое Timeline и какие основные элементы он поддерживает?
  2. Что такое Signal System и как он используется в Timeline?
 

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

  1. Timeline — это инструмент для создания временных последовательностей: анимации, звуки, события. Поддерживает Track’и: Animation, Audio, Signal, Activation и другие.
  2. Signal System — это часть Timeline, позволяющая отправлять события другим объектам. Например, при проигрывании сигнала можно запустить анимацию или активировать ловушку.
 

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

Создайте Timeline, который при воспроизведении отправляет сигнал и вызывает метод ActivateTrap()у объекта.

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

[TrackColor(0.8f, 0.2f, 0.2f)]
[TrackClipType(typeof(PlayableAsset))]
public class SignalTrack : TrackAsset
{
    protected override Playable CreatePlayableGraph(PlayableGraph graph, GameObject go, TimelineClip clip, ISerializationCallbackReceiver trackBinding)
    {
        return ScriptPlayable<SignalBehaviour>.Create(graph);
    }
}

public class SignalBehaviour : PlayableBehaviour
{
    public UnityEvent onSignal;

    public override void OnGraphStart(Playable playable)
    {
        onSignal?.Invoke();
    }
}

// Пример использования:
public class TrapActivator : MonoBehaviour
{
    public void ActivateTrap()
    {
        Debug.Log("Ловушка активирована!");
    }
}

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

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

  1. Что такое IL2CPP и какие ограничения он накладывает на C#-код?
  2. Что такое Hybrid Renderer и зачем он нужен при переходе на DOTS?
 

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

  1. IL2CPP — это технология компиляции .NET-кода в нативный код. Ограничения: не поддерживает полный Reflection, некоторые возможности C# (например, dynamic), и может увеличивать время сборки.
  2. Hybrid Renderer — это мост между обычным режимом работы Unity и ECS. Позволяет использовать преимущества DOTS без полного перевода проекта на ECS. Используется при постепенной миграции на DOTS.
 

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

Напишите скрипт, который выводит сообщение о текущем FPS раз в секунду.

using UnityEngine;

public class FrameRateLogger : MonoBehaviour
{
    private float updateInterval = 1f;
    private float accumulatedDeltaTime = 0f;
    private int frameCount = 0;

    void Update()
    {
        accumulatedDeltaTime += Time.unscaledDeltaTime;
        frameCount++;

        if (accumulatedDeltaTime >= updateInterval)
        {
            float fps = frameCount / accumulatedDeltaTime;
            Debug.Log($"FPS: {fps:F2}");
            frameCount = 0;
            accumulatedDeltaTime = 0f;
        }
    }
}

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

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

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

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

  1. Behaviour Tree — это способ организации поведения ИИ в виде дерева условий и действий. Позволяет строить сложное поведение с ветвлениями и условиями. Часто реализуется через плагины или собственные классы.
  2. В Unity используется NavMesh + NavMeshAgent, реализующий A*. Для более сложных случаев используются сторонние решения, например, A* Pathfinding Project. Алгоритм A* находит оптимальный путь между двумя точками, используя эвристическую функцию.
 

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

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

using UnityEngine;
using UnityEngine.AI;

public class AIFollowMouseClick : MonoBehaviour
{
    public Camera mainCamera;
    public LayerMask groundLayer;
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, groundLayer))
            {
                agent.SetDestination(hit.point);
            }
        }
    }
}

Экзаменационный билет №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 — это структура данных, выделяющая память вне управляемой среды .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) Кейс: "Сбой в сетевой синхронизации — игроки не видят движение друг друга"


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

Вы — разработчик на курсе Unity-разработчик (Middle). В командном проекте вы работаете над сетевым 2D-платформером. Игроки должны взаимодействовать друг с другом, перемещаться по карте и видеть движения других участников.

 

Вам поручено реализовать сетевую синхронизацию позиции игрока через Netcode for GameObjects .
Вы подключили Netcode, добавили NetworkManager, реализовали скрипт NetworkPlayerMovementкоторый должен синхронизировать позицию через NetworkVariable<Vector3>

Но при запуске игры:

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


Исходный скрипт NetworkPlayerMovement

using Unity.Netcode;
using UnityEngine;

public class NetworkPlayerMovement : NetworkBehaviour
{
    public float moveSpeed = 5f;
    private Vector3 targetPosition;

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

    void Start()
    {
        networkPosition.OnValueChanged += OnPositionChanged;
    }

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

        Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")) * moveSpeed * Time.deltaTime;
        transform.position += movement;

        networkPosition.Value = transform.position;
    }

    void OnPositionChanged(Vector3 previousValue, Vector3 newValue)
    {
        transform.position = newValue;
    }
}

Дополнительная информация о проекте

  • Используется Netcode for GameObjects 1.0+
  • На сцене есть:
    • NetworkManager с активным Connection Approval
    • Префаб игрока с компонентом NetworkObject
  • Нет ошибок в консоли
  • Подключение проходит успешно
  • Позиция сохраняется, но не обновляется у других клиентов
 

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


Проблема №1: Обновление позиции напрямую из networkPosition.Value

Проверка:
Метод OnPositionChanged() устанавливает transform.position = newValueчто может вызвать конфликт с физикой или другими системами.

 

Решение:
Лучше использовать интерполяцию или Lerpчтобы избежать резких телепортаций и сделать движение плавным.

 

Проблема №2: Отсутствие условия IsServer для изменения networkPosition

Проверка:
Текущий код позволяет любому клиенту менять networkPosition.ValueЭто может вызывать рассинхрон или нарушать архитектуру клиента-сервера.

 

Решение:
Обновлять значение только на сервере:

if (IsOwner && IsServer)
{
    networkPosition.Value = transform.position;
}

Проблема №3: Изменение Transform напрямую

Проверка:
Transform.position напрямую изменяется как владельцем, так и через networkPosition

Решение:
Отделить логику:

  • Владелец управляет своим положением через ввод.
  • Все остальные клиенты получают данные через networkPosition и обновляют его с помощью Vector3.Lerp()
 

Проблема №4: Нет интерполяции между кадрами

Проверка:
Если networkPosition обновляется редко, то другие клиенты будут видеть резкие прыжки объекта.

 

Решение:
Добавить интерполяцию:

void Update()
{
    if (IsOwner) return;

    transform.position = Vector3.Lerp(transform.position, networkPosition.Value, Time.deltaTime * 10f);
}

Проблема №5: Нет ограничения частоты обновлений

Проверка:
Частое обновление networkPosition.Value может создавать избыточный сетевой трафик.

 

Решение:
Добавить проверку расстояния перед обновлением:

private Vector3 lastSyncPosition;

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

    Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")) * moveSpeed * Time.deltaTime;
    transform.position += movement;

    if (Vector3.Distance(transform.position, lastSyncPosition) > 0.1f)
    {
        networkPosition.Value = transform.position;
        lastSyncPosition = transform.position;
    }
}

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

using Unity.Netcode;
using UnityEngine;

public class NetworkPlayerMovement : NetworkBehaviour
{
    public float moveSpeed = 5f;
    public float syncThreshold = 0.1f;
    public float lerpSpeed = 10f;

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

    private Vector3 lastSyncPosition;

    void Start()
    {
        networkPosition.OnValueChanged += OnPositionChanged;
        if (IsOwner)
        {
            lastSyncPosition = transform.position;
        }
    }

    void Update()
    {
        if (IsOwner)
        {
            HandleLocalMovement();
            CheckForSync();
        }
        else
        {
            SmoothMoveToTarget();
        }
    }

    void HandleLocalMovement()
    {
        float moveX = Input.GetAxis("Horizontal");
        float moveY = Input.GetAxis("Vertical");
        transform.position += new Vector3(moveX, moveY) * moveSpeed * Time.deltaTime;
    }

    void CheckForSync()
    {
        if (Vector3.Distance(transform.position, lastSyncPosition) > syncThreshold)
        {
            networkPosition.Value = transform.position;
            lastSyncPosition = transform.position;
        }
    }

    void SmoothMoveToTarget()
    {
        transform.position = Vector3.Lerp(transform.position, networkPosition.Value, Time.deltaTime * lerpSpeed);
    }

    void OnPositionChanged(Vector3 previousValue, Vector3 newValue)
    {
        // Вызывается при любом изменении значения
    }
}

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

Что изучают студенты
Примечание
Работа с Netcode for GameObjects
Как управлять сетевыми объектами
Синхронизация данных через NetworkVariable
Как правильно передавать позицию между клиентами
Интерполяция позиции
Для плавного отображения чужих игроков
Разделение ответственности
Только владелец отправляет обновления
Оптимизация сетевых сообщений
Защита от перегрузки сети через пороговые значения

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

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

(2) Кейс: "Не работает анимация ИИ — персонаж застрял в режиме Idle"


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

Вы работаете над 3D-платформером, где есть искусственный интеллект (враги), которые должны реагировать на игрока:

  • Если игрок рядом — переходить в состояние Chase
  • Если игрок убежал — возвращаться в Patrol
  • При потере видимости — включать Alert и искать игрока
 

Вам поручено реализовать систему состояний ИИ с использованием Animator Controller , параметров Animator , триггеров и скрипта AIStateMachine

 

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

ИИ не меняет состояние. Он всегда остаётся в состоянии Idle, даже если игрок рядом.


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

  • GameObject Enemy имеет:
    • Animatorсвязанный с AI Animator Controller
    • Скрипт AIStateMachineуправляющий состояниями
  • В проекте используется Finite State Machine (FSM) с состояниями:
    • Idle
    • Patrol
    • Chase
    • Alert
  • Нет ошибок в консоли
 

Исходный скрипт AIStateMachine

using UnityEngine;

public class AIStateMachine : MonoBehaviour
{
    public enum State { Idle, Patrol, Chase, Alert }
    private State currentState;

    public Transform player;
    public float chaseDistance = 10f;
    public float alertDuration = 5f;

    private Animator animator;
    private float alertTimer;

    void Start()
    {
        animator = GetComponent<Animator>();
        currentState = State.Idle;
    }

    void Update()
    {
        switch (currentState)
        {
            case State.Idle:
                if (IsPlayerInRange())
                {
                    currentState = State.Chase;
                    animator.SetInteger("State", (int)State.Chase);
                }
                break;

            case State.Patrol:
                // Логика патрулирования
                if (IsPlayerInRange())
                {
                    currentState = State.Chase;
                    animator.SetInteger("State", (int)State.Chase);
                }
                break;

            case State.Chase:
                if (!IsPlayerInRange())
                {
                    alertTimer = alertDuration;
                    currentState = State.Alert;
                    animator.SetInteger("State", (int)State.Alert);
                }
                break;

            case State.Alert:
                alertTimer -= Time.deltaTime;
                if (alertTimer <= 0)
                {
                    currentState = State.Patrol;
                    animator.SetInteger("State", (int)State.Patrol);
                }
                break;
        }
    }

    bool IsPlayerInRange()
    {
        return Vector3.Distance(transform.position, player.position) < chaseDistance;
    }
}

AI Animator Controller

Состояния:

  • Idle → Patrol → Chase → Alert

Параметры:

  • State типа Integer

Переходы:

  • Все переходы основаны на значении параметра State
  • Нет условий по времени или событиям, только значение параметра
 

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


Проблема №1: Параметр Animator не обновляется корректно

Как проверить:
Добавьте отладку:

Debug.Log("Текущее состояние: " + currentState);
Debug.Log("Значение параметра State: " + animator.GetInteger("State"));

Возможная проблема:
Animator может игнорировать вызов SetIntegerесли новое значение совпадает с текущим.

 

Решение:
Добавьте принудительное обновление через временную переменную:

private State previousState;

void Update()
{
    if (previousState != currentState)
    {
        animator.SetInteger("State", (int)currentState);
        previousState = currentState;
    }

    // остальной код
}
Проблема №2: Параметр State не передаётся другим клиентам

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

 

Возможная проблема:
Animator использует локальные параметры, не синхронизируемые в сети.

 

Решение:
Если требуется синхронизация:

  • Добавьте NetworkVariable для состояния
  • Обновляйте параметр только на сервере
  • На клиентах подписывайтесь на изменение NetworkVariable и обновляйте Animator
 

Проблема №3: Условия перехода в Animator неправильно настроены

Как проверить:
Откройте Animator Controller → проверьте условия перехода между состояниями.

 

Возможная проблема:
Может быть задано несколько условий (например, State > 1 AND State == 2), из-за чего переход блокируется.

 

Решение:
Убедитесь, что все переходы используют только один параметр State и значения соответствуют вашему Enum.

 

Проблема №4: Не обновляется состояние после Alert

Как проверить:
После окончания Alert добавьте отладку:

Debug.Log("Переход в Patrol");
animator.SetInteger("State", (int)State.Patrol);

Возможная проблема:
Animator мог остаться в Alert, если переход в Patrol не предусмотрен или нарушен порядок обновления.

 

Решение:
Проверьте, что у вас есть переход Alert → Patrol по параметру StateТакже можно добавить Reset Trigger'а или дополнительного условия.

 

Проблема №5: Ошибка в IsPlayerInRange()

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

void OnDrawGizmos()
{
    Gizmos.color = Color.red;
    Gizmos.DrawWireSphere(transform.position, chaseDistance);
}

Возможная проблема:
Дистанция слишком мала, либо player равен null, поэтому Vector3.Distance() не работает.

 

Решение:
Проверьте, что player назначен в инспекторе. Также можно использовать Raycast для точной проверки присутствия игрока в поле зрения.

 

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

Изменения в AIStateMachine

using UnityEngine;

public class AIStateMachine : MonoBehaviour
{
    public enum State { Idle, Patrol, Chase, Alert }
    private State currentState;
    private State previousState;

    public Transform player;
    public float chaseDistance = 10f;
    public float alertDuration = 5f;

    private Animator animator;
    private float alertTimer;

    void Start()
    {
        animator = GetComponent<Animator>();
        currentState = State.Idle;
        previousState = currentState;
    }

    void Update()
    {
        if (previousState != currentState)
        {
            animator.SetInteger("State", (int)currentState);
            previousState = currentState;
        }

        switch (currentState)
        {
            case State.Idle:
                if (IsPlayerInRange())
                {
                    currentState = State.Chase;
                }
                break;

            case State.Patrol:
                if (IsPlayerInRange())
                {
                    currentState = State.Chase;
                }
                break;

            case State.Chase:
                if (!IsPlayerInRange())
                {
                    alertTimer = alertDuration;
                    currentState = State.Alert;
                }
                break;

            case State.Alert:
                alertTimer -= Time.deltaTime;
                if (alertTimer <= 0)
                {
                    currentState = State.Patrol;
                }
                break;
        }
    }

    bool IsPlayerInRange()
    {
        if (player == null) return false;
        return Vector3.Distance(transform.position, player.position) < chaseDistance;
    }

    void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, chaseDistance);
    }
}

Рекомендации по настройке Animator

  1. Убедитесь, что параметр State существует в Animator.
  2. Каждый переход должен использовать только одно условие : State == [значение]
  3. Избегайте сложных условий (например, State > 1).
  4. Убедитесь, что начальное состояние Idle установлено корректно.
 

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

Что изучают студенты
Примечание
Работа с Animator и FSM
Как правильно связывать поведение и анимации
Отладка через Debug.Log и Gizmos
Поиск причин некорректного поведения
Управление состоянием через Enum
Читаемость и простота расширения
Визуализация зон действия
Gizmos помогают в тестировании
Синхронизация данных (по желанию)
Как работать с NetworkVariable и анимацией

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

  1. Реализуйте поведение Alert: вращение вокруг себя и прослушивание шума.
  2. Добавьте параметр isMoving и анимацию ходьбы/стояния.
  3. Реализуйте систему слуха: ИИ реагирует на звуки.
  4. Добавьте триггер "Attack", который активируется при близком контакте с игроком.

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


Цель игры

Научить студентов работать с сетевой архитектурой в Unity, освоить базовые и продвинутые возможности Netcode for GameObjects , научиться проектировать игровые системы с учётом синхронизации данных между клиентами и сервером.
Имитировать командную разработку с разделением ролей, где каждый участник отвечает за свою часть сетевой логики.

 

Формат

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

Сеттинг

Вы — команда разработчиков, работающих над кооперативным 2D-шутером . Игроки должны объединяться в команду, чтобы уничтожать врагов, собирать предметы и выживать как можно дольше.
Вам нужно реализовать сетевую синхронизацию : движения, стрельбы, инвентаря и состояния игроков.
Времени мало, а заказчик требует прототип к следующей демонстрации.

 

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

Роль
Описание
Геймдизайнер
Формулирует концепцию, описывает механики, пишет ТЗ для команды
Сетевой программист
Отвечает за реализацию Netcode for GameObjects, спавн игроков, синхронизацию позиций и событий
Логика игрока
Реализует управление, стрельбу, взаимодействие с объектами
UI/UX дизайнер
Создаёт интерфейс: список игроков, экран подключения, HUD
Менеджер проекта
Следит за сроками, распределяет задачи, проводит встречи
Тестировщик(по желанию)
Проверяет работу на нескольких клиентах, составляет отчет по найденным багам

Этапы игры

Этап 1: Брифинг
  • Геймдизайнер представляет концепцию: «Кооперативный шутер, где игроки могут подключаться через локальную сеть и играть вместе»
  • Менеджер делит задачи:
    • Настройка NetworkManager и запуск хоста
    • Реализация перемещения игрока
    • Система стрельбы с синхронизацией
    • Интерфейс подключения и HUD
 
Этап 2: Разработка
  • Каждые 10–15 минут — короткая встреча (stand-up), где участники отчитываются:
    • Что сделал?
    • Над чем работает?
    • Есть ли блокеры?
 
Этап 3: Презентация
  • Команда запускает игру в режиме Multiplayer (Local Network)
  • Все участники подключаются и проверяют:
    • Движение каждого игрока
    • Стрельбу и её синхронизацию
    • Появление новых игроков
    • Отображение HUD и информации
 

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

  • Знакомство с Netcode for GameObjects : Server, Client, Host Mode
  • Понимание работы NetworkObject , NetworkVariable , RPC
  • Изучение принципов синхронизации состояний и управления доступом
  • Практика работы в команде и общения между специалистами
  • Первичное освоение работы с сетевым тестированием и отладкой
 

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

Проблема
Возможная причина
Как решить
Игроки не видят друг друга
Не загрузилась сцена или нет NetworkObject
Убедитесь, что префаб игрока имеет NetworkObject и он зарегистрирован
Стрельба работает только локально
Используется обычный Instantiate вместо ServerRpc
Переписать систему пулей через ServerRpc и NetworkObject.Spawn()
Нет списка игроков в UI
Не реализована подписка на подключение
Использовать NetworkManager.Singleton.OnClientConnectedCallback
Пули летают только у себя
Нет спавна пули на сервере
Использовать ServerRpc и создавать пулю на сервере
Не синхронизируется здоровье
Health не является NetworkVariable
Переписать класс здоровья с использованием NetworkVariable<int>
Подключение занимает слишком много времени
Host Mode не настроен правильно
Проверьте NetworkManager и установите правильные настройки транспорта
Игроки не могут двигаться одновременно
Нет NetworkTransform или он неправильно настроен
Добавить NetworkTransform или использовать свой механизм с NetworkVariable<Vector3>

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

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

Ролевая игра №2: "Студия DOTS — переход на ECS и Job System"


Цель игры

Научить студентов работать с новыми технологиями Unity — ECS (Entity Component System) , Job System , Burst и Hybrid Renderer , освоить принципы разработки игр по архитектуре DOTS.
Имитировать командную миграцию существующего проекта на новую систему, развить навыки рефакторинга, работы с данными и оптимизации производительности.

 

Формат

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

Сеттинг

Вы — команда разработчиков в инди-студии. У вас есть работающий прототип 2D-платформера на MonoBehaviour. Однако заказчик хочет запускать игру на слабых устройствах и мобильных платформах, поэтому требуется переписать ключевые игровые системы на DOTS , чтобы повысить производительность и стабильность.

 

Вам нужно за ограниченное время перенести основные функции:

  • Движение игрока
  • Систему прыжков
  • Логику движения врагов
  • Отображение через Hybrid Renderer
 

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

Роль
Описание
Архитектор DOTS
Формулирует стратегию миграции, помогает остальным участникам понять, как реализовать логику на ECS
Программист ECS
Переписывает движок игрока и систему управления на Entity Component System
Программист Job System
Реализует параллельную обработку игровой логики с использованием Job System и Burst
UI/UX дизайнер
Создаёт интерфейс для отладки и тестирования системы
Менеджер проекта
Следит за сроками, распределяет задачи, проводит встречи
Тестировщик / QA
Проверяет корректность работы после миграции, сравнивает производительность старого и нового кода

Этапы игры

Этап 1: Брифинг
  • Архитектор объясняет базовые концепции ECS: Entity, Component, System, Archetype
  • Группа делит исходный проект на модули для миграции
  • Менеджер составляет план:
    • Фаза 1: Подготовка проекта к DOTS
    • Фаза 2: Перепись движения и физики
    • Фаза 3: Параллелизация с помощью Job System
    • Фаза 4: Тестирование и сравнение производительности
 
Этап 2: Разработка
  • Каждый участник получает свою часть кода для переписывания под DOTS
  • Используется Unity.Entities, Unity.Physics, Unity.Mathematics
  • Программист Job System начинает выносить логику в многопоточный код
  • Тестировщик проверяет работу через Profiler и Debug.Log
  • Каждые 10–15 минут — stand-up встреча
 
Этап 3: Презентация
  • Команда демонстрирует:
    • Работает ли движение игрока?
    • Есть ли улучшение FPS?
    • Как изменилась нагрузка на CPU?
  • Тестировщик показывает найденные ошибки
  • Геймдизайнер оценивает соответствие заданию
 

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

  • Понимание отличий между ООП и подходом ECS
  • Написание чистых систем, ориентированных на данные
  • Использование NativeContainer (NativeArray, NativeList)
  • Реализация параллельных вычислений с Job System и Burst
  • Знакомство с Hybrid Renderer при частичной миграции
  • Опыт совместной разработки с учётом ограничений DOTS
  • Первичное освоение диагностики производительности через Profiler
 

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

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

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

  • Можно использовать минимальный Unity-проект с уже подготовленным 2D-платформером
  • Предложить командам реализовать дополнительные фичи:
    • Асинхронную загрузку уровня через Addressables + ECS
    • Простой AI на основе IJobForEach
    • Визуализацию данных через UI Toolkit

Ролевая игра №3: "Построй своё здание — разработка инструмента редактора Unity"


Цель игры

Научить студентов создавать собственные инструменты редактора в Unity с использованием UnityEditor API , научиться работать с атрибутами, кастомными инспекторами и меню создания объектов.
Имитировать процесс разработки удобного и функционального инструмента для команды дизайнеров уровней.

 

Формат

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

Сеттинг

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

  • Размещать блоки на сетке
  • Удалять блоки
  • Сохранять и загружать постройки
  • Выводить информацию о количестве использованных блоков
 

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

Роль
Описание
Архитектор редакторских инструментов
Формулирует общий подход, объясняет, как использовать UnityEditor API
Программист инструмента
Реализует логику размещения и удаления блоков через редакторское окно
Специалист по сохранению данных
Создаёт систему сохранения и загрузки построек
UI/UX дизайнер
Отвечает за интерфейс инструмента: кнопки, поля, цвета
Художник / Сетапер проекта
Подготавливает префабы, материалы, сетку и готовую сцену
Тестировщик
Проверяет работу инструмента, составляет отчет о найденных багах

Этапы игры

Этап 1: Брифинг
  • Архитектор представляет основные возможности редакторского API: EditorWindow, Handles, CustomEditor, ScriptableObject
  • Программист определяет, как будет работать система размещения: через клик мыши или выбор позиции
  • Менеджер распределяет задачи:
    • Фаза 1: Создание окна инструмента и выбор активного блока
    • Фаза 2: Логика размещения и удаления
    • Фаза 3: Сохранение и загрузка
    • Фаза 4: Тестирование и демонстрация
 
Этап 2: Разработка
  • Каждый участник получает часть кода для написания:
    • Создание кастомного окна (EditorWindow)
    • Обработка кликов в SceneView через Handles
    • Сохранение данных в ScriptableObject
    • Интерфейс для выбора блоков и отображения статистики
     
  • Команда работает с уже подготовленным проектом: есть префабы блоков, сцена с сеткой, базовый игрок
  • Каждые 10–15 минут — stand-up встреча
 
Этап 3: Презентация
  • Команда демонстрирует прототип инструмента:
    • Можно ли выбрать тип блока?
    • Можно ли поставить или удалить блок кликом?
    • Сохраняется ли постройка в файл?
  • Тестировщик показывает найденные баги
  • Архитектор подводит итоги
 

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

  • Практика работы с UnityEditor API : окна, хэндлы, события
  • Изучение создания кастомных окон и инспекторов
  • Освоение ScriptableObject для хранения данных вне сцен
  • Использование Handles и SceneView для взаимодействия в редакторе
  • Знакомство с сохранением пользовательских данных (например, JSON или ScriptableObject)
  • Написание чистого, документированного кода , понятного другим
  • Работа в условиях ограниченного времени и совместной разработки
 

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

Проблема
Возможная причина
Как решить
Не появляются элементы в меню Tools
Кастомный класс не имеет атрибута [MenuItem]
Добавьте атрибут и проверьте пространство имён
Не отрисовываются хэндлы в SceneView
Не подписались на OnSceneGUI
Используйте метод DrawSceneHandle(), зарегистрированный через SceneView.duringSceneGui
Не сохраняются данные между сессиями
Используется обычный класс вместо ScriptableObject
Перепишите систему данных через ScriptableObject
Кнопки в редакторском окне не реагируют
Не вызывается Repaint() или GUILayout.BeginHorizontal()
Проверьте корректное использование GUILayout и GUI элементов
Инструмент работает только в редакторе
Используется код из UnityEditor
Вынесите игровую логику отдельно от редакторской части
Невозможно выбрать блок перед постройкой
Нет выпадающего списка или словаря
Используйте EditorGUILayout.ObjectField или массив с выбором по индексу
Не обновляется UI при изменении состояния
Не вызван Repaint()
Вызывайте Repaint() после изменения состояния внутри окна

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

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

Ролевая игра №4: "Создание мобильного геймдева — оптимизация под Android"


Цель игры

Научить студентов работать с оптимизацией графики и производительности в Unity , освоить использование Profiler'а , настройку Canvas Scaler'а , работу с атласами спрайтов , а также понять, как адаптировать игру под мобильные устройства .
Имитировать командную разработку проекта, ориентированного на Android , с акцентом на производительность и юзабилити .

 

Формат

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

Сеттинг

Вы — команда разработчиков, создающих мобильный 2D-раннер для Android . Игра уже частично реализована, но при тестировании на реальном устройстве выяснилось:

 
  • FPS падает до 10 кадров
  • Интерфейс выглядит по-разному на разных экранах
  • Загрузка уровня занимает слишком много времени
  • Игра тормозит на слабых устройствах

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

 

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

Роль
Описание
Геймдизайнер / Архитектор
Формулирует требования к оптимизации и проверяет выполнение ТЗ
Программист производительности
Отвечает за устранение бутылочных горлышек в коде и физике
Оптимизатор графики
Уменьшает нагрузку на GPU: объединяет текстуры, использует Sprite Atlas, упрощает шейдеры
UI/UX дизайнер
Переделывает интерфейс под мобильные разрешения, делает его масштабируемым
Менеджер проекта
Контролирует сроки, распределяет задачи, проводит встречи
QA / Тестировщик
Тестирует игру на эмуляторе и реальных устройствах, составляет отчеты о производительности

Этапы игры

Этап 1: Брифинг
  • Геймдизайнер представляет текущее состояние проекта и цели:
    • Сделать игру стабильной (30+ FPS)
    • Адаптировать интерфейс под все экраны
    • Ускорить загрузку уровня
  • Менеджер делит задачи:
    • Фаза 1: Диагностика через Profiler
    • Фаза 2: Оптимизация графики
    • Фаза 3: Настройка UI и Canvas
    • Фаза 4: Тестирование и подготовка к сборке
 
Этап 2: Разработка
  • Программист анализирует вызовы Update(), физику, корутины
  • Графический оптимизатор объединяет спрайты в Sprite Atlas, заменяет материалы
  • UI/UX дизайнер переписывает интерфейс с использованием Canvas Scaler и Layout Group
  • QA тестировщик запускает игру на эмуляторе и проверяет стабильность
  • Каждые 10–15 минут — stand-up встреча
 
Этап 3: Презентация
  • Команда демонстрирует:
    • Как изменился FPS до и после оптимизации
    • Как работает интерфейс на разных разрешениях
    • Скорость загрузки уровня
  • QA показывает найденные проблемы
  • Менеджер подводит итоги
 

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

  • Практика работы с Unity Profiler : CPU, GPU, Memory, Rendering
  • Изучение Sprite Atlas и Object Pooling для снижения Draw Calls
  • Настройка Canvas Scaler и Responsive Design
  • Оптимизация скриптов: минимизация GC, правильная работа с Update()
  • Работа с Texture Compression , Shader Graph , Batching
  • Понимание различий между Editor , Standalone и Android билдами
  • Первичное освоение Build Settings и Player Settings под Android
  • Написание эффективного и чистого кода, подходящего для мобильных платформ
 

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

Проблема
Возможная причина
Как решить
FPS низкий
Частое создание объектов или высокая нагрузка на GPU
Используйте pooling, объедините спрайты, упростите шейдеры
Элементы UI обрезаются
Canvas Scaler настроен неверно
Выберите Scale With Screen Size и задайте Reference Resolution
Игра долго грузится
Много префабов или большие текстуры
Используйте Addressables, уменьшите размер текстур
Экран дрожит или моргает
Частое обновление UI или рендера
Оптимизируйте Update(), используйте событийную модель
Не хватает памяти на слабых устройствах
Используются неоптимизированные текстуры и модели
Включите Texture Compression, уменьшите размер текстур
UI не масштабируется правильно
Использован Static Pixel Size вместо Scale With Screen Size
Переключитесь на нужный режим и добавьте LayoutElement где нужно
Игрок дергается при движении
Используется Time.deltaTime вместо Time.unscaledDeltaTime
Проверьте, где используется deltaTime и как он влияет на движение
Многие объекты вызывают Garbage Collector
Создаются новые объекты в Update()
Используйте объекты заранее или NativeContainer (если знакомы с DOTS)
Не получается собрать APK
Не установлен Android Build Support
Убедитесь, что в Unity Hub выбран Android Build Support и SDK установлен
Игра зависает при старте
Слишком много данных загружается сразу
Реализуйте асинхронную загрузку через SceneManager.LoadSceneAsync()

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

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

Интеллект-карта 1: Архитектура и паттерны проектирования

Центральный узел:
Архитектура и паттерны проектирования

 

Ветки:

  • MVC (Model-View-Controller)

    • Разделение данных, логики и отображения
    • Использование в UI и игровой механике
  • ScriptableObject

    • Хранение данных вне сцены
    • Удобство повторного использования и редактирования
  • State Machine

    • Управление состояниями персонажа или объектов
    • Примеры: Idle, Run, Attack, Die
  • Паттерны проектирования

    • Singleton — глобальный доступ к объекту
    • Observer — реакция на события
    • Factory — создание объектов по шаблону
    • Command — инкапсуляция действий
  • ECS / DOTS

    • Entity Component System
    • Работа с Job System и Burst
    • Преимущества производительности
  • Системы и менеджеры

    • InputManager
    • UIManager
    • LevelManager
    • SaveManager
 

Интеллект-карта 2: Производительность и оптимизация

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

 

Ветки:

  • Профилирование

    • Unity Profiler
    • CPU, GPU, Memory, Rendering
  • Работа с памятью

    • Утечки памяти
    • GC (сборка мусора)
    • Object Pooling
  • Графика

    • Sprite Atlases
    • Texture compression
    • Shader Graph
    • VFX Graph
  • UI

    • Canvas optimization
    • Static vs Dynamic UI
    • Layout Groups vs Anchors
  • Физика

    • Layer Collision Matrix
    • Physics Material 2D
    • Точность расчетов
  • Загрузка и ресурсы

    • Addressables
    • AssetBundles
    • Async loading
  • Корутины и асинхронность

    • yield return
    • async/await
    • Task.Run()
 

Интеллект-карта 3: Работа в команде и продвинутые практики

Центральный узел:
Работа в команде и продвинутые практики

 

Ветки:

  • Версионный контроль

    • Git и GitHub
    • GitFlow
    • Branches: main, develop, feature, release, hotfix
  • CI/CD

    • Автоматическая сборка
    • Jenkins / GitHub Actions
    • Build pipelines
  • Тестирование

    • Unit-тесты
    • Mock-объекты
    • Integration тесты
  • Документация

    • GDD (Game Design Document)
    • Технические спецификации
    • Чек-листы задач
  • Работа с API

    • REST-запросы
    • JSON / XML
    • Сохранение данных на сервере
  • Мультиплатформенность

    • Подготовка билдов под Android/iOS/PC
    • Настройка Input System
    • Адаптация экрана и разрешения
  • DevOps и автоматизация

    • Сборка через командную строку
    • Автоматическое тестирование
    • Отладка удалённо

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

Название: Игровое программирование на C# и Unity
Автор: Кит Амос
Год издания: 2021
Краткое описание:
Практическое руководство по разработке игр с акцентом на язык C# и движок Unity. Подходит для уровня Middle: содержит примеры реализации сложных игровых механик, работы с анимацией, UI и физикой.

 

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

Название: Методика преподавания основ Unity-разработки в системе профессионального обучения
Автор: Министерство образования и науки РФ
Год издания: 2022
Краткое описание:
Рекомендации по структурированию учебного процесса, организации проектной деятельности и оценке знаний обучающихся. Полезно для преподавателей и организаторов курсов.

 

3. Задачник

Название: Практикум по Unity: задачи и решения для начинающих разработчиков
Автор: Смирнов А.А., Лаптев А.Н.
Год издания: 2020
Краткое описание:
Сборник практических заданий по работе с Unity Editor, написанию скриптов, созданию UI, физике и анимации. Включает варианты разной сложности и эталонные решения.

 

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

Название: Чтения по разработке игр: классические статьи, интервью и эссе
Составитель: Джефф Орлинг
Год издания: 2019
Краткое описание:
Подборка текстов от известных геймдевов, историй создания популярных игр и взглядов на проектирование игровых механик. Развивает общую культуру и понимание индустрии.

 

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

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

Курсы с акцентом на углубление знаний

  1. "Unity Middle Developer: углублённое изучение игровой архитектуры"
    Изучите паттерны проектирования, оптимизацию производительности и продвинутые практики разработки.

  2. "Продвинутый Unity: от базовых скриптов к сложным системам"
    Научитесь создавать масштабные игровые системы, работать с ECS и DOTS, улучшать производительность проекта.

  3. "Архитектура и оптимизация в Unity: уровень Middle"
    Углублённое изучение структуры проекта, управления памятью, пулинга объектов и работы с ресурсами.

  4. "Профессиональная физика и анимация в Unity"
    Работа с продвинутыми механиками взаимодействия, параметрическими анимациями и состояниями персонажей.

  5. "Shader Graph и VFX Graph: создание графических эффектов в Unity"
    Освойте работу с шейдерами и визуальными эффектами без написания кода — для создания красивых визуальных решений.

 

С акцентом на карьерный рост и командную разработку

  1. "Unity Middle Lab: практика создания масштабных игр"
    Реализуйте полноценный игровой прототип с использованием профессиональных практик и инструментов.

  2. "Unity для профессионалов: подготовка к Senior-уровню"
    Курс по лучшим практикам разработки, управлению проектами и переходу на следующий уровень.

  3. "Разработка игр в команде: Agile, GitFlow и CI/CD в Unity"
    Организация совместной разработки, использование методологий управления проектами и автоматизации сборок.

  4. "Геймдев как профессия: как выйти на уровень Middle и выше"
    Образовательный курс с фокусом на карьерный рост, портфолио и развитие в индустрии.

  5. "Unity в боевых условиях: реальные задачи разработчика"
    Практика решения типичных проблем, с которыми сталкиваются Middle-разработчики в студиях.

 

Курсы по технической специализации

  1. "Unity UI Pro: создание адаптивного интерфейса под любую платформу"
    Научитесь создавать гибкий и оптимизированный пользовательский интерфейс для мобильных и десктоп-игр.

  2. "Продвинутая физика и коллайдеры в Unity"
    Изучение сложных взаимодействий, триггеров, детекторов столкновений и реакций на них.

  3. "Работа с Addressables и AssetBundles в Unity"
    Изучение современных способов загрузки и управления ресурсами в крупных проектах.

  4. "Корутины, асинхронность и многопоточность в Unity"
    Использование async/await, корутин и Job System для эффективной обработки данных.

  5. "Тестирование и отладка в Unity: Unit-тесты и Mock-объекты"
    Освоение методов тестирования кода, анализа багов и обеспечения стабильности проекта.

 

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

  1. "Unity Team Development: работа в группе по GitFlow"
    Работа в команде с применением современных практик контроля версий и распределения задач.

  2. "Создание 2D-платформера уровня Middle: от идеи до билда"
    Практическая реализация сложной игры с продвинутым ИИ, уровнем и системой сохранений.

  3. "Мультиплатформенная разработка в Unity: Android, iOS, PC"
    Подготовка проекта под несколько платформ, оптимизация и особенности запуска на разных устройствах.

  4. "Unity DevOps: автоматизация сборки, тестирования и деплоя"
    Интеграция CI/CD, автоматическая проверка и выпуск обновлений.

  5. "Создание собственного инструментария в Unity Editor"
    Разработка расширений, кастомных окон и инструментов для повышения продуктивности.

 

Углублённые темы и технологии

  1. "ECS и DOTS в Unity: шаг к высокопроизводительным играм"
    Изучение новой архитектуры Unity и её применения в реальных проектах.

  2. "Unity ScriptableObject: создание гибкой системы данных"
    Использование SO для хранения состояний, параметров и конфигураций вне GameObject'ов.

  3. "Post Processing и графические эффекты в Unity HDRP/URP"
    Настройка визуального качества: Bloom, Vignette, Motion Blur и другие эффекты.

  4. "Работа с API и сетевыми запросами в Unity"
    Интеграция внешних сервисов, отправка и получение данных через REST и WebSocket.

  5. "Unity Performance Optimization: снижение нагрузки и увеличение FPS"
    Анализ и устранение узких мест, работа с Profiler’ом, оптимизация под мобильные устройства.

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