Если вы не читали первую часть, то рекомендую сначала ознакомиться с ней: https://dzen.ru/a/ZkuhoHZFxBRkoMqx
Подписывайтесь на канал, ставьте лайки, пишите комментарии)))
Третья часть - добавление головы змеи
Итак, на данный момент у вас должна быть собранная сцена и добавленное на неё яблоко. Теперь пора добавить змею, которой мы будем управлять.
Создаём 2D Sprite, выбираем Circle:
Вешаем на него следующие компоненты:
1) Circle Collider 2D (Ставим галочку Is Trigger)
2) Rigidbody2D (Этот компонент отвечает за перемещение объекта в пространстве с учётом физики - гравитации, обработки столкновения твёрдых объектов и т.д. Лучше использовать его, чем компонент Transform) 3) Создаём скрипт и называем его snake_movement_controller
В результате у вас должен быть вот такой список компонентов:
Теперь открываем наш только что созданный скрипт и пишем следующее:
Здесь мы описываем все нужные нам переменные. Сначала идут две переменных типа Vector3 (строки 7-8). Первая задаёт направление движения - три числа внутри скобок означают координаты x, y, z. Т.е. изначально у нас вектор движение равен единице по оси x. Вторая строка - это координаты спавна нового звена змейки (когда игрок съел яблоко).
Дальше идут две переменные типа int (строки 10-11). Первая - это длина змеи, вторая - номер позиции в змее (голова змеи имеет первую позицию, остальные имеют соответственно 2, 3 и т.д.)
Дальше мы создаём список, в котором будут наши звенья (строка 13).
В 15 строке переменная типа GameObject нам нужна для того, чтобы в инспекторе вставить туда префаб нашего звена цепи.
Чтобы создать этот префаб, необходимо сделать следующее:
1) Создаём 2D Sprite Circle, как для головы змеи;
2) Перетаскиваем в наш проект со сцены этот спрайт (Тяните из иерархии вниз, к файлам проекта);
3) Вешайте на него следующей компоненты:
4) После того как вы сделали этот префаб, тащите его в скрипт из папки к полю Snake_Body
Теперь можно продолжать создание скрипта для головы змеи.
В 17 строке у нас булевая переменная, по которой мы отслеживаем, можно создать следующее звено или нет.
В 19 строке переменная типа Event_Manager, Event Manager - это тоже скрипт, создаём его и вешаем на камеру и больше пока ничего с ним не делаем.
Идём дальше:
Функция Start в 21 строке - это метод, который вызывается перед первым обновлением кадра, но после подгрузки объекта (т.е. когда вызвался последний метод Awake, сразу за ним вызывается первый метод Sprite). В нём мы прописываем, что position равен длине змеи, уменьшенной на один. Т.е. при длине змеи один, позиция будет равна ноль. Это необходимо т.к. массивы и списки начинают нумерацию с нуля, а не с единицы. Второй строкой мы находим компонент Event_Manager (Который вы создали и повесили на камеру).
Затем идёт Update - данная функция вызывается при каждом обновлении кадра, и в неё мы прописываем с помощью if'ов смену вектора направления для каждой клавиши (W, A, S, D).
Определение Spawn_Position исходит из того, где находится последнее звено цепи. После того, как определили координаты спавна нового звена цепи, значение флага spawn меняет на true - это значит, что можно создать новое звено для змеи.
Для чего нужен 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.
Здесь мы обрабатываем столкновение с собственным телом змеи. В 74 строке мы вызываем UnityEvent командой Invoke. У нас его ещё нет, поэтому откроем Event_Manager и создадим его:
На этом создание головы змеи закончено.
Итоги
Пожалуй, я растяну данный мини-курс на три части, т.к. вторая уже получилась довольно объёмной. В следующей части мы точно разберём скрипт для звена змейки, постараюсь уместить в него скрипт для стены и Event_manager скрипт, так они маленького размера. Подписываемся, ставим лайки и пишем комментарии, жду вашего отклика))
До новых встреч и игр)))