Как сделать солнечную систему в юнити

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

В этой статье я расскажу о том, как мы с Питером за 24 часа собрали крутую демку с большим открытым миром. Надеюсь, это руководство поможет вам создавать более красивые ландшафты (terrain) в Unity. Для демонстрации мы использовали 2 x 2 ландшафта Unity (суммарно — четыре ландшафта) с параметрами, указанными ниже, и общим для всех ландшафтов разрешением.

  • разрешение карты высот — 4097 пикселей (рекомендованный максимум для игр — 2048 пикселей);
  • разрешение сплат-карты (splatmap) — 1024 пикселя;
  • разрешение базовой карты ландшафта (basemap resolution) — 256 пикселя;
  • разрешение карты расстановки травы — 8192 пикселя (рекомендованный максимум для игр — 2048 пикселей);
  • параметр grass per patch — 8.

Разрешение текстур для RTP:

  • карта цвета (colormap) — 8192 пикселя;
  • карта нормалей — 4096 пикселей;
  • карты распределения — 4096 пикселей.

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

Чтобы наши деревья выглядели красивее, мы применили пакет Advanced Foliage Shader от Forst. Преимущество пакета состоит в том, что с ним билборды деревьев могут отбрасывать тени и сам переход от билборда в 3D-дерево выглядит намного лучше, чем при использовании стандартного шейдера Unity, что обеспечивает отсутствие скачков при движении камеры (в тех местах, где дерево заменяется на билборд).

Кроме этого, в AFS есть много чего ещё, — например, изгибание растительности при проходе персонажа рядом. О том, как использовать AFS, можно подробно почитать в идущей к нему сопроводительной документации.

Мы использовали следующие ассеты Unity:

Сначала мы выбрали в WorldComposer область размером 30,107 x 30,107 км вокруг горы MountRanier. Мы установили значение Image Zoom равное 17, что обеспечило суммарное разрешение 36x36K (36000 х 36000 пикселей) для фото со спутника. 36K — слишком высокое разрешение для непосредственного использования в Unity, поэтому позднее мы уменьшили изображение в Photoshop до 8K.

После выбора области мы нажали на Export Heightmap, а затем на Export Images. Для экспорта изображения был выбран формат Raw, чтобы можно было удалить тени. После экспорта на выходе мы получили карту высот размером 4K и 9 x 9 изображений с разрешением 4K.

Возможность удаления теней делает WorldComposer (WC) уникальным по сравнению с другими программами и существенно улучшает качество изображений, полученных со спутника. Я потратил много дней, создавая алгоритм удаления теней, а также работая над стримингом, так как в Unity (по-крайней мере, в Unity 4.x) есть ограничения по количеству и размеру изображений, которые мы одновременно можем загрузить в память.

Удалять тени в WC можно при любом разрешении изображения в формате RAW. Удаление теней даёт нам возможность ввести в ландшафт дневные и ночные циклы — это очень круто, так как иначе пришлось бы фиксировать положение солнца в проекте так, чтобы оно соответствовало бы теням на снимке со спутника.

После экспорта изображений мы кликнули кнопку Combine Images. Она собирает все изображения в формате RAW выделенной области в одно большое изображение, сохраняя его под именем area name+_combined.raw в папке для экспортируемых изображений. После этого мы выбрали вкладку Image Editor в верхней части окна WorldComposer.

В данном режиме мы можем видеть одновременно два изображения. Левое изображение представляет собой оригинальный спутниковый снимок текущего участка на карте WorldComposer, а правое — превью изображения после удаления теней. В настройках вкладки Image Editor есть два цвета. Эти цвета определяют диапазон, в котором будет работать алгоритм работы с тенями.

Мы задали радиус, равный 1500, и число повторов (параметр Repeat), равное 4. Алгоритм удаления теней просматривает все теневые пиксели и находит ближайший пиксель без тени, а затем переносит его в какой-то из теневых пикселей в пределах заданного радиуса. Если значение параметра с радиусом слишком мало, вы можете увидеть повторяющиеся участки. Это происходит потому, что алгоритм делает несколько проходов по изображению, чтобы обработать все теневые пиксели.

