Как сделать пещеру в юнити

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

Посоветуйте, пожалуйста, как грамотно создать и склеить разные части мира в движке Unity 3D/
Задача: создать большой игровой мир с разными типами ландшафтов.
Хотелось бы понять как можно более подробно как это делается (прям чтоб как для совсем новичка понятно было).

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

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

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

4.Есть ли смысл создавать одну большую текстуру на "остров" или же это совсем тупой вариант
и она обязательно должна собираться сама из тучи мелких "бесшовных"текстур.

Заранее спасибо за ответы!

Harpy91
В юнити все уже есть.

>>1, 2
Создаешь большой террайн. Юнити самоего режет на куски и делает лоды. Проверить можешь, если включишь показ сетки - на дальнем расстоянии детализация уменьшается.
А теперь ложка дегтя - огромный мир сделать не получится - float точности не хватит. Это проблема движка, легких решений нет.

>> 3
А сам как думаешь? Каждая лишняя модель - это лишний DIP. Можно конечно все эти камни забатчить, но тут тоже вроде как были проблемы с максимальным числом вершин.

>> 4
Это зовется мегатекстурой. Имхо - ненужная хрень. Rage это показал. А если серьезно - в юнити и ее сделали, в версии 4,5. Но пока непонятно как оно работает (я не ставил еще новую версию юнити, жду 4.6)
Но вариант с тучей бесшовных текстур все же лучше - экономнее по занимаемой памяти

war_zes
> А сам как думаешь? Каждая лишняя модель - это лишний DIP.

- Но ведь можно сделать, чтобы эти объекты как и дома грузились только когда игрок находится в поле их видимости? Так же как здания и все прочие модели.
Это тоже Юнька сама делает?


war_zes
> Это зовется мегатекстурой. Имхо - ненужная хрень.
- А скай-бокс не является этой мегатекстурой?

war_zes
> Создаешь большой террайн. Юнити самоего режет на куски и делает лоды.
- А с большими текстурами на несколько лодов он так же поступает? не знаешь?

war_zes
> огромный мир сделать не получится - float точности не хватит.
- Можно об этом подробнее? Разве не было игр на Unity 3D с достаточно большим "открытым" миром?

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

Подгрузку - выгрузку сегментов и их расположение в мире придется делать самому.

Slush Games
> Из минусов - сложно подгонять стыки

Если куски большие, их можно разделять естественными (и не очень) преградами: реками, болотами, морями наконец. Верно?
Главное чтобы они грузились без косяков, то есть чтобы стоя на острове не далеко от суши игрок не видел огромную пропасть, вместо материка)
Или серую массу без текстур.

Harpy91
> - Но ведь можно сделать, чтобы эти объекты как и дома грузились только когда
> игрок находится в поле их видимости? Так же как здания и все прочие модели.
> Это тоже Юнька сама делает?
Конечно же - это же обычная проверка по фрустуму, если бы ее не было в юнити - юнити вообще был бы убожеством:)
А еще в про версии есть oclusion culling (обычно если объект закрыт например стеной, он все равно рисуется, а OC позволяет не рисовать его), но он требует телодвижений по настройке. А в асетах есть аналоги, например я юзал InstantOC

Harpy91
> - А скай-бокс не является этой мегатекстурой?
Нет конечно же. Это шесть самых обычных текстур.

Harpy91
> - А с большими текстурами на несколько лодов он так же поступает? не знаешь?
Не понял вопроса.

Harpy91
> - Можно об этом подробнее? Разве не было игр на Unity 3D с достаточно большим
> "открытым" миром?
Юнити так и не научили юзать двойную точность. Из-за чего максимально допустимая позиция - 100000 (можешь сам проверить - создай камеру, и напиши ей позицию 100001 - получишь предупреждение, и если будешь его игнорировать - оно все будет бажить и тупить). Но с другой стороны - этого может и хватить для мира, особенно если за метр взять не 1 флоат, а например 0.01. Но вот для авиасимулятора может и не хватить, тогда придется самому извращаться с системой координат (то есть заводить еще один счетчик, но все равно это не особо спасет - непонятно как рисовать)

