Как сделать бесконечный уровень в unity

от admin

Процедурная генерация бесконечного уровня 2D

Приветствую начинающих разработчиков! Довольно часто для формирования уровня необходимо прибегать к её автоматической генерации для сокращения времени разработки игры. И реализовывать процедурную генерацию мы будем на примере 2д проекта.

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

Подготовительная часть

Предлагаю первым делом подготовить наш проект для работы, а потом разберёмся, что и для чего мы создали. Выполним 3 простых действия:

  • С поомщью окна Hierarchy создадим объект 2д, который будет являться нашим игровым персонажем. Назовём его Player. С помощью окна Inspector добавим ему 2 компонента: Rigidbody 2D и Circle Collider 2D. Ну и добавим данному объекту тег Player.
  • Создадим ещё один 2д объект, который будет являться задним фоном(баграундом) в нашей игре. Назовём его Background. Размер баграунда должен полностью покрывать размер камеры, и даже немного выходить за её пределы.
  • Внутри объекта Background, создадим 2д объект, с названием Point. Растянем его на 100% ширины экрана. Для удобства понимания, я этот объект перекрасил в зелёный цвет.(см. рисунок ниже).

В итоге на игровой сцене должно получится примерно так.

А в окне Hierarchy так.

Смысл следующий: как только персонаж пересечёт зелёный объект, то сверху должен создаться ещё один баграунд с такой же зелёной линией по центру, который в свою очередь после её пересечения создаст следующий баграунд. И так до бесконечности. Конечно же, вместе с баграундами будут создаваться и другие объекты, но об этом позже.

Поскольку нам понадобиться бесконечно создавать баграунд, то сделайте из объекта Background префаб. А чтобы наша бесконечная сцена не состояла только из одних баграундов, давайте создадим ещё один какой-нибудь префаб из 2д объекта — у меня это летающая тарелка, назовём данный префаб Enemy. По желанию, можете добавить к нему различных компонентов (необязательно).

В итоге у нас получилось 2 префаба с именами Background и Enemy.

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

Работа со скриптами

Подготовительная работа завершена, и чтобы всё созданное выше работало, нам необходимо написать два небольших скрипта: первый скрипт будет создавать продолжение нашего уровня из префабов Background и Enemy; а второй скрипт будет вызывать первый скрипт в те моменты, когда персонаж пересечёт зелёную линию.

Для начала создадим c# скрипт, который будет создавать новые объекты Background и Enemy на сцене. Назовём данный скрипт BackgroundCreate. Заранее присвойте его любому объекту, например вашей главной камере. Впишем в него следующий код:

В строках #5-8 мы создали 2 переменные, в которых будут храниться ссылки на префабы Background и Enemy. Поэтому заранее предлагаю в окне Inspector перетащить в данные поля эти префабы.

В строках #8-11 мы указываем минимальные и максимальные координаты по осям X и Y, для создания объекта летающей тарелки(Enemy). Это делается для того, чтобы наши летающие тарелки создавались в случайных местах.

Мы так же создали метод CreateBackground(), который с помощью метода Instantiate() создаёт объекты Background и Enemy на +19.2f выше, от расположения предыдущего баграунда. Обратите внимание, что высота моего баграунда составляет 1920 пикселей, и чтобы правильно рассчитать, какое значение необходимо прибавить, мы должны 1920 делить на 100, и получаем 19.2. Например, если высота вашего баграунда составляет 1080 пикселей, то необходимо прибавить 10.8f для двух создаваемых объектов.

Хочу обратить ваше внимание, что именно в методе CreateBackground() вы формируете сам уровень. То-есть именно здесь вы определяете, какие, где и сколько объектов должно быть созданы. В качестве примера у меня создаётся один баграунд, и от 1 до 5 летающих тарелок. Но вы можете сделать генерацию под свой вкус.

Теперь необходимо создать скрипт, который будет этот метод вызывать. Создадим c# скрипт с названием Pointer, и заранее присвойте его объекту Point, который находиться внутри ПРЕФАБА Background (это важно). Впишите в него следующий код:

