Вся ниже представленная информация есть в Телеграмм и доступна всем по ссылке t.me/ded63russtudio
В ближайшее время данный канал в Дзене поддерживаться не будет!
Настоятельно рекомендуем воспользоваться указанной ссылкой...
Пришло время заставить все статичное стать динамичным.
Начнем с движения дороги.
Для этого выделим дорогу и сделаем два дубля. Дубликаты расположим один сверху, другой снизу элемента road_0
При перетаскивании новых элементов дороги очень важно их расположение по оси Х - все три элемента должны иметь одинаковое значение!
Пишем скрипт бесконечного движения фона, в нашем случае - дороги.
Заходим в папку Scripts. Жмем правую кнопку мышки и выбираем Create / C# Script
Даем уникальное название, у меня RunRoad и надо иметь ввиду, что впоследствии менять название не рекомендуется, Юнити выдаст ошибку.
Открываем скрипт любым удобным вам приложением.
Цель данного скрипта заставить двигаться фрагмент дороги вниз с определенной скоростью
Созданный скрипт надо повесить на элемент road_0. В Инспекторе появляется скрипт с одним полем для заполнения. Поставим пока 1.
В дополнении этому элементу road_0 надо добавить еще два элемента: Box Collider2D (в строке is Trigger ставим галочку) и Rigidbody2D ( в строке Gravity Scale ставим 0).
Пробуем запустить игру и убедиться, что дорога поехала несколько медленно, но для того и нужна переменная скорости, чтобы ее менять... потом менять, когда надо будет..
Однако дорога едет бесконечно и далеко. Нам это не надо. Нам надо, чтобы дойдя до определенной точки дорога была уничтожена.
Для этого напишем новый скрипт.
Назовем его RoadOut.
Малое отступление. Всего скриптов для дороги будет 3. И если мы создадим для этих трех скриптов отдельную папку, будет хорошо. Делаем папку Roads в папке Scripts и переносим туда два скрипта про дорогу.
Теперь создаем объект на который повесим созданный скрипт.
В папке BackGround создаем 2D объект Square и называем его ControlRoad. Затем перетаскиваем его на нижe элемента road_0(2)
Меняем размер, позицию и добавляем Box Collider2D.
Вот на этот объект и вешаем созданный скрипт.
Для полноценной работы скрипта не хватает одной малости...
В элементе road_0 в самом верху есть поле Tag, где пока значится Untagged. Нажимаем туда, выпадаем меню с тэгами, но нужного тут нет. Жмем Add Tag
Нажимаем + в поле List is Emply, пишем Road и жмем Save. Тэг готов.
Теперь, если выделить элемент road_0 и открыть поле Tag, в нем обнаружиться Road. Вот его и выбираем
Теперь для наглядности удалим уже ненужный нам элемент road_0(2) и запустим игру.
Работает.
Теперь надо создать дорогу сверху.
Для этого напишем еще один скрипт. Создаем в папке Roads скрипт и называем его RoadSpawn
Теперь нам нужна точка на экране, в которой будет появляться дорога. Мы не зря сделали три элемента дороги - верхняя часть элемента poad_0(1) и есть та самая точка спавна.
Элемент road_0 переносим в папку Prefabs.
Создаем пустой объект с названием SpawnRoad, естественно в папке BackGround. На это объект вешаем последний скрипт. В инспекторе в скрипте ставим Spawn Delay пока 5,2 и в строку Road перетаскиваем префаб road_0. Запускаем и смотрим...
Дорога пошла в бесконечность и, главное, вовремя удаляется и не нагружает игру.
Пришло время озаботиться Игроком.
Игрок у нас будет иметь возможность двигаться влево и вправо до определенных границ. Следует отметить, что если мы будем использовать машину Игрока и тачить ее пальцем, рука закроет часть экрана смартфона, что крайне неудобно!
Поэтому сначала создадим тач-скрин.
Создаем пустую папку, называем ее в TachZon и выставляем в позициях Х=0, Y=-5.
Далее в этой папке создаем 2DObject / Sprites / Square. Ставим ему Order in Layer 2, выравниваем полученный пока безымянный элемент в размер дороги (у меня 4,6 ), даем ему ширину (у меня 0,1) и цвет (у меня синий) по своему желанию
Задаем название, например SizeLine - размер линии... дальше этой линии машина Игрока пройти не должна.
Затем тут же создаем еще один элемент 3D Object / Cube. Именно 3D!!!
Даем ему имя Tach, выравниваем по середине SizeLine, и делаем такой же размер
Следуем провести проверку созданного куба по оси Z. Юнити может поставить произвольно, где попало... А, нам надо в определенной зоне.
Для этого в панели Scene жмем кнопку 2D - сцена переходит в 3D режим. Дважды кликаем на элемент Tach, вращаем картинку как удобно и, главное, убеждаемся, что Tach находится в такой позиции
Если все ровно, возвращаем режим 2D, если нет - перетащите Tach в искомую позицию и вернитесь в режим 2D.
Дальше... из элемента Tach удаляем Mesh Filter и Mesh Renderer, они нам не нужны...
Для удаления элемента в Инспекторе жмем
Дальше пишем скрипт управления машиной Игрока.
В папке Scripts создаем новый скрипт и называем его PlayerMoov
Скрипт вешаем на элемент Tach. Смотрим в Инспектор, назначаем Игрока в нужной строке.
Теперь определяем крайние позиции по сторонам.
Для этого передвинем машину Игрока влево
Видим, что в Инспекторе строка
Position X = -2. Стало быть это позиция слева, ну а справа соответственно будет 2.
Выставляем эти данные в скрипте элемента Tach, скорость поставим 5 для начала.
Машину игрока ставим на место - по середине. Запускаем игру и смотрим...
Вполне себе машинка подчиняется, но как-то медленно, право слово! Скорость увеличим до 10. Проверяем...
Сразу стало лучше. Эту способность - менять скорость машины можно вполне использовать для усложнения игровых уровней.
Итак!
Дорога движется, Игрок тоже движется, остается добавить противников.
Начнем со встречной полосы.
Для этого создадим скрипт EnemyLeft в папке Scripts
Нужны две точки спавна - слева и справа от встречной полосы движения.
Создаем пустой объект и назовем его Enemy, обнуляем позиции по всем координатам.
В созданном Enemy пустой объект LeftRoad и в нем создаем пустые объекты LeftSpawn и RightSpawn. Разница только в положении по оси Х.
Скрипт EnemyLeft вешаем на элемент LeftSpawn, выделяем его и в Инспекторе. Сразу в поле Rotation по оси Z ставим -90, иначе машинки будут двигаться боком. Далее надо добавить правую позицию спавна RightSpawn, установить время появления машин SpawnDelay и
самое интересное... Car!
С правой точкой все просто - перетаскиваем туда RightSpawn.
Время появления - кому как нравится, я поставлю 3. Чем больше число, тем реже будут спавниться машинки!
Теперь нам надо вспомнить - сколько мы назначили машин противников? Для этого надо зайти в папку Prefabs и посмотреть. Есть 4. Давайте и поставим 2 противника и для этого в скрипте в поле Car поставим 2 и вот, что видим
Вот и занесите в эти поля те машинки, которые вам нравятся...
Далее запускаем и проверяем.
Машинки появляются, но стоят на точках спавна. Да оно и понятно - у них нет скрипта на движение!!! Беда, но не совсем.
Мы вполне можем использовать уже готовый скрипт дороги, чуть изменив в нем скорость движения элемента.
Но! для порядке создадим новый скрипт и назовем его EnemyRun. Скопируем туда данные скрипта RunRoad, сменим пояснения и получим
Сделанный скрипт надо повесить на все префабы машин противников и поставить им разную скорость движения, но выше, чем скорость движение дороги. Ну и компонент Rigidbody2D тоже надо добавить!
Запускаем, смотрим...
В целом уже неплохо. Мы рулим, машинки встречные гонят на разных скоростях... но как-то скучновато.
Добавим машинки попутные. Сначала, которые будут ехать медленнее нас.
Для этого пишем срипт EnemyRightUp. В целом это копия скрипта EnemyLeft, однако как показывает практика, если использовать один и тоже скрипт в разных местах - придет время и заблудишься...
Это уже третий скрипт для противников. Поэтому в папке Scripts создаем папку Enemy и перетаскиваем туда все скрипты, связанные с противником.
Далее в Иерархии дублируем папку LeftRoad, присваиваем ей имя RightRoadUp.
Раскрываем ее и перетаскиваем ее обе позиции спавна на правую полосу нашей дороги.
Даем уникальные имена LeftSpawn = LeftSpawnUp и догадайтесь про RightSpawn...
Количество машин поставим все.
А вот машинки стоит поменять на другие. Поясню - зачем. В левом спавне у каждой машинки стоит своя скорость, которая явно выше скорости дороги. Здесь нужна скорость ниже скорости дороги - потому и другой комплект машин. И кстати не забудьте поменять скорость у самих машин в скрипте самой машинки.
Запускаем, проверяем...
Все ровно за исключением, что машинки, ушедшие из поля не уничтожаются.
Исправим: открываем скрипт RoadOut и дописываем в него еще один блок If, заменив в нем Tag Road на Car
Теперь машинки дойдя до линии ControlRoad будут уничтожаться.
Теперь озаботимся столкновениями между транспортными средствами. В частности между противниками и игроком.
Из человеколюбия предлагаю дать игроку не одну попытку, а несколько.
Для этой цели пишем очередной скрипт и назовет его EnemyBax
Для понимания столкновения добавим звук столкновения. И еще звук проигрыша.
Есть еще добавка - переменная timer, она будет нужна для остановки таймера при завершении игры.
Ищем в интернете подходящий короткие звуки, качаем и переносим в папку Audio, которую надо создать в Assets.
Вешаем скрипт на Игрока и заполняем поля скрипта нужными элементами. Игроку надо добавить компонент AudioSourse.
Всем машинкам противника ставим Tag "Car". В качестве картинки OutScrin используем элемент Канваса GameOver. Для начала в поле Bax скрипта поставим 1.
Запускаем игру и смотрим.
Теперь в поле Bax поставим 3.
Все работает!
Пришло время подключить таймер.
Для этого пишем новый скрипт и называем его ClockGame
В Канвасе создаем пустой объект и называем его Manager. Туда закидываем скрипт ClockGame.
Заносим переменные в скрипт: секунды и минуты лежат в папке PanelUp, все остальное чисто информация и прибудет сама по себе.
Запускаем и смотрим на таймер... Работает ровно и останавливается правильно.
В Части 1 https://dzen.ru/a/ZC72XqomHCK7maPA были рассмотрены Запуск и Канвас проекта.
В Части 2 https://dzen.ru/a/ZDBiSIkRGhr2Rxad были рассмотрены Игровые Элементы проекта.
В Части 4 https://dzen.ru/a/ZD1BcyQa9FnoRR-i рассмотрим улучшения игры...
P.S. Читатель! Если не затруднит, напишите в комментарии мнение об изложении материала. Заранее благодарен!