Как создать змейку в Unity?

Доброго дня дорогие друзья, сегодня мы продолжаем поддержку Народного aджема материалом и сегодня поговорим о том, как создать змейку.

Для тех, кто ещё не видел, напомним. На DTF сейчас проходит Народный Джем и наша школа программирования ЯЮниор учредила две номинации:

25 000 рублей за лучшую игру на Unity
25 000 рублей за лучший код на Unity

Подробнее про джем:

Напомним, что данная серия статей нацелена на совсем начинающих!

Создание окружения

Как создать змейку в Unity?

В процессе создания змейки нам потребуется графика, для этого мы возьмем бесплатный LowPoly пакет из Asset Store.

Начнем мы с построения уровня.
Для начала нужно создать саму землю, для этого нажимаем ПКМ по окну иерархии и выбираем 3D Object -> Plane, после выполнения этого действия у вас появится плоский объект, который будет играть роль земли.

Как создать змейку в Unity?

Но для земли он достаточно маленького размера, чтобы это исправить нам нужно обратить внимание на окно Inspector и в компоненте Transform задать Scale по X и Y значение 40.

Как создать змейку в Unity?

После этого земля стала нужного размера, но её вид оставляет желать лучшего, нужно придать ей зеленоватый цвет. Для этого в окне Project мы создаем в Asset папку Material, переходим в неё, нажимаем ПКМ и выбираем Create -> Material, после чего появляется новый материал, который мы называем Ground.

Как создать змейку в Unity?

После создания материала его следует настроить, для этого нажимаем ЛКМ на материал и в поле Albedo редактируем цвет на нужный.

Как создать змейку в Unity?

Далее нужно материал просто перетащить на наш Plane, после чего он станет зеленым.

Как создать змейку в Unity?

Теперь пора заняться окружением, чтобы не захламлять редактор давайте создадим пустой объект, который назовем environment, он будет хранить в себе окружающие объекты.

Первым делом сделаем загон для нашей змейки, для этого в environment создаем объект куб и устанавливаем координаты в 0, если это не так.

Как создать змейку в Unity?

Далее нажатием на куб в отмеченной части переходим в ортографический режим для упрощения редактирования.

Как создать змейку в Unity?

И теперь при помощи переключения между осями приводим сцену к следующему виду:

Как создать змейку в Unity?

Далее отдаляем камеру и устанавливаем Scale куба по X на 40
Важно! Проверьте, что куб в нулевых координатах.

Как создать змейку в Unity?

Далее с выделенной стенкой нажимаем комбинацию клавиш CTRL+D(Создание копии объекта) и с зажатой клавишой CTRL передвигаем новую стенку на 40 юнитов вверх, по оси Z (или можете просто установить значение в инспекторе).

Как создать змейку в Unity?

2 стены готовы, остались ещё 2.
Выделяем обе стены одновременно и снова нажимаем CTRL+D, далее выбираем инструмент для вращения и устанавливаем режим редактирования Center, чтобы поворачивать наши стены относительно центра.

Как создать змейку в Unity?

Далее зажимаем Ctrl, это позволит нам вращать наши стены на строго заданный угол. Теперь у нас готова коробка.

Как создать змейку в Unity?

После этого переходим обратно в перспективную проекцию(нажатием на куб в правом углу сцены) и перемещаем камеру так, чтобы картинка на превью вам понравилась.

Как создать змейку в Unity?

Остается дело за малым, украсить это всё. В начале статьи была дана ссылка на графический пакет, берем из него то окружение, которое нам нравится и расставляем по сцене, главное не забудьте, что все эти объекты должны быть дочерними к объекту environment.

У меня получилась следующая картина:

Как создать змейку в Unity?

Вроде бы можно на этом закончить настройку окружения, но нет. Сейчас у нас на сцене огромное количество объектов и это тяжеловато отрисовывать, давайте посмотрим на статистику.

Открываем отладчик кадров при помощи Window -> Analysis -> Frame Debugger и запускаем нашу игру. Что мы видим?
Мы видим, что на отрисовку у нас тратится 606 Draw call.

Как создать змейку в Unity?

