Как создать простую 2D-игру на Unity

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

Unity — это движок для создания игр в 2D и 3D. Он позволяет в несколько раз ускорить разработку, потому что берет на себя огромную часть задач программиста:

  • физику;
  • графику;
  • анимацию;
  • работу со звуком.

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

  • Outlast;
  • Hearthstone;
  • Cuphead;
  • Rust;
  • Firewatch;
  • Inside;
  • Cities: Skylines и другие.

Евгений Кучерявый

Пишет о разработке сайтов, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.


Из этой статьи вы узнаете, из каких компонентов создается игра и как написать свой первый проект.

Как установить Unity

Скачать Unity можно на официальном сайте. Новичкам будет достаточно бесплатного тарифа “Personal”.

Важный момент! Последняя версия движка, которую предлагается скачать по умолчанию, может не поддерживаться на старых компьютерах; подходящую под возможности вашего компьютера версию стоит поискать в архиве версий. Игра для этой статьи написана на Unity 5.5.0f3. Интерфейс более поздних версий не сильно менялся, поэтому это руководство подойдет и для них.

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

Запустите установщик и следуйте инструкциям. Кроме самого движка, вам предложат установить Microsoft Visual Studio — интегрированную среду разработки. Она предоставляет лучшие возможности по работе со скриптами в Unity, но занимает много места на диске.

Если она уже установлена или если используется другой редактор кода, уберите галочку. Альтернативами могут быть Microsoft Visual Studio Code (более легкая версия Visual Studio) или MonoDevelop — встроенный редактор Unity.

Когда установка завершится, пора приступать к разработке своей первой игры.

Как создать проект в Unity

Для начала запустите Unity и нажмите кнопку New или New project.

В появившемся окне нужно указать название проекта, его местоположение на диске и количество измерений. Лучше выбрать 2D, потому что с ним проще разобраться с Unity.

На подготовку файлов для проекта уйдет какое-то время, затем появится основное окно редактора Unity:

На слабых компьютерах может появляться розовый фон и следующая ошибка:

SceneView Selected shader is expected to have 7 passes

Чтобы устранить ее, нажмите кнопку Gizmos, а потом уберите галочку с пункта Selection Outline:

Затем зайдите в пункт меню Edit и в подменю Graphics Emulation выберите Shader Model 2:

Проект создан, можно начинать работу. Полный код игры из этой статьи вы можете найти в репозитории на GitHub. Там же есть все ассеты и скрипты.

Как добавить объект в Unity

Начните с добавления объектов: перетащите ассет из поля Assets внизу экрана. Ассетами называют компоненты, которые нужны для создания игры.

Для удобства можно поместить их в отдельные папки:

  • Scenes — локации в игре.
  • Scripts — скрипты на выбранном вами языке программирования, с помощью которых будет работать механика игры.
  • Sprites — двухмерные изображения предметов, персонажей, фонов и так далее.
  • Prefabs — заготовки игровых объектов.

Создать папки и добавить файлы можно как в Unity, так и просто в обозревателе Windows. Создавать скрипты лучше с помощью движка, потому что он будет автоматически добавлять заготовку кода (подробнее об этом расскажем ниже).

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

Чтобы сквозь него не пролетали другие объекты, нужно добавить к нему компонент типа Collider 2D (коллайдер, от англ. Collision — столкновение) из категории Physics 2D. Выбирайте тот тип, который соответствует форме спрайта: например, Circle Collider 2D (если это шар) или Box Collider 2D (если квадрат).

Добавление компонента «Коллайдер»

Коллайдер позволяет указать границы объекта, через которые не сможет пройти другой объект, для которого также указаны рамки. Чтобы подогнать края под размер спрайта, нажмите Edit Collider.

Изменение масштабов коллайдера

Дальше нужно добавить компонент Rigidbody 2D: именно он отвечает за физику объекта.

Добавление компонента Rigidbody 2D

Теперь можно приступить к настройкам: например, поставить галочку возле Freeze Rotation, чтобы запретить объекту вращаться. В этой игре используется шар, поэтому замораживать вращение не нужно.

Также в поле Interpolate укажите Interpolate — это сделает движение объекта более плавным.

Настройки интерполяции объекта

Чтобы изменить скорость падения, нужно изменить гравитацию для всего проекта. Сделать это можно в меню Edit —> Project Settings —> Physics 2D.

Вход в настройки физики проекта

Справа появятся настройки, где можно будет изменить гравитацию по оси Y или оси X. По умолчанию она равна –9.98f, но для 2D-игры лучше подойдет –30f.

Если нужно, измените Gravity Scale самого объекта — множитель гравитации. Попробуйте разные значения, чтобы подобрать подходящую скорость.

Теперь можно нажать кнопку Play над сценой и посмотреть, как объект падает. Чтобы он не летел в пустоту, под ним нужно поставить платформу. Для этого добавьте в игру спрайт, который будет изображать землю, и укажите ему подходящий коллайдер.

Создание платформы

Обратите внимание, что Rigidbody 2D указывать не нужно, иначе платформа будет падать.

Теперь платформу можно сохранить как заготовку. Для этого перетащите ее из боковой левой панели в папку Prefabs. Оттуда можно добавлять копии объектов на карту.

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

Добавление объектов и установка их границ и физики в Unity

Как добавить скрипт в Unity

С помощью кода можно прописать поведение объекта. В Unity для этого используются языки C# и JavaScript. Скрипты тоже являются ассетами и добавляются к объектам в виде компонентов.

