Unity3D: Создание трехмерной игры-платформера: Настройка сцены

Настройка сцены


Теперь, когда наш герой достаточной мобильный, следующий шаг — дать ему что-нибудь сделать…

Первые шаги

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

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

Освещение

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

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

Расстановка объектов окружения

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

Построение своих собственных уровней

Уровень обучающего урока был построен при помощи расстановки компонентов окружения в программе Maya и затем — импортированием уровня в Unity. Если бы нам захотелось поэкспериментировать, или даже создать дополнительные уровни, то другие элементы сцены можно было бы найти в папке Build Your Own! панели Project.

Существует большое количество объектов топливных элементов и расстановка всех их сделала бы урок очень скучным. Если вы прочитали предыдущие уроки, то вы уже знаете, как проделать это в любом случае, поэтому мы ограничим расстановку бонусов «Health» , платформ для прыжков и точек перерождения среди других объектов.

Бонусы «Здоровье»

Начнем с простой задачи: добавим несколько бонусов «здоровье» для главного героя. Это вращающиеся, сияющие сердечки, которые добавляют здоровье нашему игроку. Бонусы уже определены как префабы в окне Project. Посмотрите в папке «Props» и вы найдете уже готовый к использованию объект HealthLifePickUpPrefab.

alt
Установка бонуса «Здоровье»
  • Перетащите один объект на окно Scene View используя инструменты позиционирования Unity, чтобы установить его где-нибудь в уровне.
  • Повторите это действие пока не поместите хотя бы полудюжины объектов на карте.

Где расположить их — это ваше дело, хотя не должно быть так, чтобы их можно было бы легко найти или добраться до них. Рассмотрим, как игрок мог бы проходить уровень, и решим где находятся лучшие места для бонусов. Лучше не быть слишком щедрым или игра будет слишком легкой.

Наконец, мы должны будем сгруппировать эти бонусы в папку определенного вида для того, чтобы избежать их загромождения в панели Hierarchy. Мы можем сделать это создав пустой игровой объект при помощи элемента меню GameObject->Create Empty. Переименуем этот новый объект в «Health Pickups» и используем его для группировки бонусов «Здоровье», как показано на рисунке:

alt
Иерархия бонусов «Здоровье»

Силовое поле

alt
Силовое поле

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

Есть несколько способов достижения приличного визуального эффекта, но какой выбрать? Иногда простое решение — самое лучшее: мы будем просто анимировать UV-координаты текстуры, чтобы придать ей эффект действующего силового поля.

Анимация будет выполнена при помощи короткого скрипта, который можно найти в папке Scripts-Misc в окне Project. Скрипт называется FenceTextureOffset и выглядит так:

var scrollSpeed = 0.25;

function FixedUpdate()
{
  var offset = Time.time * scrollSpeed;
  renderer.material.mainTextureOffset = Vector2 (offset,offset);
}

Первая строка выражает свойство, которое мы можем редактировать напрямую в интерфейсе Unity, свойство Scroll Speed. Функция FixedUpdate() вызывается определенное количество раз в секунду программной средой Unity. Мы используем короткую формулу — умножаем значение Scroll Speed на текущее время — чтобы определить смещение текстуры.

«Приятные» свойства

Когда инспектор Unity отображает свойства и переменные, то их имена упорядочиваются, чтобы они выглядели лучше. Как правило, это просто означает поиск заглавных букв в имени и вставка пробела перед каждой буквой. Среда разработки Unity меняет первую букву имени на заглавную. Таким образом, scrollSpeed будет отображаться как Scroll Speed.

Когда текстура отображается программой, то эта текстура, как правило, на самом деле просто изображение. Свойство mainTextureOffset материала указывает Unity , что следует рисовать смещение изображения текстуры в предалах ее UV-пространства. Это можно использовать для создания некоторых очень эффективных результатов, не прибегая к сложной анимационной последовательности.

Развернем levelGeometry игрового объекта, чтобы выявить различные элементы данных уровня. Нам нужно создать аниацию для ограждения на объекте impoundFence, поэтому перетащите скрипт fenceTextureOffset на него.

Скрипты для собираемых объектов

На данный момент Лерпз не подбирает ни один из объектов в уровне. Это потому что программной среде Unity не было указано позволить нашему герою делать это. Нам нужно добавить два элемента для каждого собираемого объекта:

  • Компонент Collider
  • Код скрипта для управления компонентом Collider и обновления параметров здоровья игрока, и т.д.

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