Здесь мы получаем ссылку на наш скрипт backgroundCreate, который мы создавали ранее, и который присвоен нашей камере. А с помощью метода OnTriggerEnter2D() проверяем, вошёл ли како-либо объект в область данного объекта. И если данный объект имеет тег Player, то запускаем метод CreateBackground(). А так же удаляем данный объект(зелёную горизонтальную линию), во избежании возможных проблем.

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

На основе данной процедурной генерации, можно очень быстро и легко создать такую игру как Flappy Bird. Рекомендую так же ознакомится с новым гайдом о том, как создать игру Flappy Bird на юнити, которая на 90-95% создана на основе процедурной генерации уровня. Думаю ознакомление с данным гайдом будет очень полезным.

Ну а на этом всё. Если остались какие-либо вопросы, задавайте их в комментариях.

Бесконечный раннер [платформер]

Сразу сделаем небольшое примечание, что здесь представлена не игра, а способ, как зациклить беговую дорожку, то есть карту. Суть процесса заключается в том, что у нас есть три условных блока, по факту обычные точки, которые расположены на расстоянии, по размерам шаблона. По центру, слева и справа. И именно это точки мы будем сдвигать в одну из сторон. Как только крайняя, допустим левая точка, переходит минимальную допустимую позицию, она перемещается перед двумя другими, затем это же повторит и точка, которая шла впереди левой, тобишь центральная, и так далее. Сама карта, это набор шаблонов, ее частей, всё что нужно, в рандомном порядке добавлять шаблоны в блоке, которые мы сдвигаем. Получается, что камера стоит на месте, движется сама платформа. И вместо того чтобы постоянно использовать функцию создания и уничтожения объектов, в данном случаи части карты, мы создаем всё сразу на старте, а затем активируем/деактивируем нужные блоки, когда это потребуется.

Для начала, нужно определиться, какого размера делать секции для карты. Чтобы решить этот вопрос, добавляем обычный куб на сцену и растягиваем его по оси Х, до тех пор, чтобы его края выходили немного за границы экрана.

Точки располагаем следующим образом. Всё зависит от значения которые получилось при растягивании куба, то есть если масштаб по оси Х равен 10, значит позиция левой точки по Х равна -10, для центральной = 0, и соответственно 10 для правой.

Шаблоны секций по размерам создаем, ориентируясь на наш куб.

Теперь, цепляем куда-нибудь скрипт:

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

Бесконечный раннер [платформер]

С начало лева, потом центральная, затем правая. Это важно для запуска процесса.

Игра в стиле Jetpack Joyride в Unity 2D. Часть 3

В этой части вы научитесь перемещать мышь вперед через случайно сгенерированную комнату, имитирующую бесконечный уровень. Загрузите проект для этой части урока отсюда: RocketMouse_Final_Part1, после чего распакуйте и откройте сцену RocketMouse.unity.

rocket_mouse_unity_p2_0

Учим мышь летать вперед

Пришло время двигаться вперед, в буквальном смысле этого слова). Для того, чтобы мышь полетела в другой конец комнаты, вам нужно будет сделать две вещи:

  • Сделать чтобы мышь и в самом деле двигалась.
  • Заставить камеру двигаться вслед за мышью.

Для решения этих задач потребуется совсем немного кода. Начнем. Откройте скрипт MouseController и добавьте после публичной переменной:

Эта переменная будет определять насколько быстро наша мышь движется вперед.

Повторюсь, объявив публичную переменную, вы тем самым даете себе возможность изменять ее значение в Unity, не открывая скрипт в MonoDevelop.

rocket_mouse_unity_p2_26

После этого добавьте следующий код в конце FixedUpdate :

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

Запустите сцену. Мышь движется вперед, но возникает проблема: в какой-то момент просто мышь покидает экран.

Мышь улетает за пределы экрана

Чтобы исправить этот баг, вам нужно сделать чтобы камера следовала за мышью.

Создайте новый C# Script по имени CameraFollow. Перетащите его над Main Camera в Иерархию, чтобы добавить в качестве компонента. Откройте скрипт CameraFollow в MonoDevelop и добавьте следующий публичную переменную:

You will assign it to the mouse GameObject in a moment, so that the camera knows which object to follow. Добавьте следующий код в Update :

Этот код просто берет координату Х целевого объекта и перемещает камеру на это место.

Вы изменили только х-координату камеры, так как нам не нужно, чтобы камера двигалась вверх или вниз вслед движению мыши.

