Найти тему
A. S. Studios

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

Оглавление

Если вы не читали первую часть, то рекомендую сначала ознакомиться с ней: https://dzen.ru/a/ZkuhoHZFxBRkoMqx
Подписывайтесь на канал, ставьте лайки, пишите комментарии)))

Третья часть - добавление головы змеи

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

Спрайт для головы змеи
Спрайт для головы змеи

Создаём 2D Sprite, выбираем Circle:

-2

Вешаем на него следующие компоненты:
1) Circle Collider 2D (Ставим галочку Is Trigger)
2) Rigidbody2D (Этот компонент отвечает за перемещение объекта в пространстве с учётом физики - гравитации, обработки столкновения твёрдых объектов и т.д. Лучше использовать его, чем компонент Transform) 3) Создаём скрипт и называем его snake_movement_controller

В результате у вас должен быть вот такой список компонентов:

-3

Теперь открываем наш только что созданный скрипт и пишем следующее:

-4

Здесь мы описываем все нужные нам переменные. Сначала идут две переменных типа Vector3 (строки 7-8). Первая задаёт направление движения - три числа внутри скобок означают координаты x, y, z. Т.е. изначально у нас вектор движение равен единице по оси x. Вторая строка - это координаты спавна нового звена змейки (когда игрок съел яблоко).

Дальше идут две переменные типа int (строки 10-11). Первая - это длина змеи, вторая - номер позиции в змее (голова змеи имеет первую позицию, остальные имеют соответственно 2, 3 и т.д.)

Дальше мы создаём список, в котором будут наши звенья (строка 13).

В 15 строке переменная типа GameObject нам нужна для того, чтобы в инспекторе вставить туда префаб нашего звена цепи.

-5

Чтобы создать этот префаб, необходимо сделать следующее:

1) Создаём 2D Sprite Circle, как для головы змеи;

2) Перетаскиваем в наш проект со сцены этот спрайт (Тяните из иерархии вниз, к файлам проекта);

3) Вешайте на него следующей компоненты:

Snake_Body необходимо создать
Snake_Body необходимо создать

4) После того как вы сделали этот префаб, тащите его в скрипт из папки к полю Snake_Body

Теперь можно продолжать создание скрипта для головы змеи.

В 17 строке у нас булевая переменная, по которой мы отслеживаем, можно создать следующее звено или нет.

В 19 строке переменная типа Event_Manager, Event Manager - это тоже скрипт, создаём его и вешаем на камеру и больше пока ничего с ним не делаем.

Идём дальше:

-7

Функция Start в 21 строке - это метод, который вызывается перед первым обновлением кадра, но после подгрузки объекта (т.е. когда вызвался последний метод Awake, сразу за ним вызывается первый метод Sprite). В нём мы прописываем, что position равен длине змеи, уменьшенной на один. Т.е. при длине змеи один, позиция будет равна ноль. Это необходимо т.к. массивы и списки начинают нумерацию с нуля, а не с единицы. Второй строкой мы находим компонент Event_Manager (Который вы создали и повесили на камеру).

Затем идёт Update - данная функция вызывается при каждом обновлении кадра, и в неё мы прописываем с помощью if'ов смену вектора направления для каждой клавиши (W, A, S, D).

Проверка: если длина змеи больше количества звеньев в змейке, то добавляется новое звено
Проверка: если длина змеи больше количества звеньев в змейке, то добавляется новое звено

Определение Spawn_Position исходит из того, где находится последнее звено цепи. После того, как определили координаты спавна нового звена цепи, значение флага spawn меняет на true - это значит, что можно создать новое звено для змеи.

В FixedUpdate мы обрабатываем движение змеи
В FixedUpdate мы обрабатываем движение змеи

Для чего нужен FixedUpdate, если мы уже использовали Update? Дело в том, что FixedUpdate срабатывает после строго отведенного времени, в то время как Update работает при обновлении кадров, соответственно любой фриз, лагг или любое другое подтормаживание меняет частоту обновления, из-за чего Update срабатывает как ему угодно и движение получается не плавным, а хаотичным. Однако обработку нажатий лучше все же использовать в Update, так как попасть в вызов FixedUpdate может быть непросто)))

Итак, в строке в 57 строке мы двигаем нашу змею с помощью компонента Rigidbody2D. В 58 строке идёт проверка: если переменная spawn имеет значение true, то генерируется новое звено змеи (Snake_Body - префаб звена змеи, Spawn_Position - координаты спавна, Quaternion.identify - означает отсутствие поворота при создании). Соответственно после спавна мы сразу пишем что spawn равно false.

в 63 строке мы проверяем, если есть следующее звено после цепи, то мы получаем оттуда ссылку на скрипт Snake_Body и меняем значение переменной Can_move в нём на true.

-10

Здесь мы обрабатываем столкновение с собственным телом змеи. В 74 строке мы вызываем UnityEvent командой Invoke. У нас его ещё нет, поэтому откроем Event_Manager и создадим его:

-11

На этом создание головы змеи закончено.

Итоги

Пожалуй, я растяну данный мини-курс на три части, т.к. вторая уже получилась довольно объёмной. В следующей части мы точно разберём скрипт для звена змейки, постараюсь уместить в него скрипт для стены и Event_manager скрипт, так они маленького размера. Подписываемся, ставим лайки и пишем комментарии, жду вашего отклика))
До новых встреч и игр)))