Что такое Draw Call? Это обращение к видеокарте. Когда собирается вся информация о вершинах и отправляется видеокарте на отрисовку. Во время оптимизации мы всегда следим за этим параметром. 606 для такой игры это безумно много. Как же это исправить?

Тут мы можем применить технику статического бэтчинга, это когда Unity попытается собрать воедино все объекты и отрисовать их за меньшее количество обращений. Билд наш станет кушать чуть больше оперативки, ведь хранить все собранные воедино меши где-то надо, но зато мы сильно выиграем в плане количества вызовов отрисовки.

Как мы помним, мы собрали все эти объекты в пустой объект environment.
Теперь мы выделяем его и ставим галочку Static, после чего соглашаясь сделать все дочерние объекты статическими тоже.

Как создать змейку в Unity?

После этого снова запускаем игру и видим, что стало всего 40 Draw call, что гораздо меньше.

Как создать змейку в Unity?

Создание змейки

Создаем простой 3D объект куб, который будет играть роль змеи.
При желании можете создать новый материал для змеи и присвоить к ней.

Как создать змейку в Unity?

Как вообще строится змейка и как она двигается?

Змейка по сути своей состоит из головы и хвоста, который за ней тянется.
А её движение - это история её перемещения, т.е. с каждым ходом блоки смещаются вперед на позицию своего выше стоящего звена.

Создаем папку для скриптов и в ней скрипт Snake

Как создать змейку в Unity?

Давайте разберемся, как работает наш скрипт.В Update у нас вызываются методы для поворота и движения, начнем разбор с поворота.

Метод Rotate принимает в себя скорость поворота, а после считывает, нажата ли клавиша A или D, для которых свойственен поворот(это могут быть также стрелочки или другие клавиши, если вы изменяли настройки Axis), умножается на скорость и на время прошедшее с прошлого кадра.

Зачем это домножение? У каждого игрока количество кадров разное, у кого-то 100, у кого-то 200, у кого-то 30, а это значит, что у одного Update выполнится за секунду 30 раз, а у другого 200 и змейка сдвинется на разное расстояние, будет двигаться с разной скоростью(Такое можно заметить в Half-Life, когда спидраннеры изменяют FPS для разгонов)

Домножая на Time.deltaTime мы нормализуем скорость для всех, ведь это время прошедшее с прошлого вызова Update.

Движение головы не сложное, мы просто двигаем голову вперед с учетом скорости.

А вот движение хвоста интересное, его стоит разобрать подробнее.

Обратите внимание на проверку в строке 32. Если между текущей костью и следующей костью дистанция больше, чем дистанция которая должна быть между костьми, то тогда мы подтягивает хвосты поближе. Получается, что мы постоянно меняем их местами, двигая все ближе и ближе. Если же дистанции не достигли, то мы и для других костей не достигли и можно прервать обработку.

Также нам нужна еда. Для еды попрошу создать скрипт и удалить из него методы Start и Update, чтобы он оказался пустым. Еда не выполняет ничего, скрипт нам нужен только для того, чтобы мы могли определить, что столкнулись именно с едой.

Создадим еду, создайте куб на сцене, добавьте на него красный материал, компонент Food который создали. Также на нашем кубе еды есть компонент Box Collider, в нем есть поле Is Trigger, поставьте туда галочку, после чего разместите еду по всей карте.

Чтобы мы могли сталкиваться с едой, нам нужно немного модернизировать голову. На голове уже есть колайдер, но чтобы мы могли взаимодействовать с едой - триггером нам нужно иметь компонент RIgidbody на голове. После добавления Rigidbody снимите галочку с Use Gravity и поставьте галочку напротив Is Kinematic.

Далее возвращаемся в скрипт и дописываем код поедания.

Как создать змейку в Unity?

Мы проверяем, есть ли на объекте компонент еда и если есть, то создаем новый кусочек хвоста из префаба и добавляем его в список к хвосту.

В целом у нас получилось создать простейшую змейку, которая может ползать, собирать еду и разростаться.

Также можете посмотреть этот курс на нашей платформе в другом формате и с созданием менюшки, добавлением звуков!

7474 показа
9.8K9.8K открытий
22 репоста
3 комментария

Про static batching полезная инфа, не понимал раньше, как можно уменьшить количество draw calls

Ответить

Спасибо большое автору за данный пост!) 

Ответить