Переключитесь из MonoDevelop в Unity и выберите Main Camera в Иерархии. Существует новое свойство в компоненте сценария CameraFollow, называемое Target Object (Целевой объект). You will noticed that it is not set to anything.

rocket_mouse_unity_p2_24

Чтобы установить Целевой объект, нажмите на mouse в Иерархии и не отпуская перетащите mouse в поле Target Object в Инспекторе как показано ниже:

Не отпускайте кнопку мыши, поскольку в этом случае Инспектор покажет свойства mouse вместо Основной камеры.

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

rocket_mouse_unity_p2_25

Запустите сцену. На этот раз камера следует за мышью.

Камера следует за объектом в Unity

Обратите внимание, что в 2D играх с персонажем, который все время движется вперед, он находится не в центре экрана. Вместо этого его помещают где-то в середине левой стороны экрана. Это делается для того, чтобы дать игроку больше времени на принятие решений как избежать препятствия, что сделать чтобы поймать монету и т.д. Мы с вами поступим точно также: выберите mouse в иерархии и задайте для ее свойства Position значение (-3.5, 0, 0) и запустите сцену.

Позиционирование объекта в Unity

Мда, какая-то ерунда: мышь по-прежнему в центре экрана, но мы же ей задали совсем другую позицию. This happens because the camera script centers the camera at the target object. Это также объясняет, почему вы видите синий фон слева. Чтобы исправить этот косяк, откройте скрипт CameraFollow и добавьте приватную переменную distanceToTarget :

Затем добавьте следующий код в Start :

Здесь мы будем рассчитать начальное расстояние между камерой и объектом. Наконец, измените код в Update для учета этой дистанции:

The camera script will now keep the initial distance between the target object and the actual camera. It will also maintain this gap throughout the entire game. Запустите сцену и убедитесь, что теперь мышь смещена влево.

Мышь в левой части экрана

Создание бесконечного уровня в Unity

Right now playing the game more then a few seconds doesn’t make much sense. The mouse simply flies out of the room into a blue space. You could write a script that adds backgrounds, places the floor and the ceiling and finally adds some decorations. However, it is much easier to save the complete room as a Prefab and then instantce the whole room at once.

В такой игре, как Jetpack Joyride, вы часто будете видеть различные области (аквариум, пещеры и т.д.), которые будут иметь свой собственный префаб. For the purposes of this game, you’ll stick with one.

Вот выдержка из документации по Unity о префабах: префабы — это особый тип ассетов, позволяющий хранить весь GameObject со всеми компонентами и значениями свойств. Префаб выступает в роли шаблона для создания экземпляров хранимого объекта в сцене. Любые изменения в префабе немедленно отражаются и на всех его экземплярах, при этом вы можете переопределять компоненты и настройки для каждого экземпляра в отдельности.

Другими словами, вы добавлять объекты на сцену, устанавливать их свойства, добавлять такие компоненты, как скрипты, коллайдеров, твердые тела (rigidbodies) и так далее. После этого вы можете сохранить свой объект как Префаб и использовать его экземпляр со всеми свойствами и компонентами столько раз, сколько вам нужно.

Создание префаба комнаты

Вы хотите чтобы ваш Префаб содержал все различные элементы комнаты: книжный шкаф, окно, потолок, и т.д. Чтобы включить все эти элементы, как часть того же Префаба, просто добавьте их в родительский объект. Итак, создайте пустой Игровой объект (GameObject) выбрав GameObject\Create Empty. Затем выберите GameObject в Иерархии и сделайте следующие изменения в Инспекторе:

  • Переименуйте его в room1
  • Установите его Position в (0, 0, 0)

Вот то, что вы должны увидеть в инспекторе:

Создание префаба комнаты

В этот момент важно понять, что пустой Игровой объект находится прямо в центре комнаты в точке с координатами (0,0,0). Это не случайно, и сделано намеренно. Когда вы добавляете все детали комнаты в пустой Игровой объект, чтобы сгруппировать их, их позиции будут отределяться относительно отношению пустого Игрового объекта. Позже, когда вы захотите, переместить всю комнату, перемещая пустой Игровой объект, вам будет гораздо легче позиционировать его, зная, что изменение его позиции приведет к перемещению центра комнаты в эту точку.

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

