Найти в Дзене
A. S. Studios

Создание игры Змейка на Unity - Часть 1

Оглавление

Сама игра
Сама игра

Что ж, как и обещал, начинаю со змейки. Я не тратил время на визуал, сделал всё исключительно на стандартных примитивах Unity (2D Sprite). Использовал квадраты и кружки. В этой части мы создадим сцену и яблоко, а в следующей доделаем игру до конца.

Первая часть - Сборка сцены.

-2

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

-3

Итак, собираем сцену. Я ориентировался на размеры камеры (их можно изменить, но я оставил стандартные). Ставим четыре прямоугольника по краям (это будут наши стены), и вешаем на них коллайдеры.

Справа видно, что на стене есть компонент Box Collider 2D, ставим галочку is Trigger.
Справа видно, что на стене есть компонент Box Collider 2D, ставим галочку is Trigger.

Для чего Is Trigger? Дело в том, что я использовал здесь функцию OnTriggerEnter2D, а не OnCollisionEnter2D (Первая используется для столкновения с нематериальными коллизиями, которые как раз получаются если поставить галочку Is Trigger, а вторая нужна для материальных коллизий, хотя понятие материальные и нематериальные коллизии некорректно, зато понятно). Для чего? Использование материальных коллизий создавало проблемы, когда звенья змейки двигались не так, как нужно, например по-диагонали или вообще хаотично (столкновения двух твердых тел создаёт обратный импульс, за счет чего звенья змейки начинают беспорядочно двигаться во все стороны).

Задний фон - просто спрайт прямоугольника. К концу этого этапа вам нужно сделать четыре стены, повесить на каждый из них Box Collider 2D, поставить галочку Is Trigger и добавить задний фон. Итог выглядит примерно так:

Сцена из четырёх стен и заднего фона, без головы змеи и яблока.
Сцена из четырёх стен и заднего фона, без головы змеи и яблока.

Вторая часть - добавление головы и яблока.

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

Создаёте квадрат, или круг, или что вам больше хочется (треугольник не рекомендую, у него центр расположен не очень удобно, из-за чего могут возникнуть проблемы с его расположением на поле), перекрашиваем в красный цвет:

Нажимаем слева в Sprite Renderer на Color, и меняем цвет
Нажимаем слева в Sprite Renderer на Color, и меняем цвет

В открывшейся палитре выбираем нужный нам цвет
В открывшейся палитре выбираем нужный нам цвет

Затем, по аналогии со стенами из предыдущего этапа, добавляем Box Collider 2D (Если вы выбрали круг в качестве фигуры для яблока, то можете добавить Сircle Collider 2D. В рамках данной задачи это ни на что не повлияет, но в других проектах может быть необходимость использовать для каждой фигуры коллайдеры помимо Box Collider 2D). Что ж, яблоко почти готово, но стоит сделать еще несколько вещей.

Во-первых, создаём скрипт, называем его Apple. Делается это вот так:

Нажимаем справа на кнопку Add Component, в строке ввода пишем Apple, нажимаем на New script, затем создаём
Нажимаем справа на кнопку Add Component, в строке ввода пишем Apple, нажимаем на New script, затем создаём

После того как вы создали свой первый скрипт, открывайте его с помощью Visual Studio или любой другой IDE:

Скрипт для яблока с названием Apple
Скрипт для яблока с названием Apple

Итак, что здесь происходит. Сначала идёт блок подключения библиотек (Строки 1-3). Библиотеки содержат функции, типы данных, методы и т.д., в общем всё, что необходимо для работы вашего кода (представьте что вы хотите сварить суп, но вам нужен рецепт из книги, так и тут, чтобы использовать метод OnTriggerEnter, которого нет в C#, но который есть в Unity, мы подключаем библиотеку UnityEngine).
В строке 5 содержится инициализация нашего класса Apple, название которого совпадает с названием скрипта (назвали скрипт Apple, значит и класс внутри будет Apple). После него у нас стоит двоеточие и "MonoBehaviour". Двоеточие означает наследование, т.е. класс, который мы создали, наследуется от класса "MonoBehaviour". На практике это означает, что в интерфейсе Unity мы можем вешать такой скрипт как любой другой компонент, например наш любимый Box Collider 2D.

В строке 7 я создал переменную Head типа snake_movement_controller, на самом же деле это скрипт для управления головой змеи, на основе которого я создал переменную. В 10 я присвоил этой переменной результат поиска объектов с данным типом (это будет голова змеи, т.к. на сцене нет других объектов с этим скриптом).

В 12 строке я начал описывать метод OnTriggerEnter2D. Данный метод вызывается когда объект, на котором висит скрипт, сталкивается с коллайдером, на котором нажата галочка Is Trigger. Соответственно, все что вы напишите в теле данного метода, произойдёт в случае этого столкновения.
Итак, здесь у меня два условия: если объект сталкивается с объектом, у которого тег будет "Body" (тело), он изменит своё положение на поле (16 строка). Тег Body я использовал для звеньев змеи, т. е. получилось так, что яблоко появилось внутри змеи, она меняет свои координаты, чтобы его всегда было видно.
Второе условие это, как можно уже догадаться, столкновение с головой змеи. В этом случае яблоко тоже меняет свое положение (строка 21), однако при этом увеличивается длина змеи (строка 22). Здесь мы обращаемся к объекту Head, т.е. к скрипту головы змеи, находим внутри этого скрипта переменную Snake_Length, и увеличиваем ее на один (Два плюса это так называемая операция инкремента, и означает увеличение на один).

Итоги

Что ж, это была первая часть, в следующей мы доделаем игру полностью, добавив саму змейку. Когда вы напишите скрипты из этой части, у вас будут ошибки из-за того что вы еще не написали, например, скрипт snake_movement_controller (который используется в яблоке). Ничего страшного, пока не обращайте на это внимание, во второй части, когда вы добавите скрипт змеи, эта проблема исчезнет.
Архив и ссылку на GitHub прикреплю в конце следующей части, жду ваши пожелания в комментарии (вопросы, предложения насчет игры и т.д.), читаем статью до конца и учимся делать игры вместе с автором). Всем хорошего дня, до новый статей).

Вторая часть: https://dzen.ru/a/Zkx9vV5RNHvtUjVX