Slush Games
> На самом деле можно хранить несколько terrain в сцене.
Нет смысла. Базовый терайн все это сам умеет, зачем велосипедить? А проблему размера флоатов это не решит. Собственно сейчас проверил, несмотря на то что GameObject можно поставить максимально в 100000, ландшафт в 200000 - вполне нормально работает, и даже систему не грузит. Вообщем у них неплохой ландшафт

"Куски мира" загоняются в индексированные префабы, и грузятся по 9 шт.

ЗЫ
Написать сшивалку можно и самому, если охота - просто крайние вершины массивов высот разных ландшафтов выравнивать.
Можно эту проблему решить руками в фотошопе, подогнав катры высот, но это гиморно.

ЗЗЫ
Большой ландшафт редактировать не очень удобно - тормозит, и текстурных проходов до фига, если несколько разных типов ландшафтов.
Особенно, если захочется использовать triplanar mapping - ландшафт может скушать ощутимую часть бюджета производительности.
Да и секторами можно постепенно наполнять игру.

У нас реализована огромная карта 81 км в квадрате.
64 терраина, каждый по 1 км с копейками.
В сцену подгружаем 9 терраинов и выгружаем по мере передвижения игрока.

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

Но если пошевелить извилинами, можно найти решения, как все это дело редактировать ;)

Sergey Tenditniy про используемые им методы создания своих выдающихся модульных игровых окружений в Unity.

Перевод статьи с портала 80 level


Добрый день, меня зовут Сергей, я родом из Украины, но последние 3 года живу в красивой стране Словении.

Идея


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

Именно тогда меня посетила идея сделать что-то подобное в виртуальной среде, ведь если люди с удовольствием посещают такие места в реальности, то и виртуальное путешествие будет кому- то интересно.

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


Также мне было интересно попытаться создать что-то в новом для меня стиле, так как ранее я создавал более реалистичные модели. Хотелось понять, что я смогу сделать, работая в стиле мультфильма.


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

Основные фото–референсы, сделанные мной во Франции:


Моделинг

Первые скриншоты по ходу этапов работы:


Основные этапы рабочего процесса:

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

2. Далее я добавил имеющимся домикам больше деталей и создал несколько новых.

3. Мной были выбраны два домика и церковь для экспериментирования с сочетанием цветов, важно было понять то, как они будут выглядеть по завершению работы. Была добавлена временная зеленая растительность.

4. Добавлен окончательный набор растительности. Проведена чистовая проработка детализации домиков. Настроено освещение и пост-процессинг. Уже практически готов финальный вид части моего городка. Это послужило мне стилевым и цветовым референсом при проработке остальных улиц и ассетов.

Для этого проекта я решил создать часть домиков на основе одного меша, не используя модульности их структуры. А вторую часть домиков я сделал полностью модульными, чтобы их можно было сложить из отдельных составных частей. Такой подход нужен был из-за того, что я выставил этот городок на продажу, и хотелось чтобы, покупатели имели выбор – пользоваться уже готовыми моделями или собрать их из модульных составных частей (двери, окна, стены и т.п.)


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

На рисунке вы видите, как он выглядит, и из каких элементов собран:


Все элементы:



Поликаунт:



Создаем ассеты

Этот процесс одновременно прост и сложен. Но это важнейшая часть нашей работы. Основная задача – найти как можно больше референсов, всегда легче воссоздать что-либо уже существующее в реальном мире, просто используйте свое воображение и креативность и соберите всё воедино.


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

Растительность


Растительность создавалась очень просто. Ничего нового:

1. Первым делом я создал высокополигональный лист.

2. Использовал запекание нормалей и прозрачность.

3. Затем немного изменил его и с помощью клонирования создал всю ветку.

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

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


Для оптимизации всем листьям можно задать одинаковую текстуру. Нужно обеспечить разнообразие цветов использованием vertex color для листьев, сделать их немного более красными или желтыми.

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


Текстурирование

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

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