После выбора настроек мы нажали кнопку Apply во вкладке Image Editor. Обработка занимает много времени ввиду большого размера изображения, но это во много раз быстрее, чем если бы мы делали то же самое в Photoshop. К тому же, Photoshop имеет ограничение по памяти, так как в нём нет стриминга. Мы сохранили полученное изображение в папке экспортируемых изображений под именем Combined2.raw.

Обложка: Создаём Солнечную систему на чистом CSS3. Часть вторая. Кейфреймы и тени

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

Вот на чем мы остановились в первой части: мы создали HTML-файл с единственным элементом и написали CSS-код для добавления звёздного фона и симуляции солнечного света:

Добавляем Солнце

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

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

Вот необходимый CSS-код:

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

Давайте добавим элемент

в круглый. Это можно сделать, установив border-radius в 50%, что превратит любой квадрат в круг. Зададим размер 30×30 пикселей, и используем отступы для размещения строго по центру экрана. Мы также раскрасим Солнце и добавим приятную жёлтую тень блока для сияния.

Какое-то маленькое солнце, давайте увеличим длину и ширину. Но работать в пикселях — плохая идея, ведь размеры экранов отличаются. Вместо этого будем задавать размеры в em’ах: они соотносятся со стандартным размером текста в браузере, и с масштабированием проблем не возникнет. Что ещё более важно, все абсолютные величины (размеры, отступы, границы и т.п.) можно задавать в em’ах, и поэтому все их можно масштабировать одновременно, используя font-size . Если у нас есть это:

… и мы добавим это:

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

Для помещения изображения поверх солнца снова воспользуемся правилом background-size :

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

Сейчас мы рассмотрим ещё одну фичу CSS3 — keyframe-анимацию, или кейфреймы. Они используются для плавного изменения CSS-свойств с течением времени. Например, если вы хотите, чтобы элемент класса myelement постепенно исчезал, вам стоит написать такой код:

Сперва утверждение @keyframes используется для создания анимации с уникальным именем fader. Внутри блока keyframes мы создаём три кейфрейма: полная непрозрачность (на 0%, в начале анимации), полная прозрачность (на 50%, в середине анимации) и полная непрозрачность в конце. Непрозрачность — лишь одно из свойств, которые можно анимировать; в дальнейшем мы будем анимировать местоположение и вращение.

Для использования анимации достаточно добавить к определению класса правило animation . Вы задаёте имя анимации, её длительность и временную функцию. мы использовали linear , но можно использовать ease , ease-in или ease-out для ускорения анимации на различных этапах. Подробнее об этом можно почитать здесь.

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

Мы используем animation-iteration-count для создания бесконечного анимационного цикла. Ключевое слово infinite можно добавить и к сокращённому виду записи.

Помните, что в общем случае нужно добавлять и варианты с префиксами: -webkit-animation , -moz-animation и -o-animation — но поскольку мы используем PrefixTree, это нам не нужно.

Поскольку все планеты нашей системы вращаются вокруг Солнца одинаково (меняется лишь диаметр орбиты), мы можем создать общий класс для планеты. Какие-то свойства совпадают и с Солнцем, поэтому упростим:

Добавим планету в наш HTML:

Эта работает, но планета сейчас расположена поверх Солнца, в центре. Прежде чем запустить её движение, нам нужно задать орбиту, поэтому изменим HTML так:

Орбита нарисована, но Меркурий всё ещё сидит поверх Солнца. Исправим это, задав планете отступ относительно орбиты:

Это поместит Меркурий слева от Солнца, на линию орбиты.

Настало время запустить вращение планеты! Провернём такой трюк: будем вращать не планету, а орбиту. Поскольку планета находится в системе координат орбиты, она будет вращаться вместе с орбитой. Создадим кейфреймы для орбит с использованием преобразований. Это новая функция CSS3: вы можете не только анимировать значения свойств, но и преобразовывать элементы, отражая, масштабируя или вращая их. В нашем случае мы зададим вращение относительно оси Z от 0 до 360 градусов.

Задав анимацию, мы можем применить её к классу орбит:

Определим длительность анимации для Меркурия:

Вот и всё. Меркурий плавно вращается вокруг Солнца, и мы всё ещё не воспользовались JavaScript. Чистый CSS:

Добавляем движущуюся тень на планете, используя анимации и тени блока

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

Наша планета вращается вокруг солнца благодаря анимации, применённой к орбите, поэтому мы можем добавим анимацию и к самой планете:

