3D Platformer Tutorial
Построение 3D игр на платформе Unity
Что мы будем изучат в этом уроке ? В этом уроке большое внимание уделяется технической стороне построения игры в Unity, охватывающего
следующее:
•Character Controllers
• Projectors
• Audio Listeners, Audio Sources & Audio Clips
• Multiple Cameras (и для переключения между ними)
• UnityGUI scripting system
• Colliders (Столкновения)
• Messages & events (сообщения и события)
• Lighting (освещение)
• Particle systems (Партикли, эффекты взрывов, дыма и т.д.)
• Blob shadows (тени)
• Scripting (AI, state machines, player controls)
Что вы узнаете:
Этот урок активно использует скрипты поэтому вы должны быть знакомы с
хотя бы из одним поддерживаемых языков JavaScript, C# .
Кроме того, предполагается, что вы знакомы с интерфейсом Unity что бы,
выполнять основные операции, такие, как размещение Asset на сцене, добавлять компоненты
и GameObject и редактировать свойства в инспекторе и т.д.
Организация проекта:
Unity не принуждает вас к конкретной организации ресурсов вашего проекта.
Мы можете предпочесть организацию ваших ресурсов по типу, к примеру "Textures", "Models", "Sound effects" и так далее. В Unity Technologies, мы считаем, что такая структура хорошо подходит для небольших проектов. Для более сложных проектов нашим пользователям обычно рекомендуется группировать ресурсы по функциям, к примеру собирая их вместе в папках вроде "Player", "Enemies", "Props", "Scenery" и так далее.
Проект данного урока был разработан рядом членов команды и вырос органично, отображая их различные соглашения и стили. Справедливости ради мы решили оставить организацию проекта прежней, так как она хорошо представляет организацию структуры 'малого' проекта.
Абстракции GameObjects и Компоненты
Дизайн Unity располагает ресурсы каждой сцены в центре процесса разработки.
Это делает доступным по большей части визуальный метод производства игр, где немалая доля работы выполняется с помощью простого перетягивания. Это идеально для груды дизайнерской работы над уровнями, но не все ресурсы могут быть отображены таким образом. Некоторые из них являются абстрактными, а не визуальными объектами, поэтому они представлены в виде условных абстрактных иконок и каркасных гизмо – к примеру источники звука (Audio Sources) и освещения (Lights) – или же не отображаются в Scene View вовсе. В эту категорию попадают скрипты.
Скрипты определяют, как ресурсы и GameObjects в сцене Unity взаимодействуют друг с другом; эта интерактивность является ядром всех игр. По этой причине правилом хорошего тона считается создание информативных комментариев внутри ваших скриптов.
Этот урок подразумевает, что вы можете читать приведенные скрипты и понимать множество комментариев, свободно изложенных по ходу их описания. Тем не менее, когда будет приводиться отдельная важная скриптовая техника или концепция, мы будем рассматривать ее в деталях.
Скрипты документированы с помощью обширных комментариев и к тому же были разработаны самопоясняющими, насколько было возможно. Мы рекомендуем вам читать скрипт по мере его появления в этом уроке, чтобы понять, как он работает. Не бойтесь также экспериментировать!
Файлы:
Наиболее актуальные файлы для данного проекта можно скачать тут
С этим файлом мы будем работать. Там приготовлено все для урока:
http://unity3d.com/support/resources/files/3DPlatformProject.zip (качаем это и не паримся)
А здесь находиться готовый вариант, что бы вы могли посмотреть что должно получиться
http://unity3d.com/support/resources/files/3DPlatformProjectEndpoint.zip
Это руководство предполагает, что Вы уже знаете основное управления Unity, такие, как размещение
объектов в сцене, поэтому первый отправной точкой будет Scene там уже есть основные декорации
и реквизита на месте.
Соглашения Unity:
Unity является уникальной системой разработки. Большинство разработчиков будет работать в редакторе кода, расходуя 90% своего времени на редактирование кода, а также на написание кода для загрузки и использования ресурсов. В этом плане Unity отличается: он ресурсо-центрирован, а не кодо-центрирован и фокусируется на ресурсах подобно приложению 3D моделирования. По этой причине стоит понять ключевые соглашения и уникальную терминологию разработки на Unity:
Проекты (Projects):
Игра, созданная в Unity будет состоять из Проекта (Project). Он будет содержать все элементы вашего проекта, такие, как модели, скрипты, уровни, меню и т.п. Обычно, один файл Проекта будет содержать все элементы вашей игры. Когда вы запускаете Unity 2, первое, что происходит, это запуск файла Проекта. (Если вы только что установили Unity, это будет файл Проекта, содержащий Island Demo.)
Сцены (Scenes):
Каждый Проект состоит из одного или более документов, называемых Сценами (Scenes). Одна сцена будет содержать один игровой уровень, но большие элементы пользовательского интерфейса, такие, как игровые меню, последовательности завершения игры или большие ролики могут также располагаться в своих собственных файлах Сцен.
Сложные игры могут даже использовать целые Сцены в целях инициализации. Таким образом, все уровни игры скорее всего будут Сценами, хотя Сцена не обязана быть игровым уровнем.
Игровые Объекты, Компоненты, Ресурсы и Шаблоны (GameObjects, Components, Assets & Prefabs)
Ключом к пониманию Unity является связь между GameObject и Компонентом.
UnityGameObjects:
GameObject – это фундаментальный строительный блок в Unity. GameObject – это контейнер для разных частей функциональности, называемых Компонентами. GameObject почти всегда содержит более одного Компонента. Все GameObjects содержат Компонент Трансформации (Transform Component), определяющий их позицию и ориентацию.
Иерархии GameObject:
Действительной мощью GameObject является его способность содержать в себе другие GameObjects, действуя подобно папке в OS X Finder. Это делает возможной иерархическую организацию GameObjects, таким образом, составная модель или полная связка источников освещения может быть определена одним GameObject. (По факту, большая часть моделей появляется в Unity как иерархия GameObjects, потому, что это отражает структуру, которая была создана в пакете моделирования.) GameObject, заданный внутри другого GameObject является потомственным GameObject.
Компоненты (Components):
Компоненты являются строительными блоками GameObjects. Без них GameObject не мог бы сделать ничего интересного.
Компонент может представлять видимые объекты, такие, как меши, материалы, данные о ландшафте или систему частиц. Другие типы компонентов более абстрактны, например Камеры или Источники Освещения, которые не имеют представления физической модели вовсе; вместо этого вы увидите иконку и определенные каркасные обозначения, отображающие их ключевые особенности.
Компонент всегда привязан к GameObject; он не может жить самостоятельно. Множество Компонентов может быть привязано к одному GameObject. GameObjects может поддерживать множество Компонентов определенных типов — GameObject может содержать любое количество скриптов, к примеру. Но другие, как те, например, что определяют системы частиц, эксклюзивны и могут появляться лишь единожды в одном GameObject. Например, если вы хотите определить множество систем частиц, вам, как правило, придется использовать иерархию GameObjects, каждый из которых содержит свой собственный набор Компонентов системы частиц.
Ресурсы (Assets):
Все ваши импортированные Ресурсы появляются в панели Project и могут являться практически чем угодно, от материала или текстуры до аудио файлов, готовых к использованию и шаблонных GameObject (известных, как “Prefab”).
Ресурсы могут быть простыми или сложными; от единичного аудио файла или файла изображения PNG, вплоть до сложной иерархии потомственных GameObjects и Компонентов, определяющих всего один элемент вашей игры.
Например, Шаблон (Prefab) игрового персонажа может быть задан как единичный Ресурс, содержащий модель и ассоциированные с ней анимации. Он также может содержать Компонент скрипта, аудио клипы и любые другие Компоненты, которые необходимы для его функционирования, вам лишь остается просто перетянуть его в панель Scene и получить полностью работающий аватар.
Пользовательские Иконки и Гизмо:
Вы можете сделать так, чтобы Unity отображал пользовательские иконки и другую визуальную информацию для ваших Ресурсов (Assets), если захотите. Мы рассмотрим пример этого в следующем разделе.
Ресурсы вашего проекта отображены на панели Project. Когда вы перетягиваете один из них в Сцену, он появляется на панели Иерархии, которая определяет содержимое Сцены. (Игровая Сцена подобна театральной. Ей может быть уровень, меню, многопользовательский интерфейс – все, что вы захотите.) Панель Project присутствует во всех Сценах вашего Проекта.
Шаблоны (Prefabs):
Шаблон (Prefab) – это Ресурс (Asset), который был определен, как эталонный. Для Unity это все равно, что шаблонный документ для текстового редактора. Когда вы размещаете Шаблон в вашей Сцене, на панели Hierarchy Unity размещает лишь ссылку на Шаблон, но не полную копию. Это называется клонированием. Каждая ссылка, которую вы создали, является клоном Шаблона.
Если вы щелкните на Шаблон на панели Project и отрегулируете его настройки, вы обнаружите, что все эти изменения немедленно отразились на всех клонах этого Шаблона в вашей Сцене. Это делает Шаблоны идеальными для многократного использования элементов, таких, как пули, враги и т.п. Если вы обнаружили, что ваш враг ведет себя неправильно, вам необходимо лишь отрегулировать скрипт или настройки в оригинальном Шаблоне, вместо индивидуального редактирования каждого врага в Сцене.
Тем не менее, если вы хотите изменить пару настроек определенного клона Шаблона, вы также можете это сделать: эти изменения отразятся только на отдельном клоне.
Шаблоны выделяются голубым цветом на обеих панелях: и в Project, и в Hierarchy.
ПРИМЕЧАНИЕ
Клон Шаблона не может обладать дополнительными Компонентами, добавленными после его создания, так как это разорвет связь с оригинальным Шаблоном. Unity предупредит вас, если вы попытаетесь это сделать. Тем не менее, Unity позволяет вам дополнить оригинальный Шаблон теми изменениями, после которых произошел разрыв связи.
Первые шаги:
Lerpz - это имя инопланетянина который присутствует в проекте.
Разместим на сцене Lerpz-а
- Откройте проект, выбираем окно просмотра Scene.
- Закладка Project -> Scenes->TheGame - кликаем
- Перетаскиваем сборку(Prefab) Lerpz(из закладки Project -> Player) прямо в окно сцены, в закладке Hierarchy должен отобразиться Lerpz
- Кликаем по новому Lerpz в закладке Hierarchy и переименовываем в Player;
- Выделите Player object, переместите мышь в окно Scene и
нажмите клавишу F (focus) и вас переместит к центру Lerpz модели.
- Переместите Lerpz на подиум, что недалеко от тюрьмы. (См. скриншот.)
Если нажать кнопку Play, увидите Lerpz стоит во дворе тюрьмы.
На данном этапе, Lerpz не может двигаться а камера должна быть связанна с
нашим игроком.
- Нажмите на кнопку play, чтобы остановить игру.
Мы должны заставить двигаться Lerpz-а, но сначала, мы должны остановиться на нашей камере.
Позиционирование Lerpz-а на сцене.
Файлы этого тутора включает в себя несколько различных скриптов камеры, но
для целей нашего урока мы будем использовать SpringFollowCamera. Вы найдете ее в закладке Project -> Scripts -> Camera .
- Перетащите SpringFollowCamera скрипт из Project панели на Камеру(NearCamera) в Hierarchy панели. (Таким образом вы сообщите камере что она будет использовать этот скрипт)
- Кликаем Play.
Вы получите сообщение об ошибке
- Откройте Debug Console (Cmd + Shift + C / Ctrl + Shift + C на ПК), если она еще не видна.
Это окно выводит предупреждения, ошибки и другую отладочную информацию из вашего проекта
игры. Вы, вероятно, увидите много копий сообщения об ошибке повторяется в
журнале. Выделите одно окно и панель ниже покажет больше информации
об этой ошибке, как показано на изображении ниже.
"Нет цели" сообщение об ошибке.
Всякий раз, когда это возможно, Debug Log окно будет показывать линию на
GameObject в Hierarchy (или к Project панели если ошибка
в (Prefab)сборки или Срипте).
Ошибка типа UnassignedReferenceException - это, то что Вы будете вероятно видеть очень
часто, если Вы плохо знакомы с Unity. Это кажется страшным,(от ред- мне тоже : ) но всего навсего, это означает, то, что у скрипта
не была установлена target переменная.
- Нажмите на NearCamera объект в иерархии панели и посмотрите на Spring Follow Camera (Script) Компонент свойств.
Посмотрим на свойство Target, там установлено None (Transform), это свойство определяет целевой объект, который нужен для работы скрипта.
- Остановите игру, если вы еще этого не сделали.
- Если она еще не выбрана, нажмите на NearCamera в Hierarchy панели.
- Перетащите Player от Hierarchy Панели на Target.
Когда вы запускаете Unity в игровом режиме он позволит вам настроить свойства различных
Игровых объектов и компонентов в игре. Тем не менее, это не сохранит изменений!
На момент остановки игры, любые изменения не будут записанны!
Если вы хотите, внести изменения в игру, сначала остановите ее.
Если нажать кнопку Play камера еще не будет работать. Вы увидите ошибки, связанные с
SpringFollowCamera скрипте, т.к скрипт работает совместно с другим скриптом ThirdPersonController.
Это объясняется тем, что камера от третьего лица(SpringFollowCamera ) тесно связана
к контролем игрока(ThirdPersonController): он(скрипт - SpringFollowCamera ) должен знать, что игрок делает так, чтобы она смогла реагировать в
соответствии его действиям.
Окончательные параметры должен выглядеть, как показано на рисунке ниже:
Настройки камеры скрипта (Spring Follow Camera)
Можете поэкспериментировать со значениями, если вам не нравится то, как работает камера, это
субъективная оценка, и не существует единой правильной настройки.
- Завершение соединения между camera и player. Возьмем ThirdPersonController скрипт. Он находиться в Project панели -> Scripts->Player и перетаскиваем в на наш Player (в иерархии панели)
Third Person Controller скрипт также имеет свои собственные требования и зависимости. Наиболее важным из них является Character Controller component. К счастью, скрипт уже говорит Unity об этом, таким образом Unity добавит этот компонент для нас.
Сейчас нам нужно добавить тег к нашим Player GameObject. Это объясняется тем, что скрипты ищут
Player-a на сцене, через Теги.
- В Inspector-е откройте раскрывающемся меню тегов (Tag) и выбрать "Player" tag, как показано ниже (от ред. - хотя у меня он подефолту уже был выставлен на Player)
Выбор Player tag
ПРИМЕЧАНИЕ
Тэги, перечисленные в меню, указанные выше, предоставляемые Unity по умолчанию.
Мы узнаем, как создать наши собственные Tag-и и Layers-сы позже.
Теги будут использовать позже, так что вернемся к Character Controller и нашему скрипту.
- Выберите Player объект и смотритие в инспекторе. Он должен выглядеть следующим
образом:
Character Controller и Third Person Controller скрипт компонент на месте.
Наш следующий шаг заключается в том, чтобы изменить Character Controller. На данный момент, Capsule Collider (Капсула столкновений) она расположена слишком далеко вниз на оси Y, и Lerpz стоит на пустом месте. (А точнее весит в воздухе)
(Вы можете увидеть Collider позицию на Scene View: она зеленой цилиндрической
формы.) Мы должны изменить позицию капсулы по Y
Капсула столкновений отображена зеленой
Изображение
- Установите новую позицию для Capsule Collider, сделать это можно в Player -> строка Center (см. криншот ниже)
(от ред. - В мануале рекомендуют значения для Y - 1.03)
Настройка положения Capsule Collider
Если вы кликните Play, Lerpz будет двигаться (клавиши a,w,s,d,) строго по уровню земли.
The Character Controller и Third Person Controller скрипт.
В большинстве игр, игрок способен на невозможные физические подвиги, повороты,
мгновенные остановки, прыжки на невероятные расстояния и другие действия,
которые было бы трудно использовать в традиционной модели физики.
Character Controller поэтому расцепляет нашего игрока от механизма физики, обеспечивая
основные средства управления над движением.
Character Controller упрощает манипуляцией игрока (Player) и многих других не Player-ных типов (от ред. - NPC например)
Character Controller состоит из капсулы столкновений (capsule collider) которая связана с основной системой движения,
позволяя нашему Герою перемещаться, двигаться вверх или вниз по наклону.
Вы можете изменить максимальный шаг и наклон в установках инспектора. (параметр Slope Limit)
(от ред. - Более подробно о Character Controller можете прочитать в справке тут.
Character Controller как правило, используются в скрипте. Использование Character Controller скриптом расширяет его возможности для удовлетворения потребности в игре. В нашем проекте, в Third Person Controller скрипт выполняет эту функцию, и добавляет, необходимую
поддержку платформы для нашей игры. В нем оговариваться джойстик, клавиатура, мышь или
другие устройства ввода и действия под ее контролем игрока.
Edit->Project Settings->Input Manager настройки для устройств ввода, управления.
ПРИМЕЧАНИЕ
Нет никаких специальных скриптов, которые мы , будем использывать для Player-a. Они
совершенно обычные скрипты Unity, которые были встроены для этого проекта.
Нет никакого заданного по умолчанию Character Controller скрипта.
ThirdPersonController скрипт уже часть из сборки, так что нет необходимости
добавить его.
Следующий шаг состоит в том, чтобы оживить Lerpz-а правильно и добавить дополнительные движения,
таких, как прыжки и т.д. ...
Анимирование Lerpz
Сейчас Lerpz только скользит по пейзажу. Потому что Character Controller не обрабатывается анимацией. И правильно делает. Так как она ничего не знает о нашей модели игрока и какие последовательности мультипликации относятся к каждому движению. Нам необходимо подключить
Lerpz-а к его анимационной последовательности, и это делается с помощью ThirdPersonPlayerAnimation Скрипт-а.
Выделим Player в иерархии, жмем на Component меню и добавляем ThirdPersonPlayerAnimation скрипт для Player game object.
(От ред. - Упссс но я там не нашел то что нам сказали в мануале. Это лежит тут Панель Project -> Scripts -> Player -> ThirdPersonPlayerAnimation, хватаем его мышкой и тащим в иерархическую панель на нашего Player. Тут же можно увидеть в инспекторе как добавилась ссылка на скрипт)
Если нажать кнопку Play сейчас, вы увидите правильно анимированного Lerpz-а .
Так что же происходит? Что делает этот скрипт ? Ответ заключается в том, как Unity обрабатывает персонажную анимацию.
Third Person Player Animation скрипт
Модель Lerpz, которую мы используем, была создана для множественных проектов и содержит пятнадцать
последовательных анимаций. Только одиннадцать используются в этой обучающей программе. Если Вы выбираете Player
object в панели Hierarchy и посмотрите в Инспектор, Вы уведите все пятнадцать анимации
последовательно перечислены в пределах компонента Анимации, из которых только следующие
фактически используется в данном руководстве:
• Walk -- Обычная хотьба.
• Run -- Бегущая анимация. (Hold the Option key while playing to run.)
• Punch --Когда игрок нападает на противника, робота охранника
• Jump -- Прыжки.
• Jump fall -- Когда Lerpz достигает пика прыжка и начинает падать.
• Idle -- Когда Lerpz нефига не делает.
• Wall jump -- переворот назад анимация когда Lerpz прыгает со стены. - (от ред. - не знаю, может не правильно перевел)
• Jet-pack Jump -- Когда Lerpz's замедляется при падение.
• Ledge fall -- Выполняеться, когда Lerpz сходит с края платформы.
• Buttstomp -- Выполняеться, когда Lerpz получил люлей от охранка робота.
• Jump land -- Выполняеться, когда Lerpz после прыжка или падения.
Модели и анимации для Lerpz-а были созданы с помощью майя и импортированы в Unity.
За более подробной информацией об импорте мешей и анимации, пожалуйста, обращайтесь сюда.
Большинство этих анимаций работают через ThirdPersonPlayerAnimation скрипт, который проверяет средства управления игрока и реагирует соответствующим образом. Некоторые анимации скрыты под другими, и ожидают своей очереди. Этот скрипт ThirdPersonController содержит основной набор значений передаваемый в функции. Читает значения с входного устройства и обновляет состояния чара соответствующим образом.
Jet-Pack
Это то что на спине у Lerpz-а
На данный момент, наш персонаж передвигается и прыгает вокруг, но его реактивный Jet-Pack
пока не работает. Lerpz использует Jet-Pack для замедления темпов своего падения. Анимация падения уже есть,
но Jet-Pack излучает струи газа при работе. Чтобы сделать работу струй,
нам нужно будет добавить систему частиц (Particle Systems) , и точечный свет (Point Light). Система частиц
будет производить типа эффекта пламени, в то время точечный свет придаст иллюзию огня, действующая в качестве источника освещения.
ПРИМЕЧАНИЕ
Что такое система частиц (Particle System)?
Системы частиц выбрасывают десятки частиц - как правило, плоские 2D billboards или спрайты --
в 3D мире. Каждая частица представляется как материальная точка с дополнительными атрибутами, такими как скорость, цвет, ориентация в пространстве, угловая скорость, и т. п. В ходе работы программы моделирующей частицы, каждая частица изменяет своё состояние по определенному, общему для всех частиц системы, закону. В большинстве реализаций, новые частицы испускаются так называемым «эмиттером». Эмиттером может быть точка, тогда новые частицы будут возникать в одном месте. Так можно смоделировать например взрыв: эмиттером будет его эпицентр. Эмиттером может быть отрезок прямой или плоскость: например частицы дождя или снега должны возникать на высоко расположенной горизонтальной плоскости. Эмиттером может быть и произвольный геометрический объект: в этом случае новые частицы будут возникать на всей его поверхности.
На протяжении жизни частица редко остаётся в покое. Частицы могут двигаться, вращаться, менять свой цвет и/или прозрачность, и сталкиваться с трёхмерными объектами. Часто у частиц задана максимальная продолжительность жизни, по истечении которого частица исчезает.
Система может быть использована для моделирования огня, дыма, взрывов и Звездных полей.
Добавление Particle Systems
- Используйте меню создать пустой GameObject в иерархии Панели. (crt+shift+N)
- Переименуем наш новый GameObject в "Jet".
Выбираем новый Jet, и добавляем:
- Ellipsoid Particle Emitter (Эллипсоидный эмиттер частиц) (от ред.- Жмем в меню Component -> Particles -> Ellipsoid Particle Emitter
- Particle Animat
- World Particle Collider
- Particle Renderer
- Снимите флажок “Enabled” в инспекторе для частиц видеообработки (Particle Renderer). Это позволит временно отключить его.
- Хватаем и тащим наш Jet к выхлопной трубе Jet-Pack у Lerpz's -а.
- Повторно активируйте частицы видеообработки. (от ред. - то то включите то выключите)
- Установите настройки для Эллипсоидного эмиттера частиц, как показано ниже:
Эти параметры направят в узкий поток частицы,
которые мы будем использовать для моделирования струи пламени
- Теперь установите Particle Animator настройки как показано на рисунке:
Настройки Particle Animator. Значения в диаграмме определяют входы Color Animation. Не забывайте также
откорректировать другие параметры настройки !
Particle Animator будет анимировать частицы цвета, по степени их исчезновения.
Частицы начинаются с белого цвета, с потемнением через желтый и оранжевый, так же как наша струя огня охлаждаться по мере удаления от возгорания. Так как мы собираемся запихнуть текстуру(огня) в каждую частицу, в Particle Animator будет использоваться оттенки этой текстуры, так что цвет анимации будет полупрозрачным, и мы надеемся эффективным. В диалоге цвета также поставте степень прозрачности Альфа канала. Поэкспериментируйте с настройками. Но сначала добавьте текстуру. Об этом будет сказано ниже.
Далее идет Particle Renderer. Этот компонент перерисовывает каждую частицу. Он также определяет материал для прорисовки частиц. Мы хотим, чтобы у нас было пламя типа реактивного эффекта, поэтому мы будем использовать материал "огня". Particles->Sources->Materials->fire add
(от ред. перетащите мышкой этот материал на Jet)
- Установите значения как показано ниже
Установки Particle Renderer.
Изображение
Настройка Stretch Particles сообщает Unity должны ли части оставлять след от полета, в какой плоскости двигаться и т.д. Мы хотим, чтобы эти частицы немного растянулись в зависимости от их скорости.
CastShadows и параметры настройки ReceiveShadows не имеют никакого эффекта, если Вы не используете custom shader. Это - продвинутая тема выходит за рамки этого руководства.
Добавление Освещения.
Наш реактивный Jet выглядит здорово, но это вдействительности иллюзия: система просто выплевывает много
крошечные изображений, но пламя не являться источником освещения и не дает свет. Для полной
иллюзии, мы создадим отдельный Point Light GameObject. Мы включим его в то же время, как будет извергаться пламя. В результате пламя будет освящать рядом стоящие объекты. (Мы будем использовать только одиночное освещение, а не
один свет на каждую струю, что бы сохранить производительность.)
- Создать новый Point Light GameObject.
- Название его "Jet Light" и устонавите на позицию между двумя турбинами на Jet pack-e.
- Выделяем Jet Light и изменем настройки как показано на рисунке:
Jet-pack Light settings.
Почему нет теней?
Тени являются вычислительно дорогими для большинства оборудования. Имеет смысл
избежать их расчета. Пламя не очень большое, поэтому оно только должно отражаться у Lerpz-а в спине.
Точечное освещение также будут отражено в близлежащих декорациях, но это не будет достаточно ярким,
чтобы сделать отсутствие тени заметным.
Следующий шаг состоит в том, чтобы обновить Player GameObject подключить Jet и light objects.
Чтобы сделать это, мы создадим свою первую сборку (Prefab)Jet в Project панели так:
- В Project панели, выберите (empty) Player folder, а затем нажмите кнопку Create...
- Из выпадающего меню выберите, Prefab. Это позволит создать пустой Prefab.
- Переименуем пустой Prefab в Jet.
- Перетащите Jet объект из Hierarchy Панели на нашу новую сборку (Prefab). Jet Light пока не трогаем.
Имя Jet в панели Hierarchy должно стать синим цветом, это говорит нам о том, что в настоящее время оно связано
в сборку(Prefab).
- Удаляем наш первоначальной Jet объект из Hierarchy панели. (Но пока нетрогаем наш Jet Light!)
Теперь мы добавим огненные струи (дважды) и освещение (один раз) нашему Player-у:
- Идем в Player object в панели Hierarchy
- Открываем его пока не увидим дочернее дерево. (rootJoint.) torso
- Перетащите Jet Prefab object на тот объект что указан выше, два раза.
- Переименуем их Jet L и Jet R,
- Бросьте Jet Light на тот же объект torso.(торс)
Теперь у вас должен быть один объект, в hierarchy-ии выглядит примерно так:
Используйте инструментальные средства манипуляции Unity, чтобы позиционировать каждый jet под его соответствующим
реактивным выход в модели Lerpz-а
- Переместите JetLight в точке между двумя Jet Prefabs
Когда вы достигли этого, у Lerpz-а теперь есть две пламенных струи льющихся потоком от
его Jet-Pack. Мы почти у цели!
Последний шаг заключается в том, чтобы активировать Jet Prefabs и Jet Light только тогда, когда он
прыгает. Это достигается с помощью скриптов.
- Найдите JetPackParticleController скрипт Scripts->Player и перетащите его
на наиболее верхнее место в Player объекте в Hierarchy панели.
Теперь мы видем что-реактивный пакет работает как ожидалось. Сценарий управляет
двумя джет паками и светом, синхронизируя их с движением Lerpz-а
и запускает все три элемента вместе, когда игрок нажимает на прыжок.
Добавление Теней (Blob Shadow).
Blob Тень является обманом. Вместо трассировки лучей света и проверки ее, упираются ли они во что нибудь,
мы просто проектируем темное изображение - в данном случае просто круглая черная клякса.
На что-либо ниже нашего персонажа. Это более быстро и более просто для графики,
таким образом это должно быстро работать на всех диапазонах аппаратных средств.
Unity подключает Blob-Shadow prefab в своей стандартной Standard Assets collection колекции,
поэтому мы будем использовать это вместо того, чтобы создавать нашу собственную. Этот asset-сы
уже импортированы и добавлены в проект в Blob-Shadow folder папку. Откройте эту папку в панели Project и кликнете
на blob shadow projector Prefab и перетащите на верхний уровень нашего объекта Player в Hierarchy Панели.
Далее, вам нужно будет изменить blob shadow projector в Position и Rotation значения, для того, что бы тень от нашего персонажа падал прямо на землю.
- Измените вид просмотра на 4-Split layout.
- Установите в blob shadow projector’s в закладке Rotation значения на 90, 180 и 0 соответственно
- Теперь используйте вид сбоку и вид сверху, чтобы переместить проектор тени непосредственно над головой Lerpz-а.
Вы может переместить проектор вверх или вниз немного, пока вас не устроит размер тени.
Создание нового слоя
На этом этапе вы уже заметили, что тень также падает и на Lerpz-а сверху.
Мы не хотим, чтобы это произошло. Есть два варианта, чтобы обойти это: Разместить таким образом прожектор тени
что бы тень падала под углом к ногам Lerpz-а, или просто сказать ему, не по проектируй
на объекты в отдельных слоях. Мы будем использовать второй вариант.
- Откроем Player GameObject.
- Кликаем на Layer в Inspector-е.
- Выбираем Add new layer.
- Кликаем на первую пустую User Layer и добавляем имя noShadow
Добавление нового слоя с помощью Tag Manager
- Вернемся к Player object -у
- Кликаем на “Layer” в инспекторе в выподающем списке выбираем имя слоя, noShadow.
Unity спросит желаете ли Вы применить это ко всему дочерниму объекту GameObjects: отвечаем “Change
Children Layers”.
- Затем мы должны сказать BlobShadowProjector-у не проектировать на объекты в этом слое.
- Топаем в Hierarchy панель, выбираем blob shadow projector ищем закладку Projector, там есть строка Ignore
Layers, выбираем слой для игнорирования. То есть наш noShadow.
Если мы сейчас запустим игровой режим то увидим что тень падает и не попадает на нашего игрока,
но когода он включает свой мега турбо джет то тень ка кбы должна исчезнуть, но нечего подобного не происходит.
Вот это мы и устраним.
Смерть и Возраждение
Платформа игры имеет риск для жизни, и Lerpz не является исключением. Мы должны гарантировать, что он теряет жизнь, если падает с платформы. Мы также должны вернуть его к жизни - возрадить в безопасном месте на уровне - часто называемый "точкой возрождения" (“respawn point”, "точки респауна"), - так он может продолжить свою "Квест".
Если Lerpz может упасть с платформы,то это также возможно и для других жители уровня, так что они должны быть также рассмотрены соответствующим образом.
Лучшее решение для этой проблемы является использование коллайдер бокса и ловить что-либо, что падает за уровень.
Мы будем делать это очень длинным и широким, что бы игрок при любых раскладах не смог бы его перепрыгдуть даже с джет-паком. Однако, Lerpz'у нужно где-то возраждаться. Но это чуть позже. Во-первых, давайте создадим коллайдер бокс:
-Создаем пустой GameObject.
-Задаем ему имя FalloutCatcher.
-Добавляем компонент Box Collider в него.
-Добавляем Fallout Death скрипт из Component->Third Person Props.
The Fallout Death скрипт
Этот скрипт является коротким, так как он просто делегируетвсе работы ThirdPersonStatus скрипта. (Это должно быть подключена к Lerpz'у, но мы пока не будем делать этого.)
Код для обработки триггера OnTriggerEnter (). Эта функция вызывается один раз, когда в коллайдер бокс попадает гейм-объект, такие как Lerpz или враг.
Есть три теста: Первый для игрока, другой для простого RigidBody объекта , и третий тест, чтобы проверить объект на содержание CharacterController компонента. Второе тест смотрит за всеми пропсами, таких как коробки или ящики которые падают за уровень. (У нас нет таких элементов на этом уровне, но вы можете добавить, если хотите поэкспериментировать.). Третий тест используется для врагов, обычная физика не прилагается.
Если игрок попадает в коллайдер бокс, вызывает функция FalloutDeath() в ThirdPersonStatus скрипте Lerpz'а.
Если объект попадает коллайдер бокс, то мы просто уничтожаем его, и убираем со сцены, в противном случае она будет вечно падать.
По концове мы имеем:
* Функция - Reset () - которая обеспечивает сброс всех настроек для компонента. Эта функция вызывается один раз при добавлении компонента. Она также может быть вызвана в редактор, нажав на значок шестеренки справа от имени какого-либо компонента в инспектор
* @Script директиву, которая добавляет скрипт непосредственно на меню компонентнов Unity. Это удобно и избавляет от необходимости искать его внутри проекта - полезно, если у вас сложный проект с большим количеством ресурсов.
Если мы запустим игру и спрыгнем с платформы, то Unity будет жаловаться на то, что он не знает, где возрадить Lerpz'а. Для этого нужно создать точку респауна..
Точка Возраждение
Когда игрок умирает, то мы должны его где-то возрадить. В этом туториале, Lerpz появится на одной из трех точек респауна. Когда Lerpz затрагивает одну из этих точек, она станет активной, и это будет точкой респауна, если он умрет.
Экземпляр точки респаун называется RespawnPrefab. (Вы найдете его в папкек Project Pane's Props.)
Этот шаблон является моделью телепорта, в сочетании с тремя системами частиц и некоторыми другими мелочами. Вот структура:
* RSBase - сама модель: короткие цилиндрические объекты со светящимся синим кругом в центре.
* RSSpotlight - это объект для внимания, который светит тонким голубым светом с поверхности модели, создавая иллюзию пылания.
* Остальные объекты частиц. Скрипт возрождения крепиться к RespawnPrefab и переключается между этими системами частиц в зависимости от состояния шаблона по:
1)Если точка респауна неактивна, то система частиц создает эффект ярко-синего тумана. Это содержиться в RsParticlesInactive.
2)Если точка респауна активнf, более крупные эффекта свечения. Это содержиться в RsParticlesActive.
Только одна точка респауна может быть активной на уровне в любой момент времени. Когда игрок касается точки респауна, объект коллайдера (устанавливается в качестве триггера) обнаруживает это и вызывает активацию точки респауна.
3)Остальные три системы частиц - SParticlesRepawn1, RSParticlesRepawn2 и RSParticlesRepawn3 - включаются вместе, когда игрок возраждился на точке респауна. Это идиноразовый выстрел частиц. Скрипт востанавливает игру, а затем выставляет RsParticlesActive системе частиц как только это завершено.
Шаблон содержит скрипт возрождения, который контролирует состояние точки респауна. Для того, чтобы игра знала, в какой конкретной точке респауна игрок должен быть возраждеен, когда он умирает, мы должны организовать точки респауна в иерархии главного контроллера. Давайте сделаем это сейчас:
-Перетащите RespawnPrefab на Scene View
-Позиция показана на картинке.
-Переименуйте в Respawn1.
-Повторите это еще 2 раза и давая названия Respawn2 и Respawn3 соответственно.
Следующим шагом делаем GameObject контейнер:
-задаем имя RespawnPoints.
-помещаем все шаблоны точек респауна в RespawnPoints.
Как это работает
Когда сцена загружается, Unity вызывает Start() в каждый экземпляр скрипта возрождения, где инициализируются переменные и ссылки на другие элементы помещаются в кэш.
Ключевым механизмом является статическая переменная:
Код:
Ключевое слово "static" означает, что он является общим для всех экземпляров сценария. Это позволяет отслеживать, какая точка респауна активна. Однако, когда начинается сцена, ни одна из точек не будут активировна, поэтому мы должны установить одну по умолчанию активной для нашей сцены. Инспектор Unity не будет отображать статические типы переменных на всех, поэтому скрипт определяет Initial Respawn параметр, который должен быть установлен для каждого экземпляра.
-Перетаскиваем Respawn1 в слот Initial Respawn итспектора
-Выставляем Initial Respawn в Respawn1 на остальных шаблонах
Примечание: это свойства не возможно установить в оригинальной шаблон.
Когда точка респауна активируется игроком, сробатывает тригер, и прошла точка деактивируется, затем устанавливается currentRespawn, для текущей точки. Функция SetActive () вызывает всплеск системы частиц и звуковые эффекты.
Возраждением персонажа занимается ThirdPersonStatus скрипт, который управляет состоянием игрока в игре.
-Добавляем ThirdPersonStatus скрипт для Lerpz'а. Скрипт находиться в: Scripts->Player->ThirdPersonStatus.
Скрипт точки респауна также обрабатывать звуковые эффекты. Одни играются постоянно, когда стоишь рядом с точкой респауна, другие - единоразово во время активации точки и во время возраждения.
Запускаем и проверяем.