Эти 5 текстур использованы на 95% поверхности того, что вы перед собой видите. Также я использовал текстуры в градациях серого для возможности добавления цвета с использованием vertex color в Unity, всё разнообразие цветов, грязь и потертости древесины я добавил, используя функционал vertex color texture blending с использованием vertex alpha. Я использовал специальный шейдер, созданный в Shader forge, он дал мне возможность смешения с использованием vertex alpha и одновременно overlay vertex color поверх текстур с использованием градаций серого.


На этом изображении вы видите, что я использовал только 4 материала для оформления домиков (древесина, бетон, черепица, стекло), но так, как я использовал vertex color – композиция выглядит интересной и достаточно разнообразной. Один цвет на изображении это один материал в игре.


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

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

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

Инструменты

На первых этапах работы я применил vertex color в Maya, чтобы получить базовые цвета для домиков. А в среде Unity использовал инструмент vertex paint tool для добавления цветов. Из всего разнообразия я выбрал free face paint, при этом можно добавлять цвет сразу на весь полигон и это быстрее чем на каждый вертекс по отдельности. Если у Вас есть шейдер поддерживающий vertex color или смешение текстур, то можно прямо в сцене Unity очень быстро изменить общий вид ваших ассетов.

Вы можете посмотреть, как я это реализовал на этих изображениях:



Освещение

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

Я использовал только real-time направленный свет в этой сцене. Для всего непрямого освещения использовались стандартные средства Unity.

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

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

Также нужно наметить разделение заднего плана от переднего используя стандартный туман Unity. Ощущение солнечного дня создает контраст между затененными и освещенными зонами.

Все остальное сделано с помощью пост-эффектов.

Пост-процессинг

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

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

Заключение

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

С соответствующей настройкой уровня детализации (LOD) можно получить большое количество элементов детализации переднего плана, а также упростить их для использования на заднем плане. Основные малоразмерные элементы в нашем проекте это растительность, но учитывая то, что при ее создании мы использовали один материал и она состоит из плоских элементов, то правильное использование static batching в Unity сэкономит нам миллионы используемых тут полигонов.

Я не могу точно указать количество часов, потраченное на создание этого окружения, так как занимался им в свободное время после полного рабочего дня. Но, я думаю это более 200 часов в процессе работы от идеи до готового проекта окружения.

Мой фэнтезийный лес

Выровнял Terrain

Первым делом я выровнял Terrain, оставив только незначительные неровности для вида. Холмы и высокая трава – чуть-чуть не то, что я хотел.

Выровнял Terrain

Затем добавил немного деревьев, залил все более-менее низкой травой. Сияние солнца поменял в инспекторе на 50mmZoom. Получилась вот такая картинна.

Довольно симпатично. Но… Нет.

Добавление тумана

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

  1. Заходим в Window → Rendering → Lighting.
  2. Окошко для удобства кладем на панельку рядом с Инспектором.
  3. Переходим во вкладку Environment и ставим галочку около Fog – туман.
  4. Настраиваем все под себя, чтобы это смотрелось адекватно. Дергаем ползунки, не боимся.

И в итоге получается небольшой такой туман… Я установил густоту 0.005, чтобы он не был слишком очевиден.

Получилось вроде бы неплохо.

Добавление постэффектов

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

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

  1. Выбираем камеру в иерархии проекта.
  2. Заходим в Component → Image Effects и выбираем там то, что нам нужно.
  3. Эффект навешивается на камеру и появляется в инспекторе, где можно подергать ползунки и настроить все под себя.

Я, например, первым делом добавил 3 эффекта: Sun Shafts (объемные лучи солнца), Bloom (небольшое свечение), Antialiasing (типа сглаживание).

Важный момент: чтобы лучи солнца исходили из вашего Directional Light, а не отовсюду, перетащите его в окошко Shafts caster в настройках эффекта. Результат на скриншотах.

Красиво, правда?)

Картинка стала более живой, более красочной. Но это мы только начали…

Смена Color Space

