Создание раннера в Unity пошаговое руководство

Как сделать раннер на юнити

Как сделать раннер на юнити

Unity позволяет быстро создавать 2D и 3D раннеры благодаря встроенным инструментам физики, анимации и генерации уровней. Для старта важно выбрать правильную версию движка: рекомендуется Unity 2023.2 или выше, чтобы использовать улучшенные возможности системы Input и Package Manager.

В этом руководстве мы создадим бесконечный раннер с персонажем, который может бегать, прыгать и собирать объекты. Будут подробно рассмотрены методы генерации платформ по мере движения игрока, настройка Rigidbody и Collider для точной физики, а также организация анимаций через Animator Controller.

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

Создание раннера в Unity: пошаговое руководство

Для начала создайте новый 2D проект в Unity с разрешением 1920×1080 и частотой кадров 60 FPS. Настройте слои: «Player», «Platform», «Obstacle» и «Collectible». Это позволит управлять столкновениями и триггерами отдельно для каждой группы объектов.

Персонаж раннера должен использовать Rigidbody2D с Mass 1 и Gravity Scale 3. Для прыжков настройте Force 450 по оси Y и проверку касания платформ через Collider2D. Animator Controller необходимо организовать так, чтобы анимация бега переключалась автоматически при изменении скорости по X.

Генерация уровней реализуется через скрипт C#, который создает новые платформы каждые 5 единиц по X. Используйте Object Pooling для платформ и препятствий, чтобы снизить нагрузку на память и избежать падений FPS. Высота каждой новой платформы изменяется в диапазоне ±1.2 единицы от предыдущей.

Элемент Настройка Рекомендация
Player Rigidbody2D, Collider2D, Animator Controller Mass 1, Gravity Scale 3, Force прыжка 450
Platform BoxCollider2D, SpriteRenderer Object Pooling, ширина 3–5 единиц
Obstacle Collider2D, SpriteRenderer Проверка столкновений через OnTriggerEnter2D
Collectible Collider2D, Rigidbody2D (Kinematic) Сбор очков при касании, удаление после pick-up

Для управления персонажем используйте Input.GetKeyDown(KeyCode.Space) для прыжка и добавьте проверку, что персонаж находится на платформе. Скорость движения по X рекомендуется фиксировать на 6–8 единиц/сек, чтобы уровень оставался контролируемым и игровой процесс предсказуемым.

Настройка проекта и подготовка сцены для раннера

Создайте новый проект Unity 2D с версией 2023.2 или выше. В настройках проекта установите Target Platform на PC, Mac & Linux Standalone или Android/iOS в зависимости от платформы. Частота кадров 60 FPS, масштаб камеры 1:1 для точного контроля спрайтов.

Создайте слои: Player, Platform, Obstacle и Collectible. Это позволит точно настраивать взаимодействие объектов через Physics2D Layer Collision Matrix. Для сцены настройте основной Camera с Orthographic размером 5 единиц по высоте и позиционируйте в точке (0, 0, -10).

Добавьте базовую платформу шириной 5 единиц с BoxCollider2D и SpriteRenderer. Установите Sorting Layer «Ground», чтобы визуально отделить платформы от игрока и объектов. Для персонажа создайте пустой GameObject с Rigidbody2D, Collider2D и Animator Controller, предварительно назначив слой Player.

Определите размеры игровой области: горизонтальный лимит видимости камеры ±9 единиц, вертикальный диапазон ±5 единиц. Это позволит скрипту генерации платформ и объектов корректно создавать новые элементы без выхода за видимую область.

Создание персонажа и настройка его анимаций

Создание персонажа и настройка его анимаций

Создайте GameObject для персонажа и добавьте компоненты Rigidbody2D и BoxCollider2D. Установите Mass 1, Gravity Scale 3, Collision Detection на Continuous. Размер Collider подберите так, чтобы он точно соответствовал визуальным границам спрайта, обычно ширина 1 единица, высота 2 единицы.

Импортируйте спрайты для бега, прыжка и падения. Создайте Animator Controller с состояниями Run, Jump, Fall. Настройте Transitions с условием изменения скорости по X для Run и триггером JumpTrigger для прыжка. Убедитесь, что Exit Time отключен, чтобы анимации переключались мгновенно при смене состояния.

Для плавного переключения добавьте Blend Tree по скорости горизонтального движения. Используйте параметр SpeedX, чтобы анимация бега адаптировалась под ускорение и замедление персонажа. Для прыжка примените отдельный триггер JumpTrigger, который активируется при нажатии клавиши прыжка и проверке контакта с платформой через OnCollisionStay2D.