Два префаба наш герой может собирать: FuelCellPrefab и HealthPickPrefab. Их можно найти в папке Props в окне Project.

  • Выберите корневой объект HealthPickUpPrefab
  • Используйте меню Component->Physics->Add Sphere Collider , чтобы добавить коллайдер сферы префабу. Вы должны будете увидеть, что объект отобразился в окне Inspector.
  • Наконец, установим флажок на элементе Is Trigger
alt
Компонент HealthPickUpPrefab в окне Inspector
Примечание Скрипт ObjectRotater уже прикреплен к префабу. Он просто заставляет бонус вращаться на месте и это очень просто. Мы увидим более сложный пример запрограммированной анимации в следующей главе.

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

Триггеры

Триггеры — это невидимые компоненты, которые, как гласят их названия, запускают какое-либо событие. В Unity триггер — просто коллайдер со своей установкой свойства Is Trigger. Это означает, что когда что-нибудь сталкивается с триггером, то он ведет себя как виртуальный переключатель, а не как физический объект.

Триггеры будут посылать одно из трех сообщений о событии, когда что-нибудь устанавливает их на «off» : OnTriggerEnter(), OnTriggerStay() и OnTriggerExit().

Сообщения о событии триггера посылаются любому скрипту, прикрепленному к объекту триггера, поэтому теперь нам нужно добавить подходящий скрипт для префаба «health» :

  • Перейдите в меню Components и выберите скрипт Pickup из меню Third Person. Это добавит скрипт Pickup для префаба.
  • Установите свойство Pickup Type в окне Inspector на значение Health как показано на изображении выше.
  • Наконец, установите свойство Amount на 3 или около того. Это количество здоровья, которое бонус дает игроку.

Сколько здоровья?

Дисплей «HUD» , который отображает текущий уровень здоровья игрока, жизни, и т.д., может обрабатывать максимально уровень здоровья только из шести. Что происходит, если игрок собирает бонусы «здоровье» , когда уже имеет полный запас здоровья? Это дело вкуса, но я решил сделать этот триггер дополнительным для еще одной «жизни». Логику в этом можно найти в статусе игрока, проверяющего скрипт, в статусе ThirdPersonStatus.

Объекты топливных элементов устанавливаются таким же способом, только с двумя различиями:

  • Настройка Pickup Type должна быть установлена на значение FuelCell
  • Значение Amount — это количество горючего, которое представляет бонус (1 кажется лучше).

Прыгающие платформы

alt
Прыгающая платформа

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

Сначала создадим пустой игровой объект и назовем его Jump Pad Triggers. Мы будем использовать его в качестве папки для хранения наших объектов-триггеров прыгающей платформы вместе.

Теперь построим наш префаб:

  • Создадим новый пустой игровой объект.
  • Переименуем этот объект в JumpPad Trigger 1.
  • Добавим объект Box Collider к нему. (Объект Sphere Collider должен работать в теории, но объект Box Collider подходит лучше в качестве формы прыгающей платформы.)
  • Установим Collider на Trigger.
  • Добавим скрипт JumpPad.

Вот мы и создали объект. Теперь нам нужно превратить его в Префаб:

  • Выберите Prefab из меню Create выше окна Project.
  • Перетащите и бросьте наш игровой объект Jump Pad на новый префаб.
  • Переименуйте префаб в JumpPad Trigger.
  • Удалите первичный игровой объект из панели Hierarchy.
  • Перетащите прафаб JumpPad на сцену и поместите его прямо внутри одного из расположений Jump Pad. (Есть шесть мест, куда можно поместить. Я рекомендую использовать режим раскладки 4 Split, чтобы это помогло с расстановкой объектов.)
  • По умолчанию значение прагающей платформы Jump Height равное пяти не достаточно для того, чтобы Лерпз прыгнул прямо на уровень сада. Я предлагаю использовать значение около 15-30 для этих платформ. (Заключительный пример проекта использует значение 30.)
  • Наконец, нажмите на Play и протестируйте игру, чтобы убедиться в том, что все наши новые триггеры работают корректно.
Примечание Скрипты работают также как префабы: мы только что добавили ссылку на скрипт Pickup в папку Props нашему префабу. Редактирование одного префаба в окне Project также повлияет на все копии в сцене.

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

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

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

Смотрите также:

Урок по созданию трехмерной игры-платформера в среде разработки Unity3D: Введение


Урок по созданию трехмерной игры-платформера в среде разработки Unity3D: Первые шаги

Комментировать

Почта не публикуется.Обязательные поля отмечены *