Как сделать лужи в unity3d
Работа с освещением в Unity — теория и практика
В течение последних пары лет мне приходилось много работать с “лайтмаппингом” как по работе, так и на своём собственном инди-проекте. Когда у вашей команды мало производственных ресурсов и вы не можете выделить много времени на создание уникальной графики для игровых локаций, освещение становится одним из ключевых факторов, помогающих оживить и разнообразить картинку.
Теория освещения
Отражённый свет
Давайте определимся с терминологией. Освещение в компьютерной графике делится, условно говоря, на две категории:
Global Illumination (GI) представляет из себя наиболее “честный” способ симуляции отражённого света. Из источника света вылетают фотоны — частички, несущие информацию о цвете и яркости света. Ударяясь о какую-либо поверхность, они освещают её, но теряют часть энергии, вследствие чего их цвет и яркость изменяются. Затем фотоны отскакивают и ударяются о следующую поверхность, повторно теряя часть энергии. Так происходит несколько раз в зависимости от настроек рендерера.
Final Gather (FG) раскидывает по сцене точки, — final gather points, — из которых в разные стороны вылетают лучи. После столкновения с какой-либо поверхностью, лучи возвращают в родительскую точку информацию о цвете и его яркости. Представьте себе такую картину: вечер, солнце почти зашло за горизонт; становится темно, но небольшая часть комнаты ещё залита оранжевым закатным светом. Находящаяся на полу final gather point отправляет в разные стороны несколько лучей, некоторые из них дотягиваются до освещённой части комнаты и с этой информацией возвращаются в исходную точку, тем самым слегка освещая пол «отражённым» оранжевым светом. Это не такой “честный” способ, как GI, но он производит хороший результат, и им часто пользуются, чтобы заполнять сцены красивым мягким освещением.
Для следующей картинки я выкрутил параметры отражённого света до безумных значений, таким образом вы можете наглядно увидеть, как частички света отскакивают от объектов.
Ambient Occlusion
Кроме отражённого света, нам интересен так называемый Ambient Occlusion (AO). Это эффект затенения в углах, трещинах, узких проёмах. Представьте, что луч света залетает в угол комнаты, он несколько раз отражается от обеих стен, постепенно затухая. Чем дальше в угол, тем меньше света туда доходит.
Как правило, Ambient Occlusion используется, чтобы художественно подчеркнуть эффект затенения, — в реальности лучи света не теряют энергию столь быстро, чтобы в углах комнаты сгущалась такая же тьма, как показывают нам в играх. Если вы рендерите физически корректное освещение, ваш движок сам высчитывает скорость потери энергии лучом света, и вам не нужно отдельно рендерить карту (текстуру) Ambient Occlusion. Но вы можете это сделать, если потребуется для реализации художественного замысла.
Текстурные атласы
Следующим термином, который вам следует следует знать, является текстурный атлас. Грубо говоря, это одна большая текстура, в которой содержатся несколько маленьких текстурок. Чаще всего текстурные атласы создаются для экономии вычислительных ресурсов. Приведу крайне упрощённый пример, — спецы, спрячьте факелы и вилы! Пусть у вас в игре есть таверна, в которой 20 деревянных предметов (столы, стулья, ложки. ), у каждого своя текстура. В итоге CPU будет 20 раз обращаться к GPU, требуя отрендерить каждый объект по отдельности. Если мы назначим всем деревянным объектам один материал, обращающийся к одному текстурному атласу, в который зашиты все 20 текстур, то GPU сможет отрендерить 20 объектов за один вызов (он же — draw call, в конце статьи предоставлю интересные ссылки по этой теме).
В случае с “лайтмаппингом”, для каждого объекта создаётся дополнительная маленькая текстурка, в которой “запекается” информация об освещении. Затем много-много маленьких текстурок разных объектов размещаются в крупных текстурных атласах. Как и в случае с деревянной мебелью, мы также получаем прирост производительности.
Работа с Unity
Общая информация
Но вернёмся к “лайтмаппингу” в самом Unity. Прежде всего запаситесь терпением и, по возможности, мощным компьютером. Процесс рендера имеет свойство полностью занимать процессор и оперативную память, поэтому я включаю его перед тем, как ухожу на работу или иду спать. Таким образом, я возвращаюсь к компьютеру как раз в тот момент, когда рендер уже завершён.
Забегая вперёд, предупрежу, что Unity кэширует промежуточные результаты вычислений освещения. Если вы увидите, что на системном диске у вас пропало 10 гигабайт места — это оно. Чтобы настроить кэш надо зайти в: Edit — Preferences — GI Cache. Здесь вы можете указать, куда он сохраняется и его максимальный размер. Можно убрать компрессию, “весить” будет больше, но работать пошустрее. Тут же вы можете почистить кэш, но имейте ввиду, что если у вас открыта сцена с готовым “лайтмапом”, то он тоже будет удалён, будьте внимательны.
В Unity доступно 5 типов источников света:
Параметры источников света
Хочу обратить внимание на насколько ключевых настроек источников света (доступные настройки различаются в зависимости от типа источника света):
Настройка освещения сцены
Окно настроек освещения сцены вызывается через Window — Lighting, и состоит из трёх вкладок: Object, Scene, Lightmaps. Для запуска рендера освещения используется кнопка Build в самом низу окна. Там же есть галочка Auto, которая автоматически запускает рендер каждый раз, когда вы вносите изменения в сцену; используйте её, если у вас мощный компьютер. Ещё ниже находится информация о количестве и размере “лайтмапов”, появится по завершению процесса “лайтмаппинга”.
Раздел — Object
В Object отображаются настройки конкретного объекта. Если вы выделите элемент окружения на вашей сцене, то здесь увидите ряд настроек и параметров. При условии, что объект является статичным, будет стоять галочка на чекбоксе Lightmap Static. Чаще всего вы будете использовать здесь поле Scale in Lightmap. Как я говорил ранее, для каждого объекта освещение “запекается” в отдельную маленькую текстурку, которая потом размещается в крупном “лайтмап”-атласе. Параметром Scale in Lightmap вы можете регулировать, сколько места будет занимать эта текстурка. Разумеется, чем меньше места ей выделяется, тем хуже будет качество “запечённого” в неё освещения. По умолчанию здесь стоит “1”, но если вы знаете, что объект будет редко попадать в поле зрения или он расположен далеко на фоне, вы можете смело уменьшить этот параметр вплоть до 0.1 или даже меньше.
Раздел — Scene
В Scene расположены ключевые настройки рендера освещения. Я рассказываю основы работы со светом, а также делюсь опытом “лайтмаппинга” конкретно под мобильные платформы, поэтому умышленно пропускаю такие вещи, как realtime GI или использование HDR-текстуры в качестве источника света.
В Ambient Source вы настраиваете заполняющий источник света Ambient Light, который я уже упоминал. Вам предлагается выбрать между небом-текстурой, небом из единственного цвета, а также созданным на основе цветового градиента небом. Я предпочитаю выбирать Gradient. Он позволяет настроить три цвета — купол неба, экватор и землю, что создаст для вашей сцены достаточно сложный и интересный заполняющий свет. Ambient Intensity указывает яркость этого света. В зависимости от художественного замысла, вы можете иметь даже очень светлую сцену, освещённую посредством одного Ambient Light.
Во вкладке Baked GI находятся основные настройки качества освещения, как прямого, так и отражённого, включая и GI, и FG.
Прежде чем углубимся в эти настройки, хочу дать один совет. Всегда имейте ввиду, что размещая на сцене источники света, настраивая тени и Ambient Light, после рендера “лайтмапа” вы получите совершенно иную картинку, только отдалённо напоминающую то, что вы делали. Поэтому я рекомендую работать итерациями: вы выставляете минимальное качество освещения, чтобы рендер происходил быстро, смотрите на результат рендера, после чего вносите правки и запускаете повторный рендер. Когда вы более-менее довольны результатом, можно повысить качество рендера и включить Final Gather. Это займёт длительное время, поэтому есть смысл включать такой рендер перед тем, как вы отходите от компьютера на сравнительно долгий отрезок времени.
Настройки во вкладке Baked GI оперируют такой единицей, как texel. Если говорить упрощённо, тексель — это пиксель, но не на экране, а в текстурном пространстве трёхмерной модели. Но не забивайте голову, — трудно сказать, как Unity оперирует текселями и как они зависят от масштаба объектов, поэтому просто-напросто двигайтесь эксперементальным путём. Например, для своей мобильной RPG я делаю финальный рандер с Baked Resolution выставленным в 25.
Тексель (сокращение от англ. Texture element) — минимальная единица текстуры трёхмерного объекта. Пиксель текстуры.
Проще всего объяснить значение термина «тексель» на примере трёхмерных игр. Если подойти вплотную к стене в какой-нибудь старой 3D-игре — (Wolfenstein или Duke Nukem), то можно наблюдать, как текстура стены распадается на однотонные квадраты, которые увеличиваются при приближении и собираются обратно в осмысленный рисунок при отдалении. Эти квадраты и называются текселями, и чем крупнее исходный рисунок текстуры, тем меньше становятся тексели. Для идеального отображения текстуры количество текселей должно совпадать с количеством пикселей на мониторе, но практически все движки разрешают зрителю приблизиться к стене ближе чем того разрешает детальность.
Ниже я расскажу про каждый параметр отдельно, но перед этим вам нужно знать ещё кое-что. Если вы запустите в Unity рендер освещения, то справа снизу будет написано, чем именно движок занят в текущий момент. В самом конце процесса рендера там будет написано Compositing.
Дело в том, что “лайтмап” генерируется послойно. Во время рендера создаются несколько отдельных текстур. Мне неизвестно, какие именно карты делает Unity, но среди них есть либо все, либо часть из списка: Diffuse (прямой свет), GI (Global Illumination), FG (Final Gather), AO (Ambient Occlusion) и другие. После этого движок берёт эти карты и сливает друг с другом. Например, в основе может лежать слой Diffuse, над ним кладётся слой FG в режиме смешивания Lighten (прямо как в Photoshop’е), а повыше кладётся слой AO в режиме Multiply… В итоге эти слои сливаются в одну картинку и на выходе получается финальный “лайтмап”.
Вкладка — Baked GI
Вкладка — General GI
Давайте пройдёмся по интересующим нас настройкам во вкладке General GI:
Вкладка — Fog
И, наконец, туман! Fog, то бишь. К рендеру освещения он не имеет никакого отношения, может включаться и выключаться в любое время. Тут всё предельно просто, поэтому берите и экспериментируйте. Скажу лишь, что туман является крайне мощным художественным средством. Вы можете радикально изменять атмосферу сцены посредством тумана, благодаря ему солнечная сцена станет ярче, мрачная — мрачнее.
Кроме того, туман может использоваться как инструмент повышения производительности. Например, вы хотите вдалеке выключить у всех объектов текстуры и скрыть их за туманом. В более старых версиях World of Warcraft, если вы играли, вы не могли не заметить, какой густой там был туман.
Раздел — Lightmaps
Третьим разделом является Lightmaps, где будут расположены отрендеренные “лайтмапы”. Причем если атласов много, в верхней части вкладки вы не сможете увидеть все атласы, скролл в том окошке неактивен. Поэтому смотрим в нижнее и прокручиваем колесиком мышки.
Здесь нам важно увидеть насколько заполнен последний, самый нижний “лайтмап”-атлас. Если он почти пуст, то либо увеличиваем качество “лайтмапа”, чтобы заполнить весь атлас, либо уменьшаем, чтобы атлас оказался пустым и был удален. На картинке ниже изображены два хорошо заполненных атласа, а один — постольку-поскольку.
“Лайтмапы” хранятся в файлах EXR с глубиной в 32 бита.
Light Probes
Ещё я обещал рассказать про Light Probes. Они представляют из себя небольшие сферы, вбирающие в себя информацию об освещении окружающего пространства. Когда таких сфер много, они создают своебразную карту освещённости вашего уровня или локации. Затем они используются для освещения динамических объектов, в которые не “запекается” свет.
Чтобы лучше понять их смысл, дам пример. На вашей сцене находится один Point Light, у которого стоят настройки Baked, то есть он используется для “запечения” света. Вы не делаете его Real-time, потому что это дорого в плане производительности, причём многие мобильные устройства вообще не поддерживают такой источник света. Далее вы “лайтмапите” сцену и видите, что ваш Point Light освещает окружение. Но если вы возьмёте монстра и поставите рядом с источником света, он останется тёмным, потому что принадлежит к классу динамических объектов, а ваш Point Light влияет только на статические.
Теперь вы расставляете вокруг источника света сетку из Light Probes, снова запекаете освещение. И теперь ваш монстр может ходить вокруг Point Light’а и освещаться им! Это крайне эффективный и недорогой способ имитации освещения. Чтобы добавить “пробы” на сцену, заходите в Game Object — Light — Light Probe Group. На сцене появится кубик из четырёх сфер. Для выбора отдельных сфер, используйте ctrl + click. В Inspector появятся несколько кнопок, позволяющие добавлять или удалять сферы. Вы также можете использовать комбинацию ctrl + D для дублирования сфер.
Расставляйте Light Probes аккуратно, размещайте их там, где вы хотите, чтобы они вбирали в себя информацию об освещении, чтобы потом передавать её динамическим объектам. Во избежание графических артефактов и мерцающего света, следите за тем, чтобы Light Probes образовывали ровную, красивую сетку.
Ниже скриншот корректно выставленной сетки. Если приглядеться, можно заметить, что Light Probes выставлены не в случайном порядке, а окружают источники света, стремясь эффективно поймать переход от света к тени и обратно.
Заключение
Напоследок хочу дать совет по созданию моделей окружения под “лайтмаппинг”. Создавая контент для игры, я знал, с какой стороны будет смотреть игровая камера, поэтому ради сомнительной оптимизации удалял задние стенки некоторых объектов. В то время у меня был опыт рендера “лайтмапов”, но только в Maya, а не в Unity. Выяснилось, что при рендере освещения в Unity возле объектов, имеющих дыры, то есть удалённые полигоны, появляются жесткие, хорошо заметные артефакты. Имейте ввиду.
Введение в новую систему тайловых карт Unity
Знакомство с систему двухмерных тайловых карт Unity даёт отличную возможность экономии времени инди-разработчиков и игровых студий на прототипирование и создание качественных 2D-игр.
Без этой системы можно потратить дни, если не недели на написание собственной системы тайловых карт или переработку чужой. И это только программирование, а как насчёт редактора тайловых карт?
Новая система бесплатна и встроена непосредственно в редактор Unity. Она предоставляет множество возможностей, которые мы рассмотрим в этом туториале.
В этой статье мы воспользуемся простой тайловой 2D-игрой, чтобы узнать следующее:
Примечание: в этом туториале подразумевается, что вы хорошо умеете работать в редакторе Unity. Если вы считаете, что недостаточно в нём освоились, то в туториале Introduction to Unity есть всё необходимое для изучения этого туториала. Кроме того, вам необходима версия Unity 2017.3 или выше.
Что такое тайловая игра?
Тайловая 2D-игра — это любая игра, в которой уровни или игровые области состоят из множества небольших плиток (тайлов), вместе образующих сетку тайлов. Иногда различия между тайлами могут быть очевидными, а иногда они кажутся игрокам сплошными и неразличимыми.
Коллекция имеющихся в игре тайлов называется «тайлсетом», и каждый тайл обычно является спрайтом, частью листа спрайтов (spritesheet). Если вы хотите лучше разобраться с листами спрайтов, то у нас есть туториал, в котором описываются листы спрайтов Unity.
Как можно увидеть в этом туториале, обычно тайлы являются квадратами. Но они могут принимать и другую форму — прямоугольники, параллелограммы или шестигранники. В играх обычно используется вид сверху или сбоку, но иногда в тайловых играх применяется и 2.5D.
Возможно, вам уже известны две самые популярные игры, в которых используется система тайловых карт: Starbound и Terraria.
Приступаем к работе
Запустите редактор Unity и загрузите проект Rayzor-starter из распакованных материалов проекта.
Вот, с чем вы будете работать в этом проекте:
Создание игры
Откройте сцену Game из папки Scenes.
Нажмите на кнопку Play в редакторе, чтобы запустить игру. В окне Game перемещайте героя клавишами WASD или «стрелками».
Пока герой бродит по кажущемуся бесконечным фону камеры с цветом #00000, потерявшись в пустоте.
Чтобы исправить это, нам потребуются инструменты 2D-тайлов для построения интересных уровней и механик игры.
Знакомимся с палитрой тайлов
Это окно станет вашим лучшим другом при работе над тайловыми играми в Unity.
Нажмите на Create и выберите сохранение новой палитры в папке Assets\Palettes проекта. В ней создайте новую папку RoguelikeCave.
Теперь структура папок вашего проекта должна выглядеть так:
В окне редактора Tile palette должна быть выбрана RoguelikeCave; на этом этапе у нас всё ещё нет никаких тайлов:
Как художник может творить свои шедевры, если у него нет материалов?
Не закрывая окно Tile Palette, выберите папку проекта Sprites/roguelike-cave-pack и разверните ассет roguelikeDungeon transparent.png. Затем выделите все спрайты в этом листе спрайтов: выберите первый спрайт, зажмите shift и выберите последний спрайт.
Перетащите все выбранные спрайты в окно Tile Palette RoguelikeCave:
Перетащив спрайты в окно Tile Palette, выберите в Unity место для хранения ассетов.
Создайте в Assets/Palettes/RoguelikeCave новую папку Tiles и выберите эту папку в качестве места хранения:
Unity сгенерирует тайловый ассет для каждого спрайта, добавленного из листа спрайтов. Дождитесь завершения процесса, затем увеличьте размер окна Tile Palette и полюбуйтесь на ровные ряды красивых новых тайлов, расположившихся в палитре RoguelikeCave:
Повторите описанный выше процесс для создания палитры тайлов с помощью окна Tile Palette, но на этот раз назовите новую палитру RoguelikeCustom.
Поместите новую палитру в новую папку. Назовите папку RoguelikeCustom и переместите её в папку Assets/Palettes проекта.
На этот раз, воспользовавшись описанным выше процессом, используйте спрайты из листа Assets/Sprites/roguelike-custom/roguelike-normal-cutdown-sheet.png для заполнения тайлами новой палитры. Создайте внутри папки палитры RoguelikeCustom папку Tiles и переместите ассеты тайлов туда:
Порадуйтесь за себя, теперь вам известна магия создания тайловой палитры!
Создание сетки карты тайлов
Откройте меню GameObject в верхней части редактора Unity (или панель меню Unity, если вы работаете под MacOS), нажмите на 2D Object, а затем Tilemap, чтобы создать новую сетку Tilemap:
Вы должны увидеть, что в иерархию сцены добавился новый GameObject Grid. Разверните его и выберите встроенный GameObject Tilemap.
Воспринимайте этот объект Tilemap как слой (возможно, один из многих) вашей игры. Можно добавить новые объекты для создания дополнительных слоёв Tilemap.
В инспекторе вы увидите два компонента, которые Unity автоматически добавила к этому GameObject:
Использование различных инструментов рисования палитры тайлов
Переключитесь в редакторе на режим Scene.
Не закрывая окно Tile Palette, выберите палитру RoguelikeCave, а затем выберите инструмент brush (или нажмите B). Выберите тайл песка, как показано ниже:
В окне Scene переместите курсор на сетку рядом с игроком. Кисть с тайлом песка будет привязываться к сетке.
Зажав и удерживая левую клавишу мыши, нарисуйте вокруг игрока прямоугольную область. Она будет отрисована на слое Tilemap BaseLayer:
Рисование больших областей может оказаться монотонным занятием, поэтому существует кисть Filled Box, которую можно использовать для закрашивания крупных площадей. В окне Tile Palette нажмите на квадратный значок кисти (или нажмите U).
Вернитесь в редактор и нарисуйте вокруг игрока прямоугольник ещё большего размера, нажав и удерживая левую клавишу мыши, перетаскивая курсор из верхнего левого в нижний праый угол:
Хотя мы добавили в игру немного цвета, это песчаное подземелье выглядит уныло. Настало время добавить немного деталей!
В окне Tile Palette переключите Active Tilemap на слой DungeonFloorDecoration:
Выберите инструмент brush (B), затем нарисуйте в окне Scene разбросанные на карте объекты:
Отключите, а затем снова включите в иерархии GameObject DungeonFloorDecoration, чтобы увидеть, как отрисовка на активном Tilemap изменяет слой DungeonFloorDecoration, а все отрисованные тайлы попадают на этот новый слой:
Переключите Active Tilemap в окне Tile Palette на Collideable. Выберите инструмент brush (B), а затем нарисуйте следующие тайлы, чтобы построить вокруг игровой области стену. Выделенные красным зоны на изображении ниже — это новые части, которые нужно добавить:
Посмотрите на показанный ниже скриншот окна Tile Palette, чтобы разобраться, где найти тайлы, необходимые для постройки стены. Не забывайте, что можно использовать сочетания CTRL-Z или CMD-Z для отмены действия или стирать ошибки с помощью текущей кисти (удерживая Shift):
Запустите игру в редакторе и попытайтесь пройти сквозь стену:
Вы ведь не этого ожидали?
Проблема в том, что мы просто нарисовали стандартные тайлы и пока не применяли к слою Tilemap волшебную физику Unity.
Выберите GameObject Collideable и добавьте новый компонент, нажав кнопку Add Component в окне Inspector; в поле поиска введите Tilemap Collider 2D:
Этот компонент был создан специально для тайловых 2D-игр на Unity. Он просто применяет форму физического коллайдера ко всем тайлам слоя, к которому он был добавлен, не выполняя никакой другой работы.
Снова запустите игру и попробуйте пройти сквозь стену. Доступ запрещён!
Примечание: иногда при движении камеры можно заметить между некоторыми тайлами небольшие чёрные линии. Похоже, что это проблема движения камеры в проектах с системой 2D Tilemap Unity. От неё можно почти полностью избавиться, отключив Anti-Aliasing в параметрах графики. Однако даже если это сделать в проекте-заготовке, эффект всё равно слегка заметен. Решением этой проблемы может стать добавление собственного скрипта движения камеры с пиксельным смещением. Хорошее обсуждение этой проблемы можно найти здесь.
Коллизии работают хорошо, и вы можете подумать, что этого достаточно. Но пока коллайдеры не оптимизированы эффективно. В режиме Scene приблизьте часть стены и посмотрите на контуры коллайдеров:
Вокруг каждого тайла есть коллайдер. Средним секциям стен не нужны эти дополнительные коллайдеры.
Выбрав GameObject Collideable, добавьте к нему компонент Composite Collider 2D. Это также автоматически добавит RigidBody2D.
Задайте параметру BodyType RigidBody2D значение Static, а затем поставьте флажок Used by Composite в компоненте Tilemap Collider 2D:
После этого вы заметите, что эти ненужные квадратные коллайдеры посередине стен исчезнут.
Завершите создание стен, достроив их вверх и замкнув наверху, высотой примерно в 16 тайлов. Не забывайте. что в качестве Active Tilemap окна Tile Palette должен быть выбран Collideable:
Участок подземелья не будет представлять никакой сложности для нашего героя без препятствий. Теперь мы начнём работу над созданием комнаты смерти, дополненной красивыми древними мраморными коридорами. После преодоления всех этих препятствий игрока ждёт награда — гора золота.
Для отрисовки этих коридоров мы воспользуемся специальной тайловой кистью Rule Tile. Как вы видели в начале туториала, в проект уже добавлены дополнительные тайловые скрипты из Github-репозитория Unity 2D Extras. Одним из них является Rule Tile.
Rule Tile позволяет нам задавать правила о том, какие тайлы нужно отрисовывать в зависимости от соседних располагаемых нами тайлов.
Воспользовавшись инструментом box fill brush (B) в окне Tile Palette и выбрав слой Tilemap BaseLayer, нарисуйте прямую секцию мраморной стены. Нужно, чтобы она закрывала всё пока свободное пространство пола.
Можно заметить, что когда мы будем это делать, слой будет закрывать тайлы стен с колладерами, потому что пока не задан порядок слоёв. Это легко исправить, выбрав GameObject Collideable и изменив Order in Layer компонента Tilemap Renderer на более высокое значение (достаточно будет 5):
Вернитесь в папку Prefabs проекта, откройте окно Tile и выберите палитру RoguelikeCave, а затем перетащите MarbleFloorRuleTile в пустое место на палитре:
Воспользуйтесь box fill brush и нарисуйте в комнате несколько секций мраморного пола:
Заметьте, что настроенный тайл правил, полностью окружённый со всех углов и граней, становится украшенным тайлом (спрайтом, выбранным в редакторе Tiling Rules).
Это ловушка!
Нет, мы не будем добавлять в игру в качестве персонажа адмирала Акбара. Мы создадим тайловую кисть префаба ловушки, которой воспользуемся для отрисовки ловушек, стреляющих вращающимися лезвиями!
Создайте в иерархии новый пустой GameObject и назовите его ShootingTrap. Создайте в ShootingTrap пустой дочерний GameObject. Назовите его Sprite:
Выберите Sprite и добавьте к нему компонент Sprite Renderer. Задайте Sorting Layer значение Player, а Order in Layer значение 1, чтобы он рендерился поверх остальных слоёв. Выберите поле Sprite, а в качестве спрайта поставьте roguelikeDungeon_transparent_180.
Теперь поверните Transform объекта Sprite на -90 по оси Z:
Далее вернитесь к GameObject ShootingTrap и добавьте с помощью инспектора новый компонент. В поле поиска найдите Shooting Trap и прикрепите этот скрипт.
Этот скрипт добавлен в скачанные вами файлы проекта; по сути, он каждые две секунды запускает корутину, создающую экземпляр префаба вращающегося лезвия пилы (или любого другого префаба) в текущей позиции ловушки.
Задайте параметру Item to Shoot Prefab компонента Shooting Trap значение Projectile (префаб находится в /Assets/Prefabs):
Снова запустите игру в редакторе и воспользуйтесь режимом Scene, чтобы найти ловушку. Она работает!
Перетащите копию ShootingTrap из иерархии в папку /Assets/Prefabs проекта, чтобы создать префаб. Удалите ShootingTrap из иерархии.
Мы используем ещё один скрипт тайловой кисти под названием PrefabBrush для создания кисти, способной рисовать префабы на слоях Tilemap.
Воспользуйтесь инспектором, чтобы задать параметру Prefabs Size PrefabBrush значение 1, а параметру Element 0 — значение ShootingTrap.
Создайте в Grid новый слой Tilemap под названием Traps и откройте окно Tile Palette.
Выберите обычную тайловую кисть (B) и воспользуйтесь раскрывающимся меню в нижней части окна Tile Palette для выбора PrefabBrush. Выберите в качестве слоя Active Tilemap Traps и используйте окно Scene для отрисовки нескольких префабов ловушек вдоль левой границы комнаты.
Разверните в иерархии GameObject Traps и поэкспериментируйте со значением Shoot Start Delay для каждого value on each Gameobject ShootingTrap с помощью скрипта Shooting Trap в инспекторе. Добавляйте к значению каждой ловушки по 0.25, т.е.:
Конечная цель
Цель этого мини-подземелья заключается в получении груды золота. Слава и богатство ждут тех, кто доберётся до неё, избежав смертельно опасных летающих лезвий.
Создайте в GameObject Grid новый слой Tilemap под названием Goal. Выберите Goal и измените значение Tilemap Renderer Order in Layer на 2:
Не закрывая окно Tile Palette, убедитесь, что всё ещё выбрана PrefabBrush. Сделайте так, чтобы Element 0 ссылался на заготовку Goal из папки /Assets/Prefabs проекта.
Воспользуйтесь стандартной тайловой кистью для отрисовки одного тайла-префаба цели в верхней части комнаты за ловушками:
Последние штрихи
Сейчас подземелье слишком светлое и свободное. Мы можем добавить ему стиля, переключившись на материал 2D-спрайта, способный реагировать на свет.
Выберите Sprite объектов Player, Goal и ShootingTrap, и сделайте так, чтобы Material компонента Sprite Renderer использовал SpriteLightingMaterial:
Это материал с прикреплённым к нему шейдером Sprite/Diffuse. Он позволяет освещению сцены воздействовать на спрайты.
В GameObject Grid выберите объекты BaseLayer, DungeonFloorDecoration, Collideable и Goal, а потом воспользуйтесь инспектором, чтобы тоже использовать в материале Tilemap Renderer Material SpriteLightingMaterial.
Затем выберите в GameObject Lights Directional light и снизьте значение Intensity Light до 0.3.
Также вы сейчас заметите, что Player носит с собой Point light, то есть светящий вокруг него Lantern.
Теперь, когда спрайты в сцене используют подходящий материал, освещение Unity влияет на все окружающие его спрайты.
Перетащите две копии префаба FlickerLight из папки /Assets/Prefabs проекта в Scene и разместите их в GameObject Lights.
Задайте первому префабу позицию (X:-11.25, Y:4, Z:-1.35), а второму — (X:2.75, Y:4, Z:-1.35).
Создайте новый слой Tilemap под названием WallsAndObjects и задайте в инспекторе Tilemap Renderer Order in Layer значение 15. Не забудьте, чтобы Material тоже использовал материал SpriteLightingMaterial.
Переключите кисть палитры тайлов обратно на Default Brush, а Active Tilemap на WallsAndObjects.
Воспользуйтесь инструментом brush (B) для отрисовки двух тайлов «света фонарей» под каждым из новых FlickerLight, которые мы разместили по углам начальной области:
Время трудностей
Посмотрим, сможем ли мы ещё больше улучшить подземелье. Используйте слой Tilemap WallsAndObjects для создания книжных шкафов в верхней части комнаты подземелья с помощью другой палитры тайлов под названием RoguelikeCustom. Также нарисуйте одну-две части стены с трещинами.
Вернитесь обратно в слой Tilemap DungeonFloorDecoration и добавьте ещё немного деталей на мраморный пол, например, трещины на нескольких тайлах:
Поздравляю, вы завершили свой первый мини-уровень подземелья! В результате у вас должно получиться нечто подобное:
Куда двигаться дальше?
Если вы пропустили какой-то шаг, то можете посмотреть на готовый результат этого туториала, открыв проект Unity Rayzor-final из скачиваемых материалов.
В этом туториале мы научились многому, но как и в любом другом деле, всегда есть что-то ещё!
Существуют интересные скрипты тайловых кистей, не рассмотренные в этом туториале. Прочитайте о них здесь и подумайте, сможете ли вы воспользоваться ими.
Также можете изучить создание анимированных тайлов здесь.