Что ж, как и обещал, начинаю со змейки. Я не тратил время на визуал, сделал всё исключительно на стандартных примитивах Unity (2D Sprite). Использовал квадраты и кружки. В этой части мы создадим сцену и яблоко, а в следующей доделаем игру до конца.
Первая часть - Сборка сцены.
Это самый простой этап, но не менее важный, не только ведь код писать. Для создания сцены, как и говорилось выше, я использовал спрайты прямоугольников и кружков.
Итак, собираем сцену. Я ориентировался на размеры камеры (их можно изменить, но я оставил стандартные). Ставим четыре прямоугольника по краям (это будут наши стены), и вешаем на них коллайдеры.
Для чего Is Trigger? Дело в том, что я использовал здесь функцию OnTriggerEnter2D, а не OnCollisionEnter2D (Первая используется для столкновения с нематериальными коллизиями, которые как раз получаются если поставить галочку Is Trigger, а вторая нужна для материальных коллизий, хотя понятие материальные и нематериальные коллизии некорректно, зато понятно). Для чего? Использование материальных коллизий создавало проблемы, когда звенья змейки двигались не так, как нужно, например по-диагонали или вообще хаотично (столкновения двух твердых тел создаёт обратный импульс, за счет чего звенья змейки начинают беспорядочно двигаться во все стороны).
Задний фон - просто спрайт прямоугольника. К концу этого этапа вам нужно сделать четыре стены, повесить на каждый из них Box Collider 2D, поставить галочку Is Trigger и добавить задний фон. Итог выглядит примерно так:
Вторая часть - добавление головы и яблока.
После того, как вы собрали сцену для игры, настало время добавить начало змею и яблоко. Начнём, пожалуй, с яблока.
Создаёте квадрат, или круг, или что вам больше хочется (треугольник не рекомендую, у него центр расположен не очень удобно, из-за чего могут возникнуть проблемы с его расположением на поле), перекрашиваем в красный цвет:
Затем, по аналогии со стенами из предыдущего этапа, добавляем Box Collider 2D (Если вы выбрали круг в качестве фигуры для яблока, то можете добавить Сircle Collider 2D. В рамках данной задачи это ни на что не повлияет, но в других проектах может быть необходимость использовать для каждой фигуры коллайдеры помимо Box Collider 2D). Что ж, яблоко почти готово, но стоит сделать еще несколько вещей.
Во-первых, создаём скрипт, называем его Apple. Делается это вот так:
После того как вы создали свой первый скрипт, открывайте его с помощью Visual Studio или любой другой IDE:
Итак, что здесь происходит. Сначала идёт блок подключения библиотек (Строки 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