Мы указали, что анимация планет будет зациклена, а у Меркурия она будет называться shadow-mercury. Определим её:

Внутренние тени используются для отбрасывания теней на планету. Поскольку планеты круглые, тени должны быть такими же. В начале анимации планета находится за Солнцем и полностью освещена. На 50% она полностью в тени. Когда планета проходит перед Солнцем, мы должны переключить анимацию, что мы и делаем на 50.01%. Также заметьте, что на 100% тень должна быть в точности такой же, как и на 0%, для корректного вычисления затенения.

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

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

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

Поскольку мой лес фэнтезийный, решил поступить максимально логично и тупо воткнуть туда космический корабль. Почему бы и нет, черт побери? 😉

Как добавить космический корабль на сцену

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

Добавление модели на сцену

И вот мой корабль уже ждет меня на берегу болота. Сейчас это просто моделька – даже без collision shape. А маленьким я его сделал потому, что террейн у меня небольшой. Хочу просто полетать между деревьями, как эльф. Эльф на звездолете!

Как создать коллайдер и добавить массу

Как я уже сказал, корабль – просто моделька. Через нее можно даже пройти. Нужен коллайдер для столкновений и физика – масса корабля.

Первым делом я выделил корабль в иерархии проекта, нажал Add Component в инспекторе и добавил ему свойство Rigidbody. Массу увеличил до 200 единиц, чтобы персонаж при столкновении не мог сдвинуть его с места.

Добавление массы

Создание коллайдера

Ну и вот он, красавец, одиноко лежит на земле в моем лесу.

Корабль

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

Как сесть в корабль

Логику происходящего я понимаю лишь примерно.

  1. Персонаж подходит к кораблю и нажимает кнопку.
  2. После этого он должен исчезнуть, а камера переключается на камеру корабля. Корабль становится персонажем, и можно летать.
  3. При выходе из корабля нажатием кнопки основной игрок (FPS Controller) спавнится рядом и включается его камера.

По крайней мере, так я это выдумал на основе того, что видел в играх… Посмотрим, что получится.

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

Камера (здесь я для теста сделал ее дочерней, но затем ее нужно достать наружу)

Камера (здесь я для теста сделал ее дочерней, но затем ее нужно достать наружу)

Перенос постэффектов

Скопировал все компоненты. Теперь все в порядке. Можно продолжать.

Скопировал все компоненты

Не забудьте отключить камеру (галочка в инспекторе)! Дело в том, что 2 активные камеры – это двойная нагрузка на видеокарту. Очевидно, камеру для таких вещей нужно включать / выключать скриптом.

Скрипт посадки на корабль и выхода наружу

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

Опыта в программировании под Unity у меня нет, поэтому совместными силами с Google, YouTube и документацией мы родили простенький скриптик. Я снабдил код подробными комментариями, чтобы было понятно, что происходит.

Этот скриптик по моей задумке вешается на корабль. Сперва регистрируются публичные переменные, которые добавят поля. В эти поля надо поместить объект игрока, объект корабля и камеру корабля. Также добавляется переменная с максимальной дистанцией до корабля, при которой в него можно сесть. Я поставил 10 единиц (пока не знаю каких 😁).

Скрипт вешается на корабль

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

Сел в корабль. Каеф ;)

Без видео это, к сожалению, сложно продемонстрировать. Так что придется тебе, дорогой читатель, поверить мне на слово. По крайней мере пока… В конце я обязательно покажу, что получилось 😉.

Как летать на корабле

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

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

В моем случае скриптов получилось аж 5 штук. Вот их список в том порядке, в котором я их делал.

  • EnterToShip (вешается на корабль) – вход в корабль и выход из него.
  • ShipCameraFollow (вешается на камеру корабля) – управление камерой.
  • ShipControl (вешается на корабль) – управление кораблем.
  • ShipEffects (вешается на корабль) – включение / переключение / отключение систем частиц, которые имитируют реактивные струи двигателей.
  • ShipAudio (вешается на корабль) – включение / переключение / отключение аудио-эффектов, которые имитируют гул двигателей.

Как сделать камеру слежения за кораблем

Выбесила она меня страшно, надо сказать. Куда не зайди (я имею в виду YouTube, гайды в сети и так далее), на тебя вываливают какие-то дебри кода с кватернионами, непонятными расчетами и черт знает чем еще. Перепробовав все это я столкнулся с неимоверным количеством глюков.