Настройте слои Animator: основной слой для движения и отдельный слой для визуальных эффектов (например, мерцание при сборе предметов) с Weight 1. Это позволит добавлять дополнительные анимации без влияния на основной цикл бега и прыжков.

Реализация движения персонажа и управление прыжками

Создайте скрипт C# для управления персонажем. Добавьте в него следующие ключевые элементы:

  • Горизонтальное движение: фиксированная скорость 6–8 единиц/сек по оси X через Rigidbody2D.velocity.
  • Прыжок: сила 450 по оси Y при условии, что персонаж находится на платформе. Проверка через Physics2D.OverlapCircle под ногами.
  • Ограничение двойного прыжка: переменная canJump, которая сбрасывается после касания платформы.
  • Обработка нажатий: Input.GetKeyDown(KeyCode.Space) для прыжка.

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

  1. Mass = 1, Gravity Scale = 3, Drag = 0.
  2. Collision Detection = Continuous для точного отслеживания контактов с платформами.
  3. Freeze Rotation Z, чтобы персонаж не переворачивался при столкновениях.

Для анимаций:

  • Передавайте текущую скорость X в Animator через параметр SpeedX для переключения между Idle и Run.
  • Используйте триггер JumpTrigger, активируемый при нажатии клавиши прыжка.
  • Добавьте проверку OnCollisionEnter2D для возврата в состояние бега после приземления.

Для плавности движения применяйте Rigidbody2D.velocity = new Vector2(speedX, rb.velocity.y) вместо прямого изменения позиции, чтобы корректно работала физика и столкновения.

Проектирование бесконечного уровня с генерацией платформ

Проектирование бесконечного уровня с генерацией платформ

Создайте скрипт C# для генерации платформ, который будет отслеживать позицию игрока и создавать новые сегменты по мере продвижения. Используйте Object Pooling для платформ, чтобы повторно использовать объекты и снизить нагрузку на память.

Каждая новая платформа должна иметь ширину от 3 до 5 единиц и располагаться на высоте ±1.2 единицы относительно предыдущей. Это сохраняет плавность и предсказуемость уровня, не создавая невозможных прыжков.

Алгоритм генерации:

  • Определите правый край последней платформы.
  • Создайте новую платформу на расстоянии 3–5 единиц вправо.
  • Случайно измените высоту в пределах ±1.2 единицы.
  • Добавьте препятствия и collectible через случайное распределение.
  • Удалите платформы, которые вышли за левый край камеры, чтобы освободить память.

Используйте Transform.position для точного контроля расположения объектов. Для плавного визуального эффекта применяйте одинаковый Sorting Layer для платформ и фоновых элементов, чтобы избежать наложений.

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

Добавление препятствий и проверка столкновений

Создайте префабы препятствий с BoxCollider2D или PolygonCollider2D для точного соответствия форме спрайта. Установите Is Trigger на false для физических столкновений или true для триггеров, если столкновение только должно инициировать событие (например, потерю жизни).

Разместите препятствия на платформе через скрипт генерации, соблюдая минимальное расстояние 1.5–2 единицы от предыдущего объекта. Используйте Random.Range для варьирования позиции по горизонтали и вертикали в пределах платформы.

Для проверки столкновений применяйте OnCollisionEnter2D для физических объектов или OnTriggerEnter2D для триггеров. В методах проверяйте тег объекта:

  • Если тег Obstacle, активировать потерю здоровья или перезапуск уровня.
  • Если тег Collectible, увеличить счет и деактивировать объект.

Для стабильной работы физики Rigidbody2D персонажа настройте Collision Detection на Continuous и убедитесь, что слои Player и Obstacle разрешают взаимодействие в Layer Collision Matrix. Это предотвращает прохождение через препятствия на высоких скоростях.

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

Сбор монет и система очков

Сбор монет и система очков

Создайте префаб монеты с CircleCollider2D и установите Is Trigger на true, чтобы персонаж мог проходить сквозь объект, активируя событие сбора. Добавьте тег Collectible для фильтрации столкновений в скриптах.

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

Для учета очков создайте переменную score в скрипте игрока. При столкновении с монетой через OnTriggerEnter2D увеличивайте значение на 1–5 единиц в зависимости от типа монеты и деактивируйте объект с помощью SetActive(false).

Для отображения счета используйте TextMeshProUGUI и обновляйте текст после каждого сбора монеты. Рекомендуется добавить звуковой эффект при сборе и небольшой визуальный эффект, например, вспышку или увеличение масштаба монеты перед исчезновением, чтобы игрок получал мгновенную обратную связь.

