В этой главе мы разобрали следующие темы:
1. Что такое игровые механики и как они используются/создаются в играх.
2. Что такое мультиплеер и какие его режимы можно создавать.
3. Как проектировать систему боев и что при этом нужно учитывать.
4. Преимущества и недостатки мультиплеера в игре.
На заключительном практическом уроке мы создадим 2D-платформер на Unity. В ходе этой работы вы не только лучше познакомитесь с программой, но и сможете использовать созданное демо как основу своей будущей игры. Мы представим пошаговое руководство, описывающее настройку проекта и знакомящее с особенностями создания этого жанра игр.
Глава 8. Руководство по созданию 2D-платформера
В этой главе мы создадим на Unity основу для 2D-платформера, которую в дальнейшем вы сможете использовать для разработки своей первой игры. Для настройки проекта вам нужно будет проделать все то же самое, что мы уже делали ранее, настраивая проект 3D-игры от первого лица.
Настройка
Если вы этого еще не сделали, то вам потребуется скачать Unity Hub, где будут храниться все обновления, проекты и установки Unity. Скачать его можно с официального сайта.
После установки заведите бесплатный аккаунт Unity, который позволит создавать проекты. Через него вы также сможете синхронизировать любые проекты в случае авторизации на другой машине. После регистрации вы получите бесплатную лицензию, позволяющую создавать игры на ПК. Если же вы планируете заняться коммерческой разработкой, вам понадобится профессиональная лицензия, которую можно приобрести также через Unity. Завершив настройку, нажмите кнопку Install Editor и выберите предпочтительную версию Unity, как показано на рис. 8.1. Советую выбирать ту версию, которую рекомендует сама платформа Unity, так как она будет наиболее стабильной и актуальной.
Рис. 8.1. Unity Hub и версии Unity
Я использовал версию 2021.3.8f, но рекомендованная версия может оказаться иной. После выбора версии нужно указать модули, которые будет поддерживать Unity. Поскольку я работаю на Mac, то в этом уроке вы увидите, что я также выбрал установку Visual Studio. Вам это может не понадобиться, если этот инструмент у вас уже установлен. Если вы решите использовать другой редактор, снимите галочку с Visual Studio. Прокрутите список и выберите Mac Build Support или Windows Build Support, в зависимости от используемой операционной системы. Теперь вы готовы к установке!
После установки ПО вы сможете создать новый проект. Нажмите синюю кнопку New Project. Слева выберите Core. Далее выберите 2D и укажите имя проекта, например Platformer Test Build (рис. 8.2). По завершении нажмите Create Project и подождите, пока Unity откроется.
Рис. 8.2. Unity Hub и выбор шаблонов
Шаг 1
Начнем с создания простого спрайта (Sprite). Щелкните правой кнопкой мыши в окне Project и выберите Create—>Sprite—>Circle. Обязательно назовите свой спрайт «Player», чтобы установить необходимую организацию ассетов. Описанные действия показаны на рис. 8.3.
Перетащите спрайт Player в окно Hierarchy. В результате он будет помещен в Scene с координатами 0; 0; 0 и преобразуется в объект Player.
Шаг 2
Теперь выберите только что созданный объект Player и в окне Inspector нажмите Add Component. Найдите playerScript, выберите New Script и нажмите Create and Add. Так вы не только создадите скрипт в Project, но и автоматически добавите его в объект Player. Этот процесс показан на рис. 8.4.
Рис. 8.3. Создание объекта Circle в окне Asset
Дважды щелкните Script в Inspector, чтобы открыть скрипт в редакторе кода.
Рис. 8.4. Создание скрипта playerScript
Шаг 3
Начнем с реализации перемещения Player из стороны в сторону. Добавьте в редактор следующий скрипт:
public class playerScript: MonoBehaviour
{
public float speed;
void Start()
{
}
void Update
{
float h = Input.GetAxisRaw("Horizontal");
transform.Translate(new Vector3(h * speed *
Time.deltaTime, 0, 0));
}
}
Он позволит персонажу перемещаться по оси Х, то есть влево/вправо. Использование Time.deltaTime обеспечивает плавный переход. По окончании работы сохраните скрипт, чтобы Unity его скомпилировал. Это можно сделать нажатием Ctrl+S, Command+S либо через File—>Save. После возвращения в Unity перейдите в Inspector в правой части экрана и установите значение Speed на величину больше нуля. Теперь при запуске игры персонаж будет двигаться влево и вправо.
Шаг 4
Настроив передвижение персонажа, перейдем к созданию окружения, по которому он сможет перемещаться. Для этого создадим простую тайловую карту (Tilemap), по которой персонаж будет ходить и прыгать. Для начала, как показано на рис. 8.5, добавьте в сцену Tilemap.
Рис. 8.5. Выбор Tilemap в меню 2D Object
Рис. 8.6. Открытие Tile Palette из окна 2D
Затем откройте Tile Palette, как показано на рис. 8.6.
Нажмите Create New Palette, присвойте Palette имя «Environment» и нажмите Create. Сохраните ее в каталоге Assets проекта Unity, как показано на рис. 8.7 (по умолчанию откроется диспетчер файлов). Этот каталог будет появляться при сохранении Environment.
Рис. 8.7. Tile Palette и создание палитры Environment
Создайте новый квадрат и назовите его Ground, как показано на рис. 8.8. (Таким же способом мы создавали Circle, который сейчас является нашим персонажем.)
Рис. 8.8. Создание объекта Square в представлении Asset
Перетащите его в Tile Palette в окне (оно должно быть открыто после создания Environment) и сохраните файл в каталоге Assets под названием groundTile.
Выбрав инструмент Brush в окне Tile Palette (на рис. 8.9 эта кнопка третья слева), нажмите в этом же окне на белый квадрат и перетащите его в окно справа, повторяя этот процесс для создания платформ.
Рис. 8.9. Создание основания с помощью Tile Palette
Шаг 5
Последним шагом создадим возможность коллизии тайловой карты с персонажем. Выберите Tilemap в Hierarchy, как показано на рис. 8.10.
Рис. 8.10. Выбор объекта Tilemap в Hierarchy
Теперь добавим Tilemap Collider 2D в Inspector, как показано на рис. 8.11.
Рис. 8.11. Добавление компонента Tilemap Collider 2D в Inspector
Шаг 6
Добавим персонажу возможность прыгать. Для этого вернемся к playerScript и добавим следующий код, выделенный жирным:
public class playerScript: MonoBehaviour
{
public float speed, jumpForce;
public Rigidbody2D rb;
void Start()
{
rb = GetComponent();
}
void Update
{
float h = Input.GetAxisRaw(“Horizontal”);
transform.Translate(new Vector3(h * speed *
Time.deltaTime, 0, 0));
if (Input.GetButtonDown("Jump"))
{
rb.AddForce(new Vector2(0, jumpForce),
ForceMode2D.Impulse);
}
}
}
Чтобы было понятно, поясню:
rb
ссылается на RigidBody2D
, а AddForce
добавляет импульс в любом указанном направлении. Мы создаем Vector2
(координаты X и Y) только для этой инструкции с помощью new Vector 2
. Значение X мы оставляем равным 0 и применяем jumpForce к оси Y. Последний элемент – определение режима применения. Инструкция ForceMode2D
.Impulse обеспечит применение импульса в виде одного рывка в момент совершения прыжка.Теперь можно сохранить скрипт и вернуться в Unity. Далее добавим в наш объект RigidBody2D и Collider. Это можно сделать в Inspector, выбрав Player. Нажмите Add Component и найдите в списке компонентов RigidBody2D и Collider. После этого выберем для коллайдера подходящую форму. В нашем случае, поскольку роль персонажа у нас выполняет круг, нужно использовать CircleCollider.
Шаг 7
Следующим шагом создадим Ground Check, чтобы персонаж не проваливался сквозь землю. В ходе тестирования геймплея вы могли заметить, что персонаж может непрерывно подпрыгивать. Дело в том, что Unity не знает, может ли персонаж совершить очередной прыжок, то есть находится ли он на земле. Такая механика подошла бы для игр наподобие Flappy Bird, но, поскольку мы создаем платформер, нам нужны единичные прыжки.
Создадим Empty Game Object, который будет служить ориентиром при проверке, коснулся ли персонаж земли. Можно использовать и проверку коллизии, однако тогда персонаж сможет прыгать, отталкиваясь от стен или от потолка. Ground Check ограничивает персонажа и позволяет совершать прыжки только от земли. Как это сделать, показано на рис. 8.12.
Рис. 8.12. Создание пустого объекта в меню GameObject
Создав новый объект, присвойте ему имя «Ground Check» и сделайте его потомком объекта Player, перетащив Player поверх него в окне Hierarchy.
Шаг 8
Теперь поместим новый объект под Player в Scene, чтобы он пересекал поверхность всякий раз, когда персонаж оказывается на земле. Выберите объект Ground Check и нажмите W, чтобы применить инструмент Move. Перетащите объект под кружок персонажа. Используйте в качестве ориентира рис. 8.13.
Рис. 8.13. Размещение объекта Ground Check в Scene
Шаг 9
Теперь нужно внести в скрипт персонажа небольшие изменения, чтобы согласовать его с объектом Ground Check. Откройте
playerScript
и добавьте в него следующий код, выделенный жирным:public class playerScript: MonoBehaviour
{
public float speed, jumpForce;
public Rigidbody2D rb;
public Transform groundCheck;
bool grounded = false;
void Start()
{
rb = GetComponent();
}
void Update
{
float h = Input.GetAxisRaw(“Horizontal”);
grounded = Physics2D.Linecast(transform.position,
groundCheck.
position, 1 << LayerMask.NameToLayer("Ground"));
transform.Translate(new Vector3(h * speed * Time.deltaTime,
0, 0));
if (Input.GetButtonDown("Jump") && grounded)
{
rb.AddForce(new Vector2(0, jumpForce),
ForceMode2D.Impulse);
}
}
}
Переменной
grounded
будет присваиваться значение 1 или 0 (истина или ложь) на основе результата выполнения ее строки. Эта строка отрисовывает линию между персонажем (transform.position
) и объектом Ground Check (groundCheck.position
). Инструкция 1<
игнорирует все Layers, кроме Ground. Сам же слой Ground мы вскоре создадим.Шаг 10
Теперь добавим в тайловую карту слой, чтобы Ground Check работала с окружением. Выберите объект Tilemap в Hierarchy, а затем в верхней части Inspector щелкните выпадающее меню и выберите Add Layer. Такой же способ мы использовали в 3D-проекте FPS. Этот процесс показан на рис. 8.14.
В окошке User Layer 8 введите «Ground» (название слоя должно совпадать с указанным в строке
NameToLayer
в playerScript
, в нашем случае это Ground) (рис. 8.15).Рис. 8.14. Изменение типа Layer через Tilemap в Inspector
Рис. 8.15. Создание слоя Ground в Inspector
Снова выберите объект тайловой карты и присвойте ему созданный слой, как показано на рис. 8.16.
Рис. 8.16. Применение слоя Ground к Tilemap в Inspector
Шаг 11
Последним шагом присвоим playerScript объект Ground Check. Выберите объект Player и перетащите Ground Check из Hierarchy в поле Ground Check в Inspector.
Теперь вы сможете протестировать проект, в котором персонаж будет передвигаться влево/вправо и прыгать. Если вы захотите расширить проект, добавьте с помощью тайловой карты дополнительные платформы, чтобы персонаж перепрыгивал с одной на другую. Также можно добавить такие механики, как двойной прыжок или движение только в заданном направлении. Вы ограничены лишь своей фантазией!
Заключение