В погоне за красивой графикой наткнулся на такую вещь, что нужно менять Color Space в настройках проекта с Gamma на Linear. Это вроде как должно придать большую реалистичность картинке.

  1. Переходим в Edit → Project Settings → Player.
  2. В графе Color Space меняем значение на Linear. Немного ждем, пока применятся изменения.

Смена Color Space

Также я подкорректировал постэффекты, добавил немного интенсивности освещения, и вот что получилось…

Картинка стала реалистичнее

Мой лес

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

Сделал это при помощи опции Depth of Field (Component → Image Effect → Camera). Тоже вешается на камеру. Если кто не знает, эта штука немного размывает отдаленные объекты. Я настроил ее легонько, чтобы размытие было почти незаметно. Даже не знаю, заметите ли вы его на скриншоте.

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

Добавление воды

Первым делом решил добавить воду. Для этого ее надо сначала где-то взять. А взять ее можно из стандартного пакета ресурсов под названием Standard Assets. Импортировал его из Asset Store.

И скриншот исправления.

Исправление ошибки

Жизнерадостно исправив эту и другие ошибки на новые, переходим к установке самой воды.

Добавление на сцену стандартной воды

И вот в нашем фэнтезийном лесу появилась небольшая река. Хотя больше похоже на болотце…

Мое маленькое болото ;)

Смотрится неплохо. Но трава на берегу не растет.

Чтобы все выглядело более адекватно, скачал текстур-пак Outdoor Ground Textures, импортировал в Unity (вы же помните, как это делается, да? 😉) и подрисовал песчаные берега. Получилось что-то такое.

Озеро в лесу, песчаные берега Unity

Уже больше похоже на правду, да?

Добавление камней

Добавить камни также легко, как и траву.

  1. Выбираем Terrain. В инспекторе идем во вкладку Paint Details.
  2. Добавляем туда наши камни в качестве моделей.
  3. Разбрасываем по карте максимально хаотично.

Добавление камней

У меня получилось как-то вот. И в целом результатом я остался доволен.

Набросал немного камней ;)

Летающие частицы в воздухе

