Игра мечты, которую я делаю вместе с женой (Часть 1)

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

Суставы болят не от старости. Боль уйдет, а суставы станут как в 18
7 часов назад
Суставы болят не от старости. Боль уйдет, а суставы станут как в 18
10 часов назад

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

Устройство игровых комнат

Аркада состоит из «коробки» (стены, пол и потолок) и предметов, которые их наполняют. Учитывая, что подавляющее большинство времени игрок будет взаимодействовать с окружением не от первого лица, а в изометрической проекции, необходимо было скрыть часть игрового окружения, чтобы игрок мог видеть себя и беспрепятственно передвигаться по сцене. .

Для стен, пола и потолка это было довольно просто без необходимости писать код. Эта простая и эффективная техника знакома всем, кто моделировал трехмерные объекты.

Я использую совершенно потрясающий ассет под названием UModeler для создания примитивных объектов в игре. Он позволяет создавать 3D-объекты непосредственно внутри Unity без использования какого-либо стороннего программного обеспечения для моделирования, и вы можете редактировать их быстро и весело, более того, вы можете использовать его для изменения любой сетки, ранее созданной в Blender или любом другом редакторе. Отличный инструмент для быстрого и простого прототипирования. Я рекомендую!

Возьмем обычный куб, как на картинке ниже.

Куб созданный при помощи ассета UModeler

Куб, созданный с помощью UModeler Asset

Если мы удалим одну из сторон куба, мы начнем видеть сквозь нее:

Куб без одной из сторон

Куб без одной стороны

Комната представляет собой перевернутый куб, у которого удалены все внешние грани:

Куб без внешних сторон

Куб, у которого нет внешних сторон

Независимо от того, как мы смотрим на куб, мы будем видеть только его внутреннюю часть, а если мы в нем, то он будет казаться нам комнатой:

Куб без внешних сторон

Куб, у которого нет внешних сторон

Так создаются все стены, пол и потолок игровых комнат, а как же остальные игровые объекты? Для них пришлось написать небольшой скрипт, который скрывает и показывает их в зависимости от расположения камеры.

Hide On Rotation

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

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

В качестве примера вот одна из первых сцен игры — коридор.

Для того, чтобы покинуть квартиру, игрок должен среди прочего найти ключи. Свет в комнате выключен, и даже когда вы подойдете к держателю ключей, у вас не будет никаких вариантов взаимодействия с ним, а для этого вам нужно включить свет. Нажимая «Е» или «Q» («ЛБ» и «РБ» на джойстике) можно поворачивать камеру в ту или иную сторону. Давайте сделаем это и познакомимся с окружающей средой.

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

А теперь подробнее о том, как это работает.

Скрипт HideOnRotation

Скрипт HideOnRotation

Чтобы скрыть или показать какой-либо объект в игре, вам нужно добавить этот компонент и указать «Вектор луча» (направление X или Z) и объект, который вы хотите скрыть, и установить параметр «Скрыть сетку». После этого вы можете вращать камеру и наслаждаться.

Проблемы со зрением? Теперь не нужно идти к доктору! Новинка!
9 часов назад
10 часов назад

Функция Check() отвечает за проверку что делать, скрывать или показывать, код приведен ниже.

Вкратце, функция создает радиус в направлении, указанном в «rayVector», затем проверяет, сталкивается ли радиус с объектом на слое «Показ объекта» и вызывает Hide() или Show() в зависимости от этого.

Объект, принадлежащий слою «Показ объектов», представляет собой большую серую пластину (серая на изображении), в которую постоянно направлены лучи (красные на изображении) от каждого объекта, желающего знать, показывать или скрывать. Как показано ниже.

Сцена демонстрирующая работу HideOnRotation

Сцена для демонстрации HideOnRotation

Если в глобальных координатах наш объект выглядит так:

Лицевая сторона объекта

Лицевая сторона объекта «-1» по Z.

То есть его лицевая сторона обращена к «-1» по Z, поэтому, чтобы его скрыть, необходимо указать противоположное направление в «rayVector», т.е. «1». Да, я мог бы убедиться, что передняя часть каждого объекта всегда направлена ​​на «1» через Z, и просто направить луч в противоположном направлении, не указывая точно, но я нашел это решение не очень удобным, так как все это вращение и правильное масштабирование заняли бы гораздо дольше, чем несколько секунд, чтобы вручную определить направление вектора.

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

Используя это решение, я наткнулся на ловушку, из-за которой пришлось дописывать небольшую обертку для HideOnRotation. Забегая вперед, эта ловушка представляет собой комнату в форме буквы «Г», но если вас это интересует, я напишу о ней в следующей части статьи, а сейчас расскажу о первой попавшейся ловушке.

Подводный камень #0

Одна из визуальных особенностей, отличающая игру от многих других воксельных проектов — ортогональная проекция камеры, т.е. изометрическое изображение с трехмерными объектами на сцене, которую я планировал использовать в основной части игры. Для проекта я решил выбрать HDRP (High Definition Render Pipeline), т.е. Unity с поддержкой «высококачественной графики», всеми постэффектами и прочими готовыми вещами, и тут я столкнулся с первой ловушкой.

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

Камера с ортогональной проекцией Камера с перспективной проекцией

Разница в том, что через окно проникает не лучший свет. В Unity за это отвечает компонент Density Volume. По сути, этот компонент позволяет вам настроить локальный туман, который дает хороший эффект светового луча, но вся проблема в том, что он просто не работает с ортогональной проекцией камеры, а в полную силу работает только с перспективной проекцией.

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

Расположение камеры с перспективной проекцией и параметром Field Of View (Поле зрения) равным 10

Позиционирование камеры с видом в перспективе и параметром Field Of View, установленным на 10

В результате имеем практически ортогональное изображение с рабочими объемами и решенной первой ловушкой.

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

Open In New Inspector

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

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

Но теперь это не проблема, просто кликните по нужному объекту в сцене и нажмите «N» на клавиатуре и он откроется в новом инспекторе сразу заблокированной отдельной вкладкой как показано на видео ниже.

Сохраните код в OpenInNewInspector.cs и поместите его в папку Editor внутри вашего проекта, надеюсь, это облегчит вашу работу в Unity.

Заключение

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

Discord

Если вы присоединились к нашему Discord, то обязательно войдите в роль «хабра» 🙂

Качественное удаление волос! Волоски становятся все незаметнее...
7 часов назад
Идеальный макияж без эффекта маски
8 часов назад

Читайте также