Оптимизируйте производительность, создавая Object Pool для монет, чтобы избегать постоянного Instantiate и Destroy, особенно при высокой частоте появления объектов на бесконечном уровне.

Оптимизация и тестирование на разных устройствах

Оптимизация и тестирование на разных устройствах

Для поддержания стабильного FPS на мобильных и десктопных устройствах используйте следующие методы оптимизации:

  • Object Pooling: повторно используйте платформы, препятствия и монеты вместо постоянного Instantiate и Destroy.
  • Сжатие спрайтов: используйте форматы PNG или WebP с оптимизированным разрешением, минимизируйте количество прозрачных пикселей.
  • Ограничение Update: переместите не критические вычисления в FixedUpdate или Coroutines с интервалом 0.1–0.2 сек для снижения нагрузки на CPU.
  • Physics2D: отключите ненужные коллайдеры, уменьшите количество слоев в Layer Collision Matrix.
  • Animator: используйте Animator Culling Mode «Cull Update Transforms» для объектов вне камеры.

Для тестирования на разных устройствах:

  1. Запустите игру на минимально и максимально мощных устройствах, чтобы определить узкие места в производительности.
  2. Проверяйте корректность Collider и триггеров на разных разрешениях экрана, включая нестандартные соотношения сторон.
  3. Используйте Profiler Unity для анализа потребления CPU, GPU и памяти, выявляя объекты с высокой нагрузкой.
  4. Проводите тесты на длительное время, чтобы проверить стабильность Object Pooling и отсутствие утечек памяти.
  5. Обновляйте настройки Quality и Compression под целевую платформу, снижая разрешение текстур или отключая сложные эффекты при необходимости.

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

Вопрос-ответ:

Как настроить Rigidbody2D для персонажа раннера, чтобы прыжки выглядели естественно?

Для естественного движения используйте Mass 1 и Gravity Scale около 3. Сила прыжка должна соответствовать размеру платформ — для платформ шириной 3–5 единиц оптимально Force Y = 450. Убедитесь, что Collision Detection установлен на Continuous, а Rotation Z заморожен, чтобы персонаж не переворачивался при столкновениях. Также стоит проверять касание платформ через Physics2D.OverlapCircle или OnCollisionStay2D, чтобы прыжок срабатывал только при контакте с землей.

Как правильно организовать генерацию бесконечных платформ в Unity без падения FPS?

Реализуйте Object Pooling для повторного использования платформ и препятствий вместо постоянного Instantiate и Destroy. Расстояние между платформами выбирайте в пределах 3–5 единиц по горизонтали, высоту — ±1.2 единицы. Удаляйте объекты, которые вышли за левый край видимой области камеры. Используйте массив префабов для визуального разнообразия и добавляйте случайные препятствия и collectible. Такой подход снижает нагрузку на память и предотвращает проседание кадров.

Каким образом лучше настраивать анимации персонажа в раннере?

Создайте Animator Controller с состояниями Run, Jump и Fall. Для бега используйте Blend Tree по скорости по оси X, чтобы анимация адаптировалась под ускорение и замедление. Прыжок активируйте триггером JumpTrigger при нажатии клавиши и проверке касания платформы. Настройте слои Animator так, чтобы визуальные эффекты (например, мерцание при сборе монет) не влияли на основной цикл бега и прыжка.

Как реализовать сбор монет с учетом разных типов монет и очков?

Для каждой монеты используйте CircleCollider2D с Is Trigger = true и тег Collectible. В скрипте игрока создайте переменную score. При OnTriggerEnter2D проверяйте тег объекта и добавляйте очки в зависимости от типа монеты (например, обычная — 1, редкая — 5). После сбора монету деактивируйте через SetActive(false) или возвращайте в Object Pool. Для визуальной обратной связи добавьте эффект увеличения масштаба или вспышку, а также звуковой сигнал.

Какие методы проверки и оптимизации игры подходят для разных устройств?

Для тестирования используйте устройства с минимальной и максимальной производительностью, проверяя стабильность FPS и корректность физики. Применяйте Profiler Unity для анализа использования CPU, GPU и памяти. Оптимизируйте спрайты (сжатие PNG или WebP), ограничивайте Update и используйте Coroutines для тяжелых вычислений. Настройте Object Pool для платформ, препятствий и монет, отключайте ненужные коллайдеры и проверяйте Layer Collision Matrix, чтобы исключить лишние проверки столкновений.

Ссылка на основную публикацию