Основы разработки игр на Unity

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

1. Введение в экосистему Unity: Интерфейс, сцены и игровые объекты

Введение в экосистему Unity: Интерфейс, сцены и игровые объекты

Добро пожаловать в курс «Основы разработки игр на Unity». Это первая статья, с которой начнется ваше путешествие в мир создания видеоигр. Unity — это один из самых популярных игровых движков в мире. На нем созданы такие хиты, как Hearthstone, Among Us, Genshin Impact и Cities: Skylines.

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

Установка и Unity Hub

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

В Unity Hub вы будете:

  • Устанавливать версии редактора (Installs). Рекомендуется использовать версии с пометкой LTS (Long Term Support), так как они наиболее стабильны.
  • Создавать новые проекты (Projects).
  • Управлять лицензиями.
  • Когда вы создадите новый 3D-проект и откроете его, перед вами появится интерфейс Unity Editor.

    Интерфейс Unity: Ваша кабина пилота

    При первом запуске интерфейс может показаться перегруженным кнопками и окнами. Не пугайтесь. Мы разберем его по частям. Интерфейс Unity модульный — любое окно можно перетащить, изменить его размер или закрыть.

    !Схема стандартного расположения окон в редакторе Unity (Layout 'Default').

    Рассмотрим пять главных окон, с которыми вы будете работать 90% времени.

    1. Scene View (Окно сцены)

    Это ваше рабочее пространство, «строительная площадка». Здесь вы свободно перемещаетесь в трехмерном пространстве, расставляете объекты, вращаете их и масштабируете. То, что вы видите в окне сцены, — это черновик вашего мира. Игрок не видит вспомогательные линии, иконки источников света и сетку, которые видите вы.

    2. Game View (Окно игры)

    Это взгляд глазами игрока. Когда вы нажимаете кнопку Play (треугольник вверху экрана), игра запускается именно в этом окне. Здесь работает физика, скрипты и освещение так, как это задумано в финальной версии.

    > Важно: Любые изменения, сделанные в режиме Play (когда игра запущена), не сохраняются после остановки игры. Используйте этот режим только для тестирования.

    3. Hierarchy (Иерархия)

    Это список всего, что находится в данный момент на вашей сцене. Если в окне сцены вы видите дерево, то в окне иерархии обязательно будет строчка с названием «Tree». Иерархия показывает структуру объектов: кто является «родителем», а кто «дочерним» объектом (об этом мы поговорим ниже).

    4. Project (Проект)

    Это ваш файловый менеджер. Здесь хранятся все ресурсы игры (ассеты): 3D-модели, текстуры, звуки, скрипты с кодом.

    Важное отличие: * Окно Project — это склад всех доступных материалов. * Окно Hierarchy — это список того, что вы уже вытащили со склада и поставили на сцену.

    5. Inspector (Инспектор)

    Это панель свойств. Когда вы выделяете объект в Иерархии или Сцене, в Инспекторе отображается вся информация о нем: его координаты, цвет, физические свойства и настройки.

    Ключевые понятия: Сцена, GameObject и Компоненты

    Чтобы понять логику Unity, нужно усвоить три фундаментальных понятия.

    Сцена (Scene)

    Сцена — это контейнер для вашего уровня или меню. В простой игре может быть одна сцена (сам уровень), в сложной — сотни (Главное меню, Уровень 1, Уровень 2, Экран победы). Сцена — это файл с расширением .unity.

    Игровой объект (GameObject)

    Это самый важный концепт в Unity. Все, что есть в вашей игре — персонаж, камера, источник света, дерево, монетка — это GameObjects.

    Но сам по себе GameObject — это просто пустая оболочка, точка в пространстве. Он ничего не умеет и никак не выглядит. Чтобы GameObject стал чем-то осмысленным, к нему нужно добавить Компоненты.

    Компоненты (Components)

    Компоненты — это «кирпичики», из которых строится поведение и внешний вид объекта. Они добавляются в окне Inspector.

    Представьте, что GameObject — это пустой манекен. * Если надеть на него костюм рыцаря (добавить компонент Mesh Filter и Mesh Renderer), он станет выглядеть как рыцарь. * Если дать ему мозг (добавить Script), он начнет думать. * Если добавить ему массу (компонент Rigidbody), он начнет падать под действием гравитации.

    !Визуализация принципа композиции: пустой объект наполняется компонентами, обретая форму и функции.

    Компонент Transform и система координат

    Существует один компонент, который есть абсолютно у каждого игрового объекта, и его нельзя удалить. Это Transform (Трансформация).

    Компонент Transform отвечает за три свойства объекта в пространстве:

  • Position (Позиция) — где объект находится.
  • Rotation (Вращение) — как объект повернут.
  • Scale (Масштаб) — какого объект размера.
  • Система координат

    Unity использует трехмерную декартову систему координат. Позиция объекта описывается вектором из трех чисел:

    где: * — ось, направленная вправо (красная стрелка в редакторе). * — ось, направленная вверх (зеленая стрелка). * — ось, направленная вперед, в глубину экрана (синяя стрелка).

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

    Единицы измерения

    В Unity одна единица измерения (1 unit) условно равна одному метру. Это важно учитывать при настройке физики. Если ваш персонаж имеет рост 2 единицы, значит, он ростом 2 метра. Если вы сделаете дом высотой 1000 единиц, физический движок может работать некорректно из-за гигантских масштабов.

    Родительские и дочерние объекты

    В окне Hierarchy вы можете перетащить один объект на другой. Тогда первый объект станет дочерним (Child), а второй — родительским (Parent).

    Это создает жесткую связь:

  • Если вы двигаете родителя, ребенок двигается вместе с ним.
  • Если вы вращаете родителя, ребенок вращается вокруг центра родителя.
  • Если вы меняете масштаб родителя, ребенок тоже меняет размер.
  • При этом координаты дочернего объекта становятся локальными.

    Представьте, что вы сидите в поезде. * Глобально (относительно мира) вы несетесь со скоростью 100 км/ч. * Локально (относительно поезда) вы сидите неподвижно на месте (ваша скорость 0).

    В Unity, если дочерний объект имеет позицию , это значит, что он находится ровно в центре своего родителя, где бы этот родитель ни находился в мире.

    Навигация в сцене

    Чтобы эффективно работать, нужно уметь быстро перемещаться по Scene View. Вот основные горячие клавиши (при условии, что курсор мыши находится над окном сцены):

    * Колесико мыши (Scroll): Приближение и отдаление. * Зажатое колесико мыши: Панорамирование (сдвиг камеры влево-вправо-вверх-вниз). * Зажатая правая кнопка мыши (ПКМ): Вращение головой (осмотр). * ПКМ + W/A/S/D: Полет по сцене (как в шутерах от первого лица). * Клавиша F (Focus): Выделите объект в иерархии и нажмите F — камера мгновенно сфокусируется на нем.

    Инструменты трансформации

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

    * Q (Hand Tool): Прокрутка сцены (не двигает объекты). * W (Move Tool): Перемещение объекта (появляются стрелки осей). * E (Rotate Tool): Вращение объекта (появляются сферы осей). * R (Scale Tool): Масштабирование объекта (появляются кубики на концах осей). * T (Rect Tool): Изменение размеров 2D-объектов и интерфейса.

    Резюме

    Сегодня мы познакомились с фундаментом Unity. Мы узнали, что: * Unity Hub управляет проектами и версиями. * Scene View — для разработки, Game View — для теста. * GameObject — это контейнер, а Components — это его начинка. * Transform определяет положение, вращение и масштаб в осях . * Иерархия позволяет связывать объекты в структуры «Родитель-Ребенок».

    В следующей статье мы углубимся в работу с ассетами и создадим нашу первую простую сцену из примитивов.

    2. Основы скриптинга на C#: Жизненный цикл MonoBehaviour и взаимодействие компонентов

    Основы скриптинга на C#: Жизненный цикл MonoBehaviour и взаимодействие компонентов

    В предыдущей статье мы сравнили GameObject с пустым манекеном, а Компоненты — с одеждой или функциями, которые мы на него навешиваем. Теперь пришло время добавить этому манекену «мозг». В Unity роль мозга выполняют скрипты.

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

    Анатомия скрипта Unity

    Когда вы создаете новый C#-скрипт в окне Project (ПКМ -> Create -> C# Script) и открываете его, вы видите автоматически сгенерированный код. Давайте разберем его структуру.

    Здесь есть два критически важных момента:

  • Имя класса совпадает с именем файла. Если ваш файл называется PlayerController.cs, то и класс внутри должен называться public class PlayerController. Если они отличаются, Unity не сможет подключить этот скрипт к объекту.
  • Наследование от MonoBehaviour. Обратите внимание на двоеточие: class MyScript : MonoBehaviour. Это означает, что ваш скрипт — это не просто код, а Компонент Unity. Именно благодаря наследованию от MonoBehaviour вы можете перетащить этот скрипт на игровой объект в Инспекторе, и у него появляются методы Start, Update и доступ к координатам объекта.
  • Жизненный цикл MonoBehaviour

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

    Unity вызывает методы вашего скрипта в определенном порядке. Этот порядок называется Жизненным циклом (Lifecycle).

    !Упрощенная схема порядка выполнения основных методов в скрипте Unity.

    Рассмотрим главные «события» жизни скрипта.

    1. Awake()

    Это самый первый метод. Он срабатывает в тот момент, когда объект загружается в сцену. * Когда использовать: Для инициализации переменных, настройки ссылок на другие компоненты. * Особенность: Срабатывает, даже если сам скрипт (галочка рядом с именем компонента) выключен, но объект активен.

    2. Start()

    Этот метод срабатывает перед первым кадром игры. * Когда использовать: Для настройки логики, которая требует, чтобы все остальные объекты уже «проснулись» (прошли стадию Awake). * Особенность: Срабатывает только один раз за жизнь скрипта.

    3. Update()

    Это сердце вашей игры. Метод Update вызывается каждый кадр. Если ваша игра работает со скоростью 60 кадров в секунду (60 FPS), то код внутри Update выполнится 60 раз за одну секунду.

    * Когда использовать: Считывание ввода игрока (нажатие клавиш), перемещение персонажа, таймеры, простая логика.

    4. FixedUpdate()

    Этот метод вызывается через фиксированные промежутки времени (по умолчанию 0.02 секунды, или 50 раз в секунду).

    * Когда использовать: Исключительно для работы с физикой (силы, гравитация, столкновения). * Почему не Update? Частота кадров (Update) может скакать (то 60, то 30 FPS), что приведет к нестабильной физике. FixedUpdate гарантирует стабильность расчетов.

    Проблема частоты кадров и Time.deltaTime

    Представьте, что вы написали код для движения машины в методе Update:

    Если у игрока мощный компьютер, выдающий 120 FPS, машина сдвинется на 120 метров за секунду. Если у игрока слабый ноутбук с 30 FPS, машина проедет всего 30 метров. Это недопустимо — геймплей должен быть одинаковым для всех.

    Чтобы решить эту проблему, используется Time.deltaTime.

    Time.deltaTime — это время в секундах, которое прошло с момента отрисовки предыдущего кадра.

    Формула корректного движения выглядит так:

    Где: * — новая позиция объекта. * — текущая позиция объекта. * — скорость (единиц в секунду). * — время, прошедшее с последнего кадра (Time.deltaTime).

    В коде это выглядит так:

    Теперь, если FPS высокий, deltaTime будет очень маленьким числом. Если FPS низкий — deltaTime будет больше. В итоге за 1 секунду объект всегда пройдет ровно 5 метров.

    Взаимодействие компонентов

    Скрипт редко работает в одиночку. Ему часто нужно управлять другими компонентами на том же объекте (например, изменить цвет модели или толкнуть физическое тело).

    Для этого используется метод GetComponent<ТипКомпонента>().

    Пример: Изменение цвета

    Допустим, мы хотим, чтобы при старте игры наш объект становился красным. За цвет отвечает компонент Renderer (точнее, его свойство material).

    > Важно: Метод GetComponent довольно «тяжелый» для процессора. Не вызывайте его внутри метода Update (каждый кадр). Лучше один раз найти компонент в Start или Awake, сохранить его в переменную и использовать её.

    Переменные и Инспектор Unity

    Одна из самых мощных фишек Unity — тесная интеграция кода и редактора. Если вы объявите в скрипте публичную переменную, она появится в окне Inspector.

    Сохранив этот скрипт, вы увидите в Unity поля Health, Speed и Player Name, которые можно редактировать прямо мышкой, не открывая код.

    Это позволяет геймдизайнерам балансировать игру (менять скорость, урон, здоровье), не дергая программистов.

    Доступ к другим объектам

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

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

  • Пишем в скрипте врага: public Transform playerTarget;
  • Сохраняем скрипт.
  • В Инспекторе Unity появляется поле Player Target.
  • Перетаскиваем объект Игрока из иерархии в это поле.
  • Теперь враг имеет прямую ссылку на игрока и может считывать его координаты в любой момент.

    Резюме

    Сегодня мы разобрали фундамент программирования в Unity:

  • Скрипты наследуются от MonoBehaviour.
  • Awake и Start нужны для инициализации.
  • Update работает каждый кадр (для логики), а FixedUpdate — фиксированно (для физики).
  • Time.deltaTime делает игру независимой от мощности компьютера.
  • GetComponent позволяет управлять «соседями» (другими компонентами объекта).
  • Публичные переменные позволяют настраивать игру через Inspector.
  • В следующей статье мы научим наш объект реагировать на действия игрока и заставим его полноценно двигаться по уровню.