На сцену нужно добавить систему частиц, которая в радиусе 100-150 метров от игрока будет спавнить частицы в сферическом пространстве. Частицы будут хаотично двигаться и исчезать за 10-15 секунд, что создаст красивый эффект для сцены. Во всяком случае, я пришел к такому решению.

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

  1. Создаем Particle System и привязываем к игроку, то есть перемещаем в контроллер в качестве дочернего объекта на ряду с камерой. Это нужно, чтобы частицы спавнились всегда вокруг игрока, где бы он ни был.
  2. В инспекторе настраиваем систему частиц следующим образом.
    1. Simulation Space – World (иначе вся система будет поворачиваться вместе с камерой игрока)
    2. Shape – Sphere (сферическая область вокруг игрока, радиус – порядка 100-150 будет нормально).
    3. Снижаем влияние гравитации на частицы параметром Gravity Modifier, а с помощью Noise (шум) заставляем их двигаться хаотично.

    Добавление частиц

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

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

    Мой лес с частицами и постэффектами

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

    Добавление фоновых звуков

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

    1. Создается элемент Audio Source, переименовываем по своему вкусу.
    2. Помещаем его в игрока, чтобы музыка была слышна в любом месте леса.
    3. Музыку прямо из проводника перетаскиваем в свой проект.
    4. Выбираем в иерархии свой Audio Source и в инспекторе указываем нужный музыкальный файл.

    Добавление звуков

    Запускаем игру и наслаждаемся пением птичек.

    На этом пока все. Не могу утверждать, что создал супер-реалистичную картинку. Но определенно стало лучше, чем было. Продолжение в будущих постах. И удачи 😉.

    Unity - Полное руководство для начинающих по разработке игр 🔥

    🎮 Игры

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

    Вступление

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

    Почему Unity?

    Если вы хотите делать игры

    Когда дело доходит до разработки инди-игр, вариантов действительно очень мало. Если вы хотите создавать игры, есть три основных варианта: Unreal, Unity или GameMaker.

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

    В Unity есть множество очень успешных игр, таких как Escape from Tarkov (FPS), Monument Valley (Puzzler) и This War of Mine (Стратегия / Выживание).

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


    Если вы хотите прототипировать пользовательский опыт

    Поскольку Unity — это всего лишь движок с кучей физики, анимации и 3D-рендеринга в реальном времени, это также отличное место для создания полноценных интерактивных прототипов для исследований UX.

    Unity полностью поддерживает VR и AR и, следовательно, может стать отличным инструментом для изучения архитектуры, автоматизации и моделирования с помощью клиентов.

    Окно редактора Unity

    Окно редактора разделено на несколько разделов. Мы расскажем об этом очень кратко, так как будем постоянно к нему обращаться на протяжении всей статьи. Если вы уже знакомы с этим, пропустите мимо!

    Просмотр сцены: позволяет размещать и перемещать игровые объекты в сцене.

    Просмотр игры: предварительный просмотр того, как игрок будет видеть сцену с камеры.

    Инспектор: предоставьте подробную информацию о выбранном GameObject в сцене.

    Assets / Project: здесь хранятся все префабы, текстуры, модели, скрипты и т. Д.

    Иерархия: позволяет вложение и структурирование игровых объектов внутри сцены.

    Теперь мы готовы начать!

    Объекты Unity Game

    Что такое GameObjects

    Если у вас есть опыт веб-дизайна, вы можете думать о GameObjects как о элементах

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

    Буквально все, от эффектов частиц, камер, игроков, элементов пользовательского интерфейса… (список продолжается) — это GameObject.

    Создание иерархии

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

    Беспорядок и эффективность

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

    Позиционирование

    Unity Translation: вы создали группу дронов-помощников, которые летают вокруг игрока. На самом деле вы бы не стали писать код, чтобы они гонялись за игроком, поэтому вместо этого вы создаете их как дочерние элементы игрового объекта player.

    Встроенные компоненты Unity

    Компонентная модель актера

    Unity работает на основе модели компонентов акторов, проще говоря, GameObjects — это актеры, а компоненты — ваши скрипты.

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

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

    Ключевые встроенные компоненты

    Думаю, пришло время привести несколько примеров встроенных компонентов, предоставляемых движком Unity Games.

    • MeshFilter: позволяет назначать материалы для 3D-сетки GameObject.
    • MeshRender: позволяет назначать материалы 3D-сетке.
    • [Коробка | Mesh] Collider: позволяет обнаруживать GameObject во время столкновений.
    • Rigidbody: позволяет реалистичному физическому моделированию воздействовать на GameObjects с 3D-сетками и запускать события обнаружения на коллайдерах боксов.
    • Свет: освещает части вашей сцены.
    • Камера: определяет область просмотра игрока, которая будет прикреплена к GameObject.
    • Различные компоненты холста пользовательского интерфейса для отображения графического интерфейса пользователя

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

    Создание пользовательских компонентов

    Структура моноповедения

    Ключевые функции

    Все компоненты наследуются от класса MonoBehaviour. Он включает в себя несколько стандартных методов, главное:

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

    Переменные инспектора

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

    Другой пример, когда мы можем захотеть это сделать, — это создание компонента пользовательского интерфейса, который отслеживает движения мыши пользователя и помещает курсор в область просмотра. Здесь мы можем захотеть контролировать чувствительность курсора к движениям (если пользователь использовал джойстик или геймпад, а не компьютерную мышь). Таким образом, имеет смысл сделать эти переменные легко изменяемыми как в режиме редактирования, так и поэкспериментировать с ними во время выполнения.

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

    Мы можем сделать это легко, просто объявив их как общедоступные переменные в теле компонента.

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

    Принятие пользовательского ввода

    Конечно, мы хотим, чтобы наша игра реагировала на ввод пользователя. Наиболее распространенные способы сделать это — использовать следующие методы в функции Update () компонента (или в любом другом месте, которое вам нравится):

    Управление игровыми объектами

    Трансформации

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

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

    В общем, рекомендуется использовать локальное [Положение, Вращение], а не глобальное положение / поворот объекта. Обычно это упрощает перемещение объектов разумным образом, поскольку ось локального пространства будет ориентирована и центрирована на родительском объекте, а не на мировом начале координат и направлениях x, y, z.

    Преимущества локального пространства станут немного более очевидными с диаграммой!

    Если вам нужно преобразовать между локальным и мировым пространством (что часто бывает), вы можете использовать следующее:

    Создание новых игровых объектов

    Поскольку GameObjects — это в основном все в вашей сцене, вы можете иметь возможность генерировать их на лету. Например, если у вашего игрока есть какая-то пусковая установка для снарядов, вы можете захотеть создавать снаряды на лету, у которых есть собственная инкапсулированная логика для полета, нанесения урона и т. Д.

    Сначала нам нужно ввести понятие префаба . Мы можем создать их, просто перетащив любой GameObject в иерархии сцены в папку с ресурсами.

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

    Пример пользовательского объекта-кирпича, который используется для динамического создания кубиков Lego в сцене, к нему прикреплен набор компонентов с различными значениями по умолчанию.

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

    Доступ к другим игровым объектам и компонентам

    После этого вы можете получить доступ к любому из общедоступных методов / переменных компонента, чтобы управлять GameObject. Это простой момент, однако на самом деле получить ссылку на GameObject можно несколькими способами …

    Доступ через переменную инспектора

    Это самый простой способ. Просто создайте общедоступную переменную для GameObject, как мы продемонстрировали ранее с префабами, и вручную перетащите ее на компонент через инспектор. Затем перейдите к переменной, как указано выше.

    Доступ через теги

    Мы можем пометить GameObjects или prefabs через инспектор, а затем использовать функции поиска игровых объектов, чтобы найти ссылки на них.

    Доступ через преобразование

    Доступ через SendMessage

    Raycasting

    Есть два сценария, в которых это может пригодиться (вероятно, их гораздо больше):

    Обнаружение столкновений

    Ранее мы упоминали компоненты Collider и Rigidbody, которые можно добавить к объекту. Правило для столкновений состоит в том, что один объект в столкновении должен иметь твердое тело, а другой — коллайдер (или оба имеют оба компонента). Обратите внимание, что при использовании raycasting лучи будут взаимодействовать только с объектами, к которым прикреплены компоненты коллайдера.

    После настройки в любом настраиваемом компоненте, прикрепленном к объекту, мы можем использовать методы OnCollisionEnter, OnCollisionStay и OnCollisionExit для реагирования на коллизии. Получив информацию о столкновении, мы можем получить ответственность за GameObject и использовать то, что мы узнали ранее, для взаимодействия с прикрепленными к нему компонентами.

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

    Расширенные возможности

    Мы не будем вдаваться в подробности сейчас, но, возможно, в следующей статье — просто чтобы вы знали, что они существуют.

    Создание графического интерфейса

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

    Расширение редактора Unity

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

    Анимация

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

    Материалы и PBR

    Unity использует физический движок рендеринга, который обеспечивает освещение в реальном времени и реалистичные материалы. Реальность такова, что вам нужно либо сначала изучить 3D-моделирование, либо использовать модели, созданные и оптимизированные кем-то другим, прежде чем вы доберетесь до этого, чтобы создавать вещи, которые действительно хорошо выглядят.

    Совет новичкам по Unity

    Если вы планируете написать свою первую игру, не стоит недооценивать сложность и время, необходимое для написания даже самых тривиальных игр. Помните, что над большинством игр, которые выходят в Steam, команды работают над ними в течение многих лет!

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

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

    Хорошие ресурсы для разработки игр в Unity

    Сообщество разработчиков игр — одно из лучших среди всех, и в индустрии есть множество высококвалифицированных профессионалов, которые размещают контент бесплатно или почти бесплатно. В этой области требуются 3D-моделисты, концептуальные художники, геймдизайнеры, программисты и так далее. Я связал несколько отличных общих ресурсов, с которыми я столкнулся, для каждого из этих полей ниже:

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