Скрипт камеры слежения

В итоге выкинул все, сел и просто стал думать.

Итак, у меня есть корабль. И у меня есть камера. Камера должна всегда находиться позади корабля, но следовать за ним с небольшой задержкой. Повернуть камеру на объект легче легкого с помощью Transform.LookAt(). Движение за объектом и задержку вроде бы тоже нетрудно сделать с помощью Vector3.Lerp(). Но как заставить камеру всегда находиться позади объекта?

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

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

Реализация управления

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

Скрипт контроллера корабля

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

Чтобы скрипт нормально работал, в Rigidbody корабля в Инспекторе нужно настроить Mass (массу), Drag (сопротивление среды движению) и Angular Drag (сопротивление вращению). От массы корабля напрямую зависит сила импульса, которую нужно применить в AddForce(), чтобы он полетел. Высокие сопротивления помогут удерживать корабль стабильным. В противном случае после придания ускорения его уже будет крайне сложно остановить, и его будет мотать по всей округе. То же самое с вращением – если не хотите превратить корабль в спинер, то Angular Drag ставьте большой.

Визуальные эффекты для корабля

По сути, корабль был уже готов. Можно было летать и выполнять фигуры высшего пилотажа. Но все это происходило в тишине и скукоте. Решил добавить визуальные эффекты.

(Эффекты частиц вам придется создать самим )

  1. Сделал одну систему частиц, имитирующую реактивную струю из двигателя. Даже добавил в нее источник света, чтобы был эффект освещенности. Сделал ее дочерним объектом корабля, назвал Engine1Fire.
  2. Скопировал ее для второго двигателя, назвал Engine2Fire.
  3. С помощью скрипта запрограммировал 4 фазы: двигатели выключены (игрок вне корабля), двигатели на минимум (режим бездействия), двигатели в полете (W), двигатели форсаж (W + Shift).
  4. Чтобы эффект различался по степени яркости, изначальные частицы сделал прозрачными, а выполнении условий фазы просто добавлял их количество.

Получился довольно прикольный эффект. Вначале струя тусклая, при полете ярче, а при ускорении – совсем яркая.

Код, опять же, причесал, как мог.

Звуковые эффекты для космического корабля

Еще одно место, где меня, зеленого неофита, ждали боль и страдания.

Скрипт звуковых эффектов для корабля

Во-первых, написать логику переключения звуков оказалось на порядок сложнее, чем кажется. Причем в приведенной в скрипте логике до сих пор есть баг со звуком взлета (на пробел), который я не могу поймать. Кажется, что-то связанное с креном…

Во-вторых, у меня долго не получалось сделать звук объемным. То есть не просто рев моторов в фоне, а чтобы он исходил из корабля. В итоге скачал ассет Resonance Audio (инструкция по установке) – не работает. Долго не мог понять, что не так. В конце концов, дошло: нужно отключать Audio Listener на камере корабля, когда она неактивна. Вырубил, управление прописал в скрипт.

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

  1. Открываем файл с шумами в проге, обрезаем более-менее стабильно звучащий кусочек.
  2. Копируем его, копию ставим в начало файла.
  3. Оригинал разворачиваем задом наперед (Эффекты → Реверс).
  4. Присобачиваем к копии.
  5. Обязательно заходим в Эффекты → Обрезка тишины и, ничего не меняя, применяем на трек. Это удалить паузу (миллисекунды тишины) в начале трека.
  6. Готово. Экспортируем в OGG и закидываем в Unity.

Создание зацикленного бесшовного звука двигателей

В целом, я думаю, получилось, нормально. Иногда проскакивают косяки со звучанием вертикального взлета, но я это исправлю… Когда-то 😀.

Видео с моим кораблем

Наконец, готов поделиться результатом кусания локтей, вырывания волос, истерик, панических атак (и это только субботнее утро 😁) в течение 3-х дней.

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

Надеюсь, приведенный здесь код будет кому-то полезен. Увидимся в следующих постах 😉.

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-моделисты, концептуальные художники, геймдизайнеры, программисты и так далее. Я связал несколько отличных общих ресурсов, с которыми я столкнулся, для каждого из этих полей ниже:

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