В статье рассматривается реализация ключевых элементов казуальной 2D-видеоигры в среде разработки Unity на примере игры, разработанной в рамках командного проекта. Это поможет начинающим разработчикам на Unity узнать ключевые элементы разработки игры и увидеть пример реализации.
Ключевые слова: 2D-видеоигра, Unity, геймдизайн, программирование, игровой движок.
Введение
В процессе разработки компьютерной игры, обязательно должны быть реализованы ключевые элементы, в числе которых создание концепта игры, подготовка графических ресурсов, написание скриптов ключевых игровых механик, описанных в концепте и, в конечном счете, сборка приложения в игровой среде Unity.
Концепт разрабатываемой видеоигры.
Перед разработкой видеоигры всегда описывается концепт этой игры. Это первый ключевой момент разработки видеоигр. На этом этапе описывается идея игры, а также основные игровые механики, элементы интерфейса, цели игрока [1].
В ходе этого этапа был разработан краткий концепт, определяющий основные положения и правила будущего развлекательного приложения, он представлен на рисунке 1.
Рис. 1. Краткий концепт приложения
На рисунке 1 изображен космонавт, который может двигаться вертикально вверх и вниз, также поворачиваться вокруг своей оси. С помощью такого управления он должен уклоняться от астероидов, которые двигаются справа налево. В левом верхнем углу интерфейса находится индикаторы здоровья и запаса воздуха. Воздух тратится на перемещение персонажа, а для его восполнения игрок должен ловить кислородные баллоны. В верхнем правом углу находится счетчик, показывающий время успешного нахождения космонавта в космосе. При запуске игры, в левом нижнем углу, появляется подсказка по управлению главным персонажем, которая исчезает спустя некоторое время после начала игры. Основная задача игры заключается в необходимости игрока продержаться, как можно дольше, не сталкиваясь с астероидами.
В процессе производства концепт может редактироваться и дополняться, однако для достижения эффективного результата необходимо четко определить основные правила игрового процесса и стараться их придерживаться.
Графические элементы видеоигры.
В соответствии с определенным концептом художником были созданы элементы графического интерфейса, такие как шкала количества жизней, шкала запаса воздуха, они представлены на рисунке 2. Следующим этапом были созданы спрайты объектов игровой сцены: игровой персонаж, астероиды, баллон с воздухом, они отображены на рисунке 3.
Рис. 2. Элементы интерфейса: а) шкала количества жизней б) шкала запаса воздуха
Рис. 3. Спрайты объектов игровой сцены: а) игровой персонаж б) астероиды в) баллон с воздухом
Скрипты управления главным персонажем и генерации астероидов
Для создания логики поведения игровых объектов, а также обработки пользовательского ввода, в среде разработки Unity используются скрипты, т. е. компоненты, написанные с помощью языка программирования. Unity поддерживает такие языки как Java и C#, при этом именно C# принято считать основным языком написания скриптов [2]. Обзор языка C# и его функциональных возможностей является предметом отдельной темы, поэтому в рамках данной статьи мы не будем затрагивать его описание.
При рассмотрении разработанного концепта создаваемой видеоигры становится видно, что в основе игрового процесса лежит управление перемещением главного персонажа в космическом пространстве с целью предотвращения его столкновения с летящими навстречу астероидами. Исходя из этого можно сделать вывод, что ключевыми элементами являются скрипт, отвечающий за обработку передвижения главного персонажа с помощью устройства ввода (клавиатуры), а также скрипт, отвечающий за логику поведения астероидов [2].
В первую очередь был написан скрипт передвижения главного персонажа. В нем объявлены переменные с булевым типом данных для дальнейшего использования в качестве флага для отслеживания ввода пользователем с целью управления главным персонажем в горизонтальном и вертикальном направлениях:
[SerializeField] bool upEngine;
[SerializeField] bool downEngine;
[SerializeField] bool leftEngine;
[SerializeField] bool rightEngine;
В методе KeyboardInput() прописаны изменения значения этих переменных в зависимости от ввода пользователем:
if (Input.GetKey(KeyCode.W)) upEngine = true;
else upEngine = false;
if (Input.GetKey(KeyCode.S)) downEngine = true;
else downEngine = false;
if (Input.GetKey(KeyCode.A)) leftEngine = true;
else leftEngine = false;
if (Input.GetKey(KeyCode.D)) rightEngine = true;
else rightEngine = false;
Беря во внимание, что действие происходит в космическом пространстве, необходимо корректно реализовать логику перемещения после пользовательского ввода для того, чтобы добиться правдоподобного игрового процесса. Основной движущей силой управляемого персонажа является выпуск воздуха под давлением из специальных устройств, расположенных на скафандре персонажа. В простом понимании силами сопротивления в космосе можно пренебречь, а потому движение персонажа, возникшее в результате передаваемого от выпуска воздуха импульса, будет равномерным и прямолинейным. Так же нужно иметь в виду, что после возникшего движения с помощью первого устройства, в случае включения размещенного вдоль оси второго устройства, персонаж сперва будет замедляться до полной остановки и только потом возникнет движение в обратном направлении [3].
В соответствии с этим были определены методы EnginesLogic() и MovementLogic(), отвечающие за логику подобного перемещения в горизонтальном и вертикальном направлениях:
void EnginesLogic()
{
if (upEngine)
{
if (currentVerticalPower > -.5f) currentVerticalPower -= powerStep;
}
if (downEngine)
{
if (currentVerticalPower < .5f) currentVerticalPower += powerStep;
}
if (leftEngine)
{
if (currentHorizontalPower > -.5f) currentHorizontalPower -= powerStep;
}
if (rightEngine)
{
if (currentHorizontalPower < .5f) currentHorizontalPower += powerStep;
}
}
void MovementLogic()
{
transform.position = Vector2.MoveTowards(transform.position, moveDirectionTarget.position, speed * currentVerticalPower);
transform.Rotate(0f, 0f, rotationSpeed * currentHorizontalPower);
}
После была определена логика поведения опасных для главного персонажа объектов игровой сцены. Для их генерации используется корутина, которая возвращает фактический объект, используемый для итераций и называемый IEnumerator, с использованием ключевого слова yield [4]. Корутину мы прописываем в классе-родителе (т. к. она может использоваться и для генерации других объектов, например, предмета восстановления запаса кислорода) и определяем основные моменты, связанные с генерацией, такие как время, через которое должен быть сгенерирован объект, начальное положение объекта при генерации, его скорость:
protected IEnumerator SpawnCD(int timeSpawn, float Xposition, float Yposition, GameObject gameObject, bool speedChange)
{
yield return new WaitForSeconds(timeSpawn);
Vector2 pos = new Vector2(Xposition, Yposition);
if (speedChange)
{
gameObject.GetComponent
}
else
{
gameObject.GetComponent
}
Instantiate(gameObject, pos, Quaternion.identity);
Repeat();
}
Данная конструкция вызывается с помощью метода StartCoroutine() в классе-наследнике с передачей необходимых параметров:
void Start()
{
StartCoroutine(SpawnCD(4, transform.position.x, spawnPosition.position.y, asteroid, false));
}
public override void Repeat()
{
StartCoroutine(SpawnCD(4, transform.position.x, spawnPosition.position.y, asteroid, false));
}
Итоговый результат процесса разработки видеоигры
После завершения ключевых элементов разработки видеоигры мы начинаем процесс сборки игры в игровой среде Unity. Результат работы после сборки игры в среде разработки Unity можно увидеть на рисунках 4 и 5.
Рис. 4. Начало игры
Рис. 5. Игровой процесс
Литература:
- Бонд Д. Г. Unity и C#. Геймдев от идеи до реализации. / Д. Г. Бонд. — 2-е издание. — Санкт-Петербург: Питер, 2019. — 928 c.
- Хокинг Дж. Unity в действии. / Дж. Хокинг. — 2-е издание. — Санкт-Петербург: Питер, 2018. — 352 c.
- Ландау Л. Д. Теоретическая физика. В 10 томах. Том 1. Механика. / Л. Д. Ландау, Е. М. Лифшиц. — 7-е издание. — Москва: ФИЗМАТЛИТ, 2017. — 224 c.
- Unity User Manual // Unity Documentation: [сайт]. — URL: https://docs.unity3d.com/Manual/index.html (дата обращения 18.05.2021).