Разработка на Unity
Всем
Unity — кроссплатформенный игровой движок для 2D и 3D приложений. Теоретическую основу (что такое движок, компонентная модель) см. в главах Игровой движок и Виды игровых движков — Unity; здесь — практика в редакторе. Справочник API и lifecycle: Справочник по Unity.
Установка и настройка окружения
Для начала разработки нужны Unity Hub и IDE для C# (редактор кода).
-
IDE (на выбор):
- Visual Studio Community — https://visualstudio.microsoft.com/ru/vs/community/ — рабочие нагрузки "Разработка игр с использованием Unity" и "Разработка классических приложений .NET".
- JetBrains Rider (платный, есть trial) или Visual Studio Code + расширение C# — тоже поддерживаются; в Unity Hub: Edit → Preferences → External Tools укажите нужный редактор.
-
Установка Unity Hub и редактора:
- Скачайте Unity Hub с официального сайта Unity (https://unity.com/ru/download).
- Установите и запустите Unity Hub. Авторизуйтесь или создайте учетную запись.
- В разделе "Installs" добавьте новую версию Unity. Рекомендуется LTS-ветка (на момент обновления раздела — Unity 6 LTS); проверяйте актуальную LTS на unity.com/releases.
- Во время установки Unity выберите Visual Studio Community в качестве среды разработки по умолчанию.
-
Создание проекта:
- В Unity Hub перейдите во вкладку "Projects" и нажмите "New Project".
- Выберите подходящий шаблон (например, "3D").
- Укажите имя проекта и его расположение на диске.
- Нажмите "Create". Проект будет создан, и Unity Editor автоматически откроется.
-
Документация Unity:
- User Manual — концепции редактора, пайплайны, 2D/3D, UI (Help → Unity Manual или docs.unity3d.com/Manual).
- Scripting API — классы C# (
GameObject,Rigidbody, …): Help → Scripting Reference или поиск по API на сайте. - На компоненте в Inspector кнопка ? открывает страницу справки по этому API.
Основные окна редактора Unity
Интерфейс Unity состоит из нескольких основных панелей, каждая из которых выполняет свою функцию.
-
Scene View (Вид сцены):
- Представляет собой основное пространство для визуального редактирования сцены.
- Позволяет перемещать, вращать и масштабировать игровые объекты с помощью мыши и клавиш (W - перемещение, E - вращение, R - масштабирование).
- Инструменты в верхнем левом углу позволяют изменять режим просмотра (перспективный/ортогональный) и способ манипуляции объектами (перемещение по осям, вращение вокруг осей, масштабирование).
-
Game View (Вид игры):
- Отображает сцену так, как она будет выглядеть при запуске игры.
- Позволяет изменять разрешение экрана и соотношение сторон для тестирования адаптации интерфейса под разные устройства.
-
Hierarchy (Иерархия):
- Содержит список всех игровых объектов, находящихся на текущей сцене.
- Объекты могут быть организованы в виде дерева, где один объект является дочерним по отношению к другому (родитель-потомок). Дочерние объекты наследуют трансформации (позицию, вращение, масштаб) своего родителя.
-
Project Window (Окно проекта):
- Является файловым менеджером для всех ресурсов вашего проекта — скрипты, модели, текстуры, звуки, префабы и т.д.
- Позволяет организовывать ресурсы в папки (например,
Scripts,Models,Textures,Prefabs) для удобства управления. - Предоставляет доступ к настройкам импорта ресурсов и возможность создавать новые элементы (скрипты, материалы, префабы).
-
Inspector (Инспектор):
- Отображает все компоненты и их свойства для выбранного объекта в Hierarchy или Scene View.
- Это центральное место для настройки поведения объектов. Здесь можно изменять параметры компонентов, назначать ссылки на другие объекты и загружать ресурсы (например, модель или текстуру).
- Все изменения, внесенные в Inspector, сохраняются вместе с объектом.
-
Console (Консоль):
- Отображает сообщения, генерируемые во время выполнения сцен (логи), а также предупреждения и ошибки.
- Критически важна для отладки кода. Ошибки в скриптах будут выделены красным цветом, и щелчок по сообщению позволяет перейти к соответствующей строке в коде.
Игровые объекты и компоненты
Основой любой сцены в Unity являются игровые объекты (GameObject). Сам по себе GameObject — это пустой контейнер, который становится функциональным только после добавления к нему компонентов.
-
Создание объектов:
- Через контекстное меню в Hierarchy — клик правой кнопкой мыши ->
Create Empty(пустой объект) или выбрать тип объекта из раздела3D Object(Cube, Sphere, etc.). - Через главное меню:
GameObject->Create Empty/3D Object. - Через кнопку "+" в верхней части панели Hierarchy.
- Через контекстное меню в Hierarchy — клик правой кнопкой мыши ->
-
Основные компоненты:
- Transform: Присутствует у каждого GameObject. Мировые координаты (
position) и локальные относительно родителя (localPosition). Дочерний объект наследует движение родителя в иерархии. - Mesh Renderer: Отвечает за визуализацию объекта. Получает геометрию из компонента
Mesh Filterи применяет к ней материал. - Mesh Filter: Хранит сетку (mesh) объекта, которая определяет его форму.
- Collider — Определяет физическую границу объекта для системы обнаружения столкновений (например,
Box Collider,Sphere Collider). - Rigidbody: Придает объекту физические свойства (массу, инерцию) и позволяет ему взаимодействовать с системой физики Unity. Объекты с Rigidbody подвержены действию силы тяжести и могут сталкиваться с другими объектами, имеющими Collider.
- Transform: Присутствует у каждого GameObject. Мировые координаты (
-
Настройка свойств через Inspector:
- Для изменения поведения объекта необходимо настроить параметры его компонентов в Inspector.
- Например, чтобы объект падал, добавьте к нему компонент
Rigidbody. Чтобы он мог сталкиваться с другими объектами, убедитесь, что у него и у других объектов есть компонентыCollider.
Префабы — повторное использование объектов
Префаб (Prefab) — это шаблон игрового объекта, который может быть многократно использован в сцене. Это ключевой инструмент для обеспечения согласованности и эффективности разработки.
-
Создание префаба:
- Создайте и настройте игровой объект в сцене (например, настройте его компоненты, назначьте текстуры).
- Перетащите этот объект из панели Hierarchy в папку
Prefabsв окне Project. - Объект в сцене станет экземпляром префаба (его название в Hierarchy будет синим).
-
Преимущества использования префабов:
- Упрощение управления: Все экземпляры одного префаба имеют одинаковую базовую конфигурацию.
- Легкость в тестировании и обновлении: Если вы внесете изменения в сам префаб (в папке Project), все его экземпляры на всех сценах автоматически получат эти изменения. Это позволяет быстро вносить глобальные изменения (например, изменить здоровье врага).
- Гибкость — Экземпляры префаба можно модифицировать (например, изменить позицию или цвет материала), и при необходимости применить эти изменения обратно к оригинальному префабу с помощью кнопки "Apply All" в разделе Overrides в Inspector.
Блок-out уровня (white-boxing)
Перед финальным артом удобно собрать серую коробку уровня из примитивов Unity — так проверяют масштаб, проходимость и ритм боя без затрат на модели.
- Создайте родительский объект
Environmentи дочерниеCube/Planeдля пола, стен, укрытий. - Выровняйте сетку (Scene → включите Grid и Snap, шаг 1 м) — игрок-капсула ≈ 2 м высотой, проходы шириной не меньше 1,5–2 м.
- Назначьте простые Materials (разные цвета Albedo) — игрок, пол, стены, предметы легко различать в Play Mode.
- Готовые группы (игрок, враг, бонус) сохраните как префабы в
Prefabs/.
Для учебного прототипа достаточно One-Page — одностраничного описания концепта, механик и win/lose.
Шаблон и типы документов (GDD, TDD, One-Page) — в гейм-дизайне.
Освещение сцены
| Тип | Роль | Типичное применение |
|---|---|---|
| Directional Light | "Солнце", параллельные лучи | Открытые арены, день/ночь через поворот |
| Point Light | Сфера света из точки | Факелы, лампы, взрывы |
| Spot Light | Конус, как прожектор | Фонари, вспышки, "конус видимости" в стелсе |
Кратко о режимах: Realtime — свет считается каждый кадр (дороже); Baked — освещение запекается в lightmap для статичной геометрии (дешевле в runtime). Для white-box достаточно одного Directional Light и ambient в Window → Rendering → Lighting.
Работа со скриптами
Скрипты на C# определяют логику и поведение игровых объектов. Готовые фрагменты с построчным разбором — Unity C# — скрипты для новичков.
Игровой цикл
Игровой цикл — каждый кадр движок повторяет: ввод → логика → физика → отрисовка. Если шаг тормозит, падает FPS.
flowchart LR
A[Awake / Start] --> B[Update: ввод, логика]
B --> C[FixedUpdate: физика]
C --> D[LateUpdate: камера]
D --> E[Рендер кадра]
Unity раскладывает цикл по методам MonoBehaviour:
| Метод | Назначение |
|---|---|
Awake |
Инициализация ссылок (один раз при создании объекта) |
Start |
Логика старта сцены (один раз перед первым Update) |
Update |
Кадровая логика: ввод, UI, таймеры (Time.deltaTime — длительность кадра) |
FixedUpdate |
Физика с фиксированным шагом (~50 Гц); силы и Rigidbody — здесь |
LateUpdate |
Камера и следование за целью — после всех Update |
Разбор: скорость в Update умножайте на Time.deltaTime. Силы к Rigidbody — в FixedUpdate. Камеру за игроком удобнее двигать в LateUpdate.
При Time.timeScale = 0 игра на паузе: Update может вызываться, но Time.deltaTime равен нулю, физика не продвигается. Подробная таблица — в справочнике. Готовый каркас MonoBehaviour с построчным разбором — Unity C# — скрипты для новичков.
Ввод с клавиатуры: в примерах ниже используется классический Input Manager (
Input.GetKeyDown,Input.GetAxis) — он по-прежнему работает в многих учебных проектах. В новых шаблонах Unity по умолчанию часто включён пакет Input System (UnityEngine.InputSystem). Для продакшена выберите один подход в Project Settings → Player → Active Input Handling и придерживайтесь его во всём проекте.
-
Создание скрипта:
- В окне Project кликните правой кнопкой мыши ->
Create->C# Script. - Назовите скрипт (например,
PlayerController) и дважды щелкните по нему, чтобы открыть в Visual Studio.
- В окне Project кликните правой кнопкой мыши ->
-
Прикрепление скрипта к объекту:
- Перетащите файл скрипта из окна Project на объект в Hierarchy.
- Альтернативно, выберите объект, затем в Inspector нажмите
Add Componentи введите имя скрипта. - После этого скрипт появится в списке компонентов объекта в Inspector.
-
Ссылки в Inspector (
[SerializeField]vspublic):- Поля с
[SerializeField]видны в Inspector, но остаются приватными в C# — так обычно делают в продакшене.publicтоже сериализуется, но открывает поле всем скриптам.
- Поля с
* После сохранения скрипта перетащите префаб яблока в поле `Apple Prefab` в Inspector. Движение по осям `Horizontal` / `Vertical` работает, если в *Input Manager* заданы эти оси (по умолчанию — WASD и стрелки).
- Тот же пример на Input System (пакет
com.unity.inputsystem, в шаблоне часто уже подключён):
Для продакшена удобнее Input Actions asset (Create → Input Actions) и компонент Player Input, чем жёстко прошитые клавиши в коде.
Работа с UI (User Interface)
Интерфейс пользователя — критически важный элемент любого приложения. В Unity для создания UI используется система Canvas, которая служит контейнером для всех элементов интерфейса, таких как кнопки, текст, полосы здоровья и т.д.
-
Создание Canvas:
- Создайте новый объект:
GameObject->UI->Canvas. - Canvas может работать в трех режимах рендеринга:
- Screen Space - Overlay: UI отображается поверх игры. Масштабируется автоматически под разрешение экрана.
- Screen Space - Camera: UI привязан к конкретной камере, что позволяет контролировать его глубину.
- World Space: UI является частью 3D-сцены и может быть помещен где угодно в игровом мире.
- Для большинства случаев рекомендуется использовать
Screen Space - Overlay.
- Создайте новый объект:
-
Основные элементы UI:
- Text / TextMeshPro: Отображает текст. TextMeshPro (TMP) — это продвинутая альтернатива стандартному Text, предлагающая лучшее качество шрифтов, эффекты (тенями, контурами) и гибкие настройки.
- Image: Отображает спрайты или цветные фоны. Используется для создания полос здоровья, иконок, рамок.
- Button: Интерактивная кнопка, реагирующая на клики. Состоит из компонентов
Image(для фона) иButton, который обрабатывает события нажатия. - Slider — Элемент для отображения прогресса (например, здоровье, энергия). Состоит из фона (
Background) и заполняемой области (Fill Area).
-
Настройка слайдера (Health Bar):
- Создайте слайдер:
GameObject->UI->Slider. - Удалите компонент
Handle Slide Area, если не нужна возможность перетаскивания бегунка. - В инспекторе найдите раздел
Fill Area->Fill. Настройте цвет и размер заполняемой части. - Чтобы управлять значением слайдера из скрипта, получите ссылку на компонент
Sliderчерез[SerializeField].
- Создайте слайдер:
Анимация и Timeline
Unity предоставляет мощные инструменты для создания анимации как 3D-объектов, так и UI.
-
Анимация свойств с помощью Animation Window:
- Выделите объект, который нужно анимировать.
- Откройте окно
Window->Animation->Animation. - Нажмите
Createи укажите имя анимации (например,FadeIn). Файл.animбудет создан в проекте. - Запишите ключевые кадры (keyframes), изменяя свойства объекта (позиция, вращение, масштаб, прозрачность материала) во времени.
- Для анимации прозрачности необходимо использовать материал со шейдером, поддерживающим прозрачность (например,
Standard (Transparent)).
-
Кривые анимации (Animation Curves):
- В окне Animation между keyframe'ами Unity рисует кривую интерполяции. Откройте Curves внизу окна Animation.
- Tangents (касательные) задают плавность: линейный участок — равномерное изменение, ease-in/out — мягкий старт и финиш (удобно для UI и дверей).
- Для циклического мигания можно зациклить клип (Loop Time в Inspector у
.anim).
-
Плавное изменение параметров (Lerp):
- Для плавного изменения числовых значений (например, высоты приседа, яркости света) используется линейная интерполяция
Mathf.Lerp. - Ключевой момент — использование
Time.deltaTimeдля независимости от частоты кадров. - Пример ниже двигает объект без
Rigidbodyчерезtransform— для кинематики и UI это нормально. У объекта с динамическимRigidbodyпозицию вUpdateлучше не задавать; используйтеAddForce/MovePositionвFixedUpdate.
- Для плавного изменения числовых значений (например, высоты приседа, яркости света) используется линейная интерполяция
Система частиц (Particle System)
Компонент Particle System создаёт дождь, искры, дым, след от двигателя без отдельных mesh на каждую искру.
GameObject→Effects→Particle System.- В Inspector настройте минимум:
- Duration / Looping — одноразовый взрыв или непрерывный эффект.
- Start Lifetime — сколько секунд живёт частица.
- Start Speed и Shape (Sphere, Cone, Box) — откуда вылетают частицы.
- Emission → Rate over Time — плотность потока.
- Для "удара" включите Play On Awake; для выстрела вызывайте
GetComponent<ParticleSystem>().Play()из кода.
В финальной сборке ограничивайте Max Particles и область эффекта — лишние частицы часто бьют по FPS (см. Оптимизация игр).
Движение игрока — Vector3 и три подхода
| Подход | Как двигаем | Плюсы | Минусы |
|---|---|---|---|
| Transform | transform.Translate / изменение position в Update |
Просто, предсказуемо для прототипа | Обходит физику; плохо для динамического Rigidbody |
| Rigidbody | AddForce, MovePosition, скорость в FixedUpdate |
Гравитация, столкновения, прыжок | Нужно не смешивать с телепортом через transform |
| Character Controller | CharacterController.Move |
Готовый человекообразный контроллер, ступеньки | Меньше "чистой" физики; свой компонент Unity |
Vector3 хранит позицию (x, y, z) и направление. Движение по плоскости пола — нормализуйте вектор WASD и умножайте на speed * Time.deltaTime (в Update) или задавайте силу/скорость в FixedUpdate для Rigidbody.
На капсуле игрока — Rigidbody, Capsule Collider, Freeze Rotation X/Z. Пол и платформы — слой Ground, его укажите в groundMask. Упрощённые учебные варианты (WASD без физики, прыжок, разбор каждой строки) — движение и прыжок в Lab.
Физические взаимодействия — Rigidbody, слои и Raycast
-
Rigidbody:
- Компонент
Rigidbodyдобавляет объекту массу, инерцию и позволяет ему подчиняться законам физики (гравитация, столкновения). - Движение динамического тела — через силы (
AddForce),MovePosition/MoveRotationили изменение скорости (linearVelocityв Unity 6+, ранееvelocity) вFixedUpdate, а не черезtransform.positionвUpdate.
- Компонент
-
Слои и
LayerMask:- У каждого
GameObjectесть слой (0–31). В Edit → Project Settings → Tags and Layers создайте, например, слойInteractable. Physics.Raycast(..., layerMask)проверяет только выбранные слои — так луч не "цепляет" пол и UI.- Матрица столкновений: Project Settings → Physics → Layer Collision Matrix.
- У каждого
-
Raycast (луч) — невидимый луч из точки в направлении; используется для выбора, стрельбы, подбора предметов.
Стрельба — Instantiate и LayerMask
Для выстрела создайте префаб снаряда (Sphere + Rigidbody + Sphere Collider + скрипт урона). Стрельба — Instantiate в точке firePoint с импульсом вперёд. LayerMask ограничивает, кого задевает луч проверки земли и куда попадает пуля.
Projectile.cs — уничтожение и урон:
Для частых выстрелов подключите Object Pooling вместо Destroy каждый кадр.
Переноска объектов (Raycast + Rigidbody)
- Создайте куб с
Rigidbody,Box Collider, скриптомDraggableObjectи тегомDraggableObject(Tags and Layers). - На игрока или камеру — скрипт
PlayerInteractionниже; в Inspector укажитеInteractable Layers(слой переносимых объектов).
DraggableObject.cs — объект, который следует за точкой перед камерой:
PlayerInteraction.cs — подбор и отпускание по ЛКМ (один файл, заменяет отдельный "учебный" Raycast):
Сцены и загрузка уровней
Проект в Unity состоит из одной или нескольких сцен. Каждая сцена представляет собой отдельную часть игры (меню, уровень, экран проигрыша).
-
Создание и добавление сцен:
- Создайте новую сцену:
File->New Scene. - Сохраните сцену в папке проекта (например,
Scenes/MainMenu.unity,Scenes/GameLevel.unity). - Для корректной загрузки сцены через API необходимо добавить ее в сборку. Перейдите в
File->Build Settings. - Перетащите все используемые сцены из окна Project в список "Scenes in Build". Это один из наиболее частых источников ошибок при запуске игры.
- Создайте новую сцену:
-
Загрузка сцены программно:
- Используйте пространство имен
UnityEngine.SceneManagement. - Метод
SceneManager.LoadScene()позволяет загрузить сцену по имени или индексу.
- Используйте пространство имен
Сохранение данных — PlayerPrefs
Для сохранения небольших объёмов данных между сессиями (громкость, последний уровень, координаты чекпоинта) можно использовать PlayerPrefs. Это простой key-value на диске, не защищённый от правок и не подходящий для сложного прогресса — для него чаще используют JSON-файл, облако или backend.
-
Основные методы:
PlayerPrefs.SetFloat(key, value)PlayerPrefs.SetInt(key, value)PlayerPrefs.SetString(key, value)PlayerPrefs.GetFloat(key, defaultValue)PlayerPrefs.GetInt(key, defaultValue)PlayerPrefs.GetString(key, defaultValue)
-
Пример: сохранение позиции чекпоинта:
На объекте-чекпоинте: Collider с Is Trigger; у игрока — Rigidbody (хотя бы kinematic) или Rigidbody на чекпоинте — иначе OnTriggerEnter не вызовется.
Virtual Camera (Cinemachine)
Пакет Cinemachine упрощает слежение камеры за целью, дрожание, кадрирование.
-
Установка: Package Manager →
Cinemachine. -
Версии: в Cinemachine 2.x пункт меню — Cinemachine Virtual Camera; в Cinemachine 3 объект называется Cinemachine Camera — смысл тот же (
Follow,Look At). -
Настройка камеры слежения:
- Создайте виртуальную камеру:
GameObject→Cinemachine→ Virtual Camera / Cinemachine Camera (зависит от версии пакета). - В инспекторе найдите поле
Followи перетащите туда объект игрока. Камера будет следовать за этим объектом. - В поле
Look Atтакже укажите игрока, чтобы камера всегда была направлена на него. - Настройте параметры в разделе
Body:Transposer— Задает смещение камеры относительно цели (например,(0, 2, -5)для вида от третьего лица).Damping: Контролирует плавность движения камеры. Высокие значения делают движение более медленным и плавным.
- Создайте виртуальную камеру:
Без Cinemachine: камеру на отдельном объекте можно двигать в LateUpdate, копируя позицию игрока + смещение (0, 2, -5) — так же, как в пошаговых учебниках по Unity; Cinemachine заменяет этот шаблонный код. Готовый скрипт SimpleCameraFollow с разбором — камера за игроком в Lab.
Работа с коллайдерами — триггеры и физические столкновения
Компонент Collider определяет форму границ объекта в пространстве. В зависимости от настройки, он может использоваться для двух различных целей: обнаружения физических столкновений или запуска событий при прохождении одного объекта сквозь другой (триггер).
-
Физическое столкновение:
- По умолчанию, когда у объекта есть Collider и Rigidbody, он будет физически взаимодействовать с другими объектами, имеющими Collider.
- Это используется для реализации стен, пола, подвижных платформ и т.д.
- События —
OnCollisionEnter,OnCollisionStay,OnCollisionExit.
-
Триггер (Trigger):
- Если в инспекторе компонента Collider установить флажок
Is Trigger, объект перестает быть "твердым" и позволяет другим объектам проходить сквозь него. - Вместо этого, при входе, пребывании и выходе другого объекта из зоны действия коллайдера, вызываются специальные события-триггеры.
- Широко применяется для:
- Запуска сценариев при входе игрока в область (например, активация чекпоинта).
- Сбора предметов (игрок проходит через объект-монету) — учебный пример с
ScoreManagerв Lab. - Обнаружения врагов в радиусе атаки.
- Активации ловушек или сюжетных событий.
- События —
OnTriggerEnter,OnTriggerStay,OnTriggerExit. - Условие срабатывания: хотя бы у одного из участников должен быть
Rigidbody(у игрока или у монеты). Оба объекта — сCollider; у триггера включёнIs Trigger.
- Если в инспекторе компонента Collider установить флажок
-
Счёт, здоровье и победа — GameManager:
Центральный GameManager хранит состояние сессии (здоровье, патроны, собранные предметы, флаг game over). UI подписывается на изменения через свойства или события C#.
GameHud.cs — обновление Slider и текста (TMP):
На монете — триггер, вызывающий GameManager.Instance.CollectItem() вместо отдельного счёта очков.
ИИ и навигация — NavMesh
NavMesh — "карта проходимости" уровня: Unity запекает её из геометрии, помеченной как статичная для навигации. NavMeshAgent на враге сам обходит препятствия и идёт к цели через SetDestination.
Настройка в редакторе
- Выберите корень уровня (
Environment), в Inspector → Static → Navigation Static (применить к дочерним объектам). - Window → AI → Navigation (в Unity 6 может понадобиться модуль AI Navigation в Package Manager).
- Вкладка Bake → Bake. Синие области на сцене — зоны ходьбы.
- На префаб Enemy добавьте Nav Mesh Agent (радиус и высота ≈ коллайдер капсулы).
Маршрут патруля — пустой родитель PatrolRoute и дочерние Waypoint в углах арены.
Преследование игрока (упрощённо): в Update задайте agent.SetDestination(player.position) если игрок в радиусе detectionRange; иначе — патруль по waypoints.
Урон и уничтожение врага:
Перезапуск уровня — вынесите в статический класс (логика не привязана к одному GameObject):
using UnityEngine;
using UnityEngine.SceneManagement;
public static class LevelRestart
{
public static void RestartActiveScene()
{
Time.timeScale = 1f;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
Кнопка "Retry" на Canvas вызывает LevelRestart.RestartActiveScene(). Подробнее API — Справочник по Unity; теория pathfinding — Игровой движок.
Singleton (`GameManager`), Object Pool (снаряды), Observer (`StateChanged`) — частые приёмы в Unity-проектах.
Обзор паттернов проектирования — Конструирование ПО.
Управление видимостью объектов — SetActive()
Метод SetActive() является основным способом программного управления видимостью и активностью игровых объектов. Это критически важно для таких элементов, как экраны меню, окна проигрыша, диалоговые окна и т.д.
-
Синтаксис:
gameObject.SetActive(bool state);true: объект становится активным и видимым.false— объект деактивируется, все его компоненты (включая скрипты) перестают работать, и он исчезает с экрана.
-
Пример: управление экраном проигрыша:
Оптимизация производительности — Object Pooling
Частое создание (Instantiate) и уничтожение (Destroy) объектов во время игры (например, пуль, частиц, монет) является крайне неэффективной операцией, которая может вызывать "лаги" (hitching). Паттерн Object Pooling решает эту проблему путем повторного использования уже созданных объектов.
-
Принцип работы:
- При старте игры создаются несколько экземпляров объекта (например, 10 пуль) и помещаются в "пул" (список), где они находятся в неактивном состоянии.
- Когда игре нужна пуля, она берется из пула (активируется), а не создается заново.
- Когда пуля больше не нужна (например, достигла цели или вышла за пределы экрана), вместо удаления она возвращается в пул (деактивируется и помещается обратно в список).
-
Преимущества:
- Исключение затрат времени на динамическое выделение памяти (
Instantiate/Destroy). - Гладкая работа игры даже при высокой частоте появления объектов.
- Исключение затрат времени на динамическое выделение памяти (
-
Базовая реализация пула:
Подготовка к сборке проекта
Перед выпуском игры необходимо правильно настроить параметры сборки.
-
Добавление сцен в сборку:
- Перейдите в
File->Build Settings. - Убедитесь, что все используемые сцены (меню, уровни, экран проигрыша) добавлены в список "Scenes in Build". Сцены без них не будут загружены в финальной версии игры.
- Перейдите в
-
Настройка целевой платформы:
- В окне
Build Settingsвыберите целевую платформу (PC, Mac & Linux Standalone, Android, iOS и т.д.). - Нажмите
Switch Platformдля применения настроек.
- В окне
-
Параметры сборки:
- Выберите тип сборки: Разработка Build (для отладки) или обычную сборку.
- Укажите путь для сохранения собранного проекта.
- Нажмите
Buildдля создания исполняемого файла и связанных с ним данных.
Заключение — отладка и финальная сборка
Перед выпуском игры в свет необходимо тщательно протестировать ее работу и выполнить корректную сборку. Этот этап критически важен для обеспечения стабильности и работоспособности финального продукта.
-
Комплексное тестирование:
- Проверьте все механики игры — перемещение, взаимодействие с объектами (
PlayerInteraction/ Raycast), сбор предметов, поведение врагов. - Убедитесь, что пользовательский интерфейс (UI) отображается корректно — Health Bar, полоса энергии, счётчик очков. Элементы не должны обрезаться при смене разрешения.
- Протестируйте логику сохранения прогресса через
PlayerPrefs. Остановите игру после прохождения чекпоинта и убедитесь, что игрок возрождается в правильной точке при следующем запуске. - Проверьте загрузку всех сцен: переход из меню в игру, экран проигрыша и возможность рестарта.
- Проверьте все механики игры — перемещение, взаимодействие с объектами (
-
Оптимизация производительности:
- Если игра работает с низким FPS, проверьте использование ресурсоемких элементов.
- Уменьшите количество частиц в системах
Particle Systemили ограничьте их область действия. - Убедитесь, что для анимаций используется паттерн Object Pooling, особенно если они создаются часто.
- Слишком сложные модели или текстуры большого размера могут замедлять игру; рассмотрите возможность использования оптимизированных ассетов.
-
Процесс сборки проекта:
- Перейдите в
File->Build Settings. - Убедитесь, что все необходимые сцены находятся в списке "Scenes in Build" и расположены в правильном порядке (например, первая — главное меню).
- Выберите целевую платформу (например, PC, Mac & Linux Standalone).
- Нажмите
Build. Укажите папку для сохранения и задайте имя исполняемого файла (например,ApplePicker.exe). - Unity создаст исполняемый файл и папку с данными (например,
ApplePicker_Data). Эти два компонента обязательно должны находиться в одной директории. Без папки с данными игра не запустится.
- Перейдите в
-
Финальная проверка:
- Выйдите из редактора Unity и запустите собранный
.exeфайл. - Проверьте, что игра запускается, все механики работают, аудио и видео воспроизводятся корректно.
- Убедитесь, что управление и камера реагируют адекватно, UI отображается без артефактов.
- Если возникают проблемы, вернитесь в редактор, проверьте пути к ресурсам, настройки скриптов и повторите процесс сборки.
- Выйдите из редактора Unity и запустите собранный