Переместите все части комнаты (bg, bg, bg_window, ceiling, floor, object_bookcase_short1, object_mousehole) в room1, как вы делали, когда добавляли систему частиц пламени к объекту mouse.

Если вы создали комнату с несколькими книжными шкафами, или мышиными норками, вы должны добавить их в room1.

Создайте новую папку по имени Prefabs в Браузере проекта. Откройте и перетащите room1 из Иерархии непосредственно в папку Prefabs.

Вот и все. Теперь вы можете видеть Префаб, названный room1, содержащий все компоненты комнаты. Чтобы проверить это попробуйте перетащить room1 на сцену. Видите, как легко создавать дубликаты комнаты, используя префаб.

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

Создание дубликатов с помощью Префаба

Генератор комнаты

Создать скрипт, генерирующий бесконечную комнату, довольно просто. Скрипт содержит массив с кусочками комнат, из которых можно сгенерировать комнату, список кусочков комнат, которые использованы и два дополнительных метода. Один метод checks to see if another room needs to be added, а другой метод фактически добавляет комнату.

Читать:
Wps office кто разработчик

To check if a room needs to be added, the script will enumerate all existing rooms and see if there is a room ahead, farther then the screen width, чтобы гарантировать, что игрок никогда не увидит конца уровня.

rocket_mouse_unity_p2_37

Как вы можете видеть, в случае №1 вам не нужно добавить продолжение комнаты, так как ее конец еще достаточно далеко от игрока, а вот в случае №2 нам уже нужно позаботиться о продлении комнаты.

The center of the mouse object doesn’t lie on the left edge of the screen. Таким образом, хотя расстояние до конца уровня составляет менее ширины экрана, игрок по-прежнему не будет видеть конец уровня в случае №2, но скоро это произойдет, так что лучше поторопиться и продлить комнату.

Конечно, изображение выше — это только грубый пример, скрипт обнаружит, что нужно дополнить нашу комнату гораздо раньше, right after the end of the room passes the point at which it is closer to mouse then the screen width. Теперь, когда идея ясна, настало время добавить скрипт.

Создайте новый скрипт C# Script и назовите его GeneratorScript. Добавьте его в игровой объект mouse. Now mouse should have two script components:

rocket_mouse_unity_p2_36

Откройте GeneratorScript в MonoDevelop дважды щелкнув по нему в окне Project (Проект) или в Инспекторе.

Сначала, добавьте пространство имен System.Collections.Generic , так как вы собираетесь использовать класс List<T> :

Затем добавьте следующие переменные экземпляра:

availableRooms будет содержать массив Префабов, который скрипт может использовать при генерирации комнаты. В настоящее время у вас есть только один префаб (Room1). Но вы можете создать много различных типов номеров и добавить их в этом массиве так что скрипт сможет произвольно выбирать, какой тип номера ему использовать.

Окончательный проект, содержит несколько типов комнат, а также другие улучшения, но сейчас, для простоты, мы будем работать только с одним префабом комнаты.

Список currentRooms будет хранить инстанс комнаты, так что скрипт сможет узнать заканчивается ли комната и, если это необходимо, удлиннить ее. Переменная screenWidthInPoints как раз должна кэшировать размер экрана в точках. Теперь, добавьте следующий код в Start :

Здесь мы рассчитываем размер экрана, который будет использоваться для определения нужно ли удлинить комнату, как это было описано выше.

Метод для добавления новой комнаты

Добавьте следующий метод AddRoom в GeneratorScript:

This method adds new room using the farhtestRoomEndX point, which is rightmost point of the level so far. Вот описание каждой строки этого метода::

  1. Выбираем случайный индекс типа комнаты (Префаб) для дальнейшего использования.
  2. Создаем объект комнаты из массива свободных комнат с использованием случайного индекса, выбранного выше.
  3. Поскольку комната — пустой Игровой объект, содержащий все элементы интерьера комнаты, вы не можете знать ее размер. Вместо этого мы определяем размер пола внутри комнаты. Его ширина равна ширине комнаты.
  4. When you set the room position, you set the position of its center so you add the half room width to the position where the level ends. Так вы получите точку, в которую вы должны добавить новый кусочек комнаты.
  5. Здесь устанавливаем позицию комнаты. Вы должны изменить только координату Х, так как кусочки комнаты имеют одни и те же координаты Y и Z, равные нулю.
  6. Наконец, вы добавляете кусочек комнаты в список из других кусочков. Этот список будет очищен в следующем методе, ниже мы разберем почему это нужно делать.

The Method to Check If New Room Is Required

Ready? Add the GenerateRoomIfRequired method:

Хотя код и выглядит страшно, но на самом деле все довольно просто (особенно, если вы помните основную идею, описанную ранее).

  1. Creates a new list to store rooms that needs to be removed. Separate lists are required since you cannot remove items from the list while you iterating through it.
  2. Этот флаг показывает нужно ли вам добавить кусочки комнаты к имеющейся. По умолчанию он установлен в true, но большую часть времени он будет установлен в false внутри цикла foreach .
  3. Сохраним позицию игрока (я всегда говорю про позицию, но большую часть времени вы работаете только с координатой х).
  4. Это точка, после которой кусочки комнаты должны быть удалены. Если позиция кусочка комнаты за этой точки (слева), ее нужно удалить (вы должны удалять ненужные кусочки комнаты, иначе вам просто не хватит памяти).
  5. Если после точки addRoomX ничего нет, нужно добавить комнату, since the end of the level is closer then the screen width..
  6. В farthestRoomEndX вы храните точку, где уровень заканчивается. Вы будете использовать эту переменную для добавления нового кусочка комнаты, чтобы наш уровень был непрерывный.
  7. In foreach you simply enumerate current rooms. You use the floor to get the room width and calculate the roomStartX (a point where room starts, leftmost point of the room) and roomEndX (a point where the room ends, rightmost point of the room).
  8. If there is a room that starts after addRoomX then you don’t need to add rooms right now. However there is no break instruction here, since you still need to check if this room needs to be removed.
  9. If room ends to the left of removeRoomX point, then it is already off the screen and needs to be removed.
  10. Здесь мы находим крайнюю правую точку нашего уровня (точка, где в настоящее время уровень заканчивается). Она нам потребуется при добавлении нового кусочка комнаты.
  11. Мы удаляем кусочки комнаты, помеченные для удаления. Мышь уже пролетела через них, поэтому они уже далеко позади и не нужны нам.
  12. If at this point addRooms is still true then the level end is near. addRooms will be true if it didn’t find a room starting farther then screen width. This indicate that a new room needs to be added.

Добавьте FixedUpdate в GeneratorScript содержащий вызов GenerateRoomIfRequred :

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

Теперь, вернитесь в Unity и выберите Игровой объект mouse в Иерархии. В Инспекторе найдите компонент GeneratorScript.

rocket_mouse_unity_p2_40

Перетащите room1 из Иерархии в список Current Rooms. Теперь откройте папку Prefabs в Браузере проекта и перетащите room1 оттуда в Available Rooms. Напоминаем, что свойство Available Rooms в GeneratorScript используется как массив типов комнат, которые скрипт может генерировать. The Current Rooms property is room instances that are currently added to the scene. Это значит, что Available Rooms , или Current Rooms может содержать уникальные типы комнаты, которые не присутствуют в другом списке. Вот анимированная картинка, для примера. Обратите внимание, что я создал тип еще один тип комнаты под названием room2, просто чтобы продемонстрировать, что нужно сделать, если у вас много префабов комнаты.

Запустите сцену. Теперь мышь может бесконечно долго летать по уровню.

Теперь мышь может долго летать по уровню

Обратите внимание, что кусочки комнаты появляются и исчезают в Иерархии пока вы летаете. А для еще лучше, запустите игру и перейдите к вкладке Сцена. Так вы увидите, как меняется комната в режиме реального времени.

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

rocket_mouse_unity_p2_43

На этом третья часть нашего урока подошла к концу. Переходите к четвертой части Игра в стиле Jetpack Joyride в Unity 2D.

Endless Runner in Unity

In video games, no matter how large the world is, it always has an end. But some games try to emulate the infinite world, such games fall under a category called Endless Runner.

Endless Runner is a type of game where the player is constantly moving forward while collecting points and avoiding obstacles. The main objective is to reach the end of the level without falling into or colliding with the obstacles, but oftentimes, the level repeats itself infinitely, gradually increasing the difficulty, until the player collides with the obstacle.

Subway Surfers Gameplay

However, considering that even modern computers/gaming devices have limited processing power, it’s impossible to make a truly infinite world.

So how do some games create an illusion of an infinite world? The answer is by reusing the building blocks (a.k.a. object pooling), in other words, as soon as the block goes behind or outside the Camera view, it’s moved to the front.

To make an endless-runner game in Unity, we will need to make a platform with obstacles and a player controller.

Step 1: Create the Platform

We begin by creating a tiled platform that will be later stored to Prefab:

  • Create a new GameObject and call it «TilePrefab»
  • Create new Cube (GameObject -> 3D Object -> Cube)
  • Move the Cube inside «TilePrefab» object, change its position to (0, 0, 0) and scale to (8, 0.4, 20)

  • Optionally you can add Rails to the sides by creating additional Cubes, like this:

For the obstacles, I will have 3 obstacle variations, but you can make as many as needed:

  • Create 3 GameObjects inside «TilePrefab» object and name them «Obstacle1», «Obstacle2» and «Obstacle3»
  • For the first obstacle, create a new Cube and move it inside «Obstacle1» object
  • Scale new Cube to around the same width as the platform and scale its height down (the player will need to jump to avoid this obstacle)
  • Create new Material, name it «RedMaterial» and change its color to Red, then assign it to the Cube (this is just so the obstacle is distinguished from the main platform)

  • For the «Obstacle2» create a couple of cubes and place them in a triangular shape, leaving one open space at the bottom (the player will need to crouch to avoid this obstacle)

  • And lastly, the «Obstacle3» is going to be a duplicate of «Obstacle1» and «Obstacle2», combined together

  • Now select all the Objects inside Obstacles and change their tag to «Finish», this will be needed later to detect the collision between Player and Obstacle.

To generate an infinite platform we will need a couple of scripts that will handle Object Pooling and Obstacle activation:

  • Create a new script, call it «SC_PlatformTile» and paste the code below inside it:

SC_PlatformTile.cs

  • Create a new script, call it «SC_GroundGenerator» and paste the code below inside it:

SC_GroundGenerator.cs

  • Attach SC_PlatformTile script to «TilePrefab» object
  • Assign «Obstacle1», «Obstacle2» and «Obstacle3» object to Obstacles array

For the Start Point and End Point we need to create 2 GameObjects that should be placed at the start and the end of the platform respectively:

  • Assign Start Point and End Point variables in SC_PlatformTile

  • Save «TilePrefab» object to Prefab and remove it from the Scene
  • Create a new GameObject and call it «_GroundGenerator»
  • Attach SC_GroundGenerator script to «_GroundGenerator» object
  • Change Main Camera position to (10, 1, -9) and change its rotation to (0, -55, 0)
  • Create new GameObject, call it «StartPoint» and change its position to (0, -2, -15)
  • Select «_GroundGenerator» object and in SC_GroundGenerator assign Main Camera, Start Point, and Tile Prefab variables

Now press Play and observe how the platform moves. As soon as the platform tile goes out of the camera view, it’s moved back to the end with a random obstacle being activated, creating an illusion of an infinite level (Skip to 0:11).

The Camera must be placed similarly to the video, so the platforms go towards the Camera and behind it, otherwise the platforms won’t repeat.

Sharp Coder Video Player

Step 2: Create the Player

Player Instance will be a simple Sphere using a controller with the ability to jump and crouch.

  • Create new Sphere (GameObject -> 3D Object -> Sphere) and remove its Sphere Collider component
  • Assign previously created «RedMaterial» to it
  • Create a new GameObject and call it «Player»
  • Move the Sphere inside «Player» object and change its position to (0, 0, 0)
  • Create a new script, call it «SC_IRPlayer» and paste the code below inside it:

SC_IRPlayer.cs

    SC_IRPlayer script to «Player» object (you’ll notice that it added another component called Rigidbody)
  • Add BoxCollider component to «Player» object

  • Finally, place «Player» object slightly above the «StartPoint» object, right in front of the Camera

Press Play and use the W key to jump and the S key to crouch. The objective is to avoid red Obstacles:

Похожие статьи