Начать создание скриптов можно с класса для управления персонажем. Для этого зайдите в папку Scripts, нажмите правую кнопку, выберите Create —> С# Script. Дайте скрипту какое-нибудь понятное название вроде PlayerControl.

Создание скрипта на C#

Откройте созданный скрипт в любом удобном вам редакторе. Вот как выглядит шаблон кода в Unity:

using System.Collections; //Можете убрать подключение коллекций, если не будете их использовать, это снизит общий объем проекта
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

       //Метод, который запускается при старте игры
         void Start () {

        }
       
        //Метод, который выполняется при каждой смене кадра — тут и будет происходить управление объектом
        void Update () {
        }
}

Добавьте скрипт в качестве компонента для объекта и приступайте к написанию кода. Начать стоит с создания полей.

public float maxHealth = 100; //Здоровье игрока
public float currHealth = 100;
public Rigidbody2D rb; //С помощью Rigidbody 2D будет осуществляться управление объектом
public float jumpForce = 7000f; //Сила прыжка
public float speed = 5f; //Скорость движения

Внутри метода Start() нужно инициализировать Rigidbody 2D.

rb = GetComponent<Rigidbody2D>();

Теперь в Update() можно добавить следующий код:

if(currHealth > 0) //Управление объектом будет доступно, если здоровье выше нуля
{
     float moveX = Input.GetAxis("Horizontal"); //Получение направления движения
     rb.MovePosition(rb.position + Vector2.right * moveX * speed * Time.deltaTime); //Изменение позиции
     if(Input.GetKeyDown(KeyCode.UpArrow)) //Действия при нажатии стрелочки вверх
     {
         rb.AddForce(Vector2.up * jumpForce); //Добавление силы прыжка
     }
}
else
{
      Destroy(gameObject); //Если здоровье ниже нуля, то объект будет удален
    //Обратите внимание, что в качестве аргумента указан gameObject, а не this
    //Если указать this, то для текущего объекта будет отключен этот скрипт
}

Для указания координат используются статические классы Vector2(x, y) и Vector3(x, y, z) — они пригодятся не только для написания скрипта ходьбы, но для любых других целей, в которых требуется указание позиции.

Unity по умолчанию устанавливает клавиши, которые меняют движение по осям:

Так, если пользователь нажмет стрелку вправо или D, то направление по оси X будет равно +1, если влево, то −1, если ничего не предпримет — 0. Чтобы получить это значение, используется метод GetAxis() статичного класса Input.

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

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

Вот как работает игра с таким управлением.

Обратите внимание, что камера следует за игроком. Чтобы это реализовать, нужно добавить вот такой скрипт:

using UnityEngine;

public class CameraFix : MonoBehaviour
{
     public GameObject player;
     void Update()
     {
          transform.position = new Vector3(player.transform.position.x, player.transform.position.y, -10f);
     }
}

Его нужно подключить к объекту Main Camera:

Чтобы передать скрипту объект игрока (в нашем примере это круг), в настройках компонента указывается значение для поля Player. Если не получается найти нужный объект в списке, просто перетащите его.

По тому же принципу работает полоса здоровья: ее положение зависит от координат персонажа:

using UnityEngine;

public class Health : MonoBehaviour
{
     public PlayerControl player;
     void Update ()
     {
          //Получение длины полосы
          float healthPercent = (player.currHealth / player.maxHealth) * 100;
          float healthLevel = healthPercent / 10;

          transform.localScale = new Vector3(healthLevel, 1f, 1f); //Изменение масштаба
          transform.position = new Vector3(player.transform.position.x, player.transform.position.y + 4f, transform.position.z); //Изменение позиции
    }
}

С помощью transform.localScale, кстати, можно менять размер мяча. Например, если немного приплюснуть его при приземлении, а потом вернуть в исходное состояние — это создаст более мультяшный эффект.

Как добавить триггер в Unity

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

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

Чтобы сделать это, добавьте спрайт на локацию, создайте коллайдеры и поставьте галочку Is Trigger:

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

using UnityEngine;

public class ButtonTrigger : MonoBehaviour
{
     public PlayerControl player;
     void OnTriggerEnter2D(Collider2D obj)
     {
           player.currHealth -= 5f;
           Destroy(gameObject);
     }
}

Так кнопка сначала отнимет здоровье игрока, а потом исчезнет. Еще можно добавить проверку, какой именно объект запустил триггер (объект будет передан в аргументе obj типа Collider 2D).

Дальше можно сделать то же самое и с аптечкой, но уже не отнимать здоровье, а прибавлять его. А чтобы персонаж при падении не летел в пропасть, можно добавить область, при попадании в которую объект будет перемещен в точку Respawn.

Заключение

Unity позволяет относительно быстро создавать крутые игры. Это в разы быстрее и эффективнее, чем писать всё с нуля, но при условии, что вы уже хорошо умеете пользоваться этим движком и знаете C# или JS.

Научиться всему этому можно на курсе «Разработчик игр с 0 до PRO». Вы освоите все необходимые инструменты, а в конце обучения у вас будет несколько проектов, которые не стыдно будет показать сообществу геймеров и создателей игр.

Курс

Разработчик игр с 0 до PRO


Unity — главный язык гейм-девелопмента. Изучив его основы, вы сможете дальше развиваться в игровой индустрии, а со временем даже устроиться на работу в студию мечты или стать инди-разработчиком. Это универсальный движок для создания игр для компьютеров, консолей и мобильных устройств, самый востребованный на рынке.

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox