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

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

С помощью Unity сделаны такие игры, как:

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

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

  1. Создаем проект в Unity.
  2. Добавляем первый объект.
  3. Пишем скрипт.
  4. Назначаем триггер.

Почему Unity

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

Как именно пользоваться движком Unity и создавать крутые проекты, — мы учим на курсе «Разработчик игр с 0 до PRO».

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

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


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

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

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

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

Итак:

  1. Запустите установщик и следуйте инструкциям.
    Кроме самого движка, вам предложат установить Microsoft Visual Studio — интегрированную среду разработки. Это лучшие возможности по работе со скриптами в Unity, но она занимает много места на диске.
  2. Если Microsoft Visual Studio установлена или используется другой редактор кода, уберите галочку. Альтернативами могут быть Microsoft Visual Studio Code (более лёгкая версия Visual Studio) или MonoDevelop — встроенный редактор Unity.
  3. Когда установка завершится, пора приступать к разработке своей первой игры.

Как создать проект в 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

1. Перетащите ассет из поля Assets внизу экрана.

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

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

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

2. Скопируйте несколько картинок игровых объектов

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

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

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

3. Чтобы подогнать края под размер спрайта, нажмите Edit Collider.

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

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

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

5. Теперь приступаем к настройкам

Например, поставить галочку возле Freeze Rotation, чтобы запретить объекту вращаться. У нас шар, поэтому замораживать вращение не нужно. В поле Interpolate укажите Interpolate — это сделает движение объекта более плавным.

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

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

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

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

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

6. Теперь нажимаем Play над сценой и смотрим, как объект падает.

Чтобы он не летел в пустоту, поставьте под ним платформу.

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

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

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

8. Теперь сохраняем платформу как заготовку

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

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

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

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

1. Начать создание скриптов можно с класса для управления персонажем

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

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

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

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

public class NewBehaviourScript : MonoBehaviour {

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

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

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

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

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

rb = GetComponent<Rigidbody2D>();

5. Теперь в 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.

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

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

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

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:

7. Чтобы передать скрипту объект игрока (в нашем примере это круг), в настройках компонента указывается значение для поля 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

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

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

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

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

2. Чтобы обработать событие срабатывания триггера, используйте скрипт:

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