Как сделать эффекты в unity

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

В настоящее время я пытаюсь создать эффект светлячка в темном лесу. Уровень имеет очень слабое освещение, и игрок является одним из немногих источников света. Чтобы игрок лучше видел уровень, я стараюсь, чтобы светящиеся светлячки появлялись на карте случайным образом. Одним из способов является использование системы частиц. Но я не могу заставить частицы излучать свет вокруг. Есть ли способ сделать это?

@ Draco18s Там не будет десятков светлячков. Они только появятся в поле зрения игрока. Это сверху вниз и как таковой легко контролировать. И в любой момент времени должно быть не более 10 светлячков. Я не думаю, что 10 динамический точечный свет стоит дорого?

По умолчанию Unity позволяет только двум активным динамическим источникам света освещать геометрию за раз (хотя это может отличаться для 2D-установки). Конечно, вы можете увеличить это, но имейте в виду, что +1 свет в 2 раза влияет на колл-коллы.

Светоизлучающие частицы теперь являются встроенной функцией Unity в 5.5.

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

введите описание изображения здесь

И вуаля, частицы, которые излучают свет:

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

Редактировать: После некоторого наблюдения, мне кажется, что частицы света переключаются между освещением каждого фрагмента и освещением вершины (предположительно для оптимизации?). Это может привести к небольшому количеству визуальных артефактов, если максимальное освещение установлено слишком высоко.

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

Поведение освещения вершин, которое вы видите, звучит немного похоже на некоторые оптимизации, которые Unity применяет при прямом рендеринге. Видите ли вы то же поведение при использовании отложенного пути?

Берегись:

Этот ответ устарел. Unity теперь поддерживает точечные световые частицы. Пожалуйста, смотрите этот ответ для более подробной информации.

Вот быстрый пример, который я приготовил:

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

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

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

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

Кроме того, по какой-то причине ParticleSystem.Particle ссылается на устаревшую частицу. Для него нет метода GetCurrentColor или GetCurrentSize.

@DarkDestry Я добавил примечание к ответу о создании префабов. Что касается отсутствующих функций, это может быть проблемой версии - я работаю в 5.3, в более ранних версиях Unity вы могли бы сделать это по-другому. Давайте обсудим детали реализации в чате , используя комнату, любезно созданную Хамзой Хасаном.

Таким образом, легкий сборный домик такой же, как и обычный сборный дом. Был смущен, когда это упоминается как легкий сборный дом.

Несколько лет назад, до того, как динамические источники света стали доступны по цене, мы просто использовали эффект частиц с двумерным билбордом с аддитивным смешиванием. Это осветлит сцену в сторону белого. Рисуя его с правильной глубиной светлячка, вы получаете почти правильную сортировку. Аддитивная альфа не нуждается в сортировке при перерисовке по сравнению с альфа смешиванием. Он не осветит ВСЕ сцены, но осветит область, окружающую светлячка. Затем вы можете взять динамический свет и выбирать одну из светлячков каждые несколько секунд, чтобы фактически осветить сцену, если вам это нужно.

Уже есть вопрос и ответ об эффектах свечения. Как добиться такого освещения в Unity для 2D-игр?

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

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

Возможный способ добиться аналогичного эффекта - сопоставить предварительно созданную текстуру свечения с рельефом ниже ваших светлячков (при условии, что система координат Y = вверх / вниз) с позициями X и Z, контролирующими местоположение свечения на местности и смещение Y от местности, контролирующей альфа текстуры (ярче = ближе к местности)

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

Используйте Light в начале огня и поиграйте с его размером в сценарии, чтобы получить эффект горения. И используйте свою систему частиц :)

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

Итак, в чем же дело? вы можете прикрепить свет к вашему префабу с частицами, а не по заранее определенным позициям

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

Итак, у вас есть частица gameObject на сцене. Прикрепите источник света к тому же игровому объекту и создайте его заранее, перетащив этот игровой объект в Unity File Explorer.

Узловая архитектура и адаптивные функции Visual Effect Graph дают возможность создавать красивые визуальные эффекты в реальном времени: от голограмм в научно-фантастических вселенных до огнедышащих драконов или капель дождя на стеклах.

Spaceship VFX Graph demo showcased at Unite LA 2018

Смотрите демофильм, созданный с использованием VFX Graph. Инструмент Visual Effect Graph расширяет возможности разработки эффектов: от простых искр или дыма до сложных визуализаций работы энергоблока или анимации игольчатых экранов компьютеров.

Создавайте визуальные эффекты реального времени


Узнайте, как создавать фантастические эффекты в VFX Graph

Посмотрите демофильм Spaceship VFX и загрузите проект. Инструмент Visual Effect Graph расширяет возможности разработки эффектов: от простых искр или дыма до сложных визуализаций работы двигателя или игольчатых экранов компьютеров.

Точка входа для художников по визуальным эффектам

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


Разработка и хранение в ассетах вида Visual Effect

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

Начните работать с новым мощным инструментом

В этом видео мы сравниваем Visual Effect Graph с имеющейся системой Particle System, демонстрируя преимущества частиц, моделируемых с помощью графического процессора. Кроме того, мы рассмотрим несколько примеров и покажем, с чего следует начать использование нового мощного инструмента.


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

Модуль Particle Strips создает эффект шлейфов, линий и лент между отдельными частицами. Кроме того, теперь доступен модуль Motion Vectors, позволяющий применять эффект размытия в движении из стека постобработки к быстродвижущимся объектам.

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

Подробнее о VFX Graph можно узнать из этих статей


Новинка: демопроекте Spaceship, использующий VFX Graph и High-Definition Render Pipeline

Unity 2018.1 расширила границы гибкости и настройки. Благодаря Shader Graph вы можете моделировать потоки лавы, вязкую слизь, живописные озера, мигающие индикаторы и многое другое.


Обновление VFX в FPS Sample с помощью Visual Effect Graph

Узнайте о том, как проводилось обновление визуальных эффектов в проекте FPS Sample с использованием Unity Visual Effect Graph для перевода графики на High Definition Render Pipeline (HDRP).


Загрузите и изучите примеры использования Visual Effect Graph

В этих примерах демонстрируются различные методы разработки с использованием Visual Effect Graph: от простых источников частиц до сложных систем с четко заданным поведением.


Создание взрывных эффектов с помощью Visual Effect Graph

Visual Effect Graph использует вычислительные шейдеры с обработкой на графическом процессоре и имеет визуальный интерфейс, построенный по принципу графов. Узнайте, как начать работу с этим мощным инструментом, и получите советы по разработке динамичных эффектов.

Смотрите наши официальные доклады


Разбор визуальных эффектов в Spaceship!

Система узлов в Visual Effects Graph позволяет создавать впечатляющие визуальные эффекты в реальном времени. В этом демопроекте представлено множество примеров, демонстрирующих разнообразие возможных эффектов.


Создание взрывных визуальных эффектов с помощью VFX Graph

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


Разработка VFX для The Heretic в реальном времени

В этом видео рассматривается процесс создания важнейших визуальных эффектов The Heretic и рассказывается о том, как разработчики использовали Unity VFX Graph. Это видео можно использовать как руководство в ваших собственных проектах.

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

Выровнял 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 и в инспекторе указываем нужный музыкальный файл.

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

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

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

    3D-игры определенно добавляют уровень сложности по сравнению с 2D, но шаг за шагом вы постепенно создаете интересную 3D-игру. Новые параметры проектов как для 2D, так и для 3D, в Unity поддерживают 3D. В 2D-игре могут быть 3D-объекты и наоборот.

    Из чего состоит трехмерная сцена?

    Трехмерная (3D) сцена состоит главным образом из трех основных визуальных компонентов: источников света (lights), рендеров мешей (mesh renderers) и шейдеров. Unity поддерживает четыре типа источников света. Вы найдете их в меню GameObject. Поэкспериментируйте, добавляя разные типы и изменяя их свойства. Самый простой из них — источник направленного света (directional light), который подобен солнцу на небе.

    Меш (mesh), или модель, — это набор вершин, образующие многоугольники, из которых состоит какой-либо объект. Шейдер является скомпилированной подпрограммой, содержащей код для управления тем, как будет отображаться ваш объект или как он будет взаимодействовать с источником света. Некоторые шейдеры просто берут освещение и отражают его подобно зеркалу, другие — принимают текстуру (изображение, применяемое к мешу) и могут создавать тени и глубину, а некоторые даже позволяют прорезать визуальные дыры в ваших моделях (пример — изгородь).

    Asset Store

    Я вкратце рассказывал об Asset Store (магазине ресурсов) в своей первой статье, но по-настоящему полезным он становится при разработке 3D-игр. Я не художник и, поскольку это технический журнал, полагаю, что большинство из вас тоже не являются художниками. (Если же вы художник, пожалуйста, примите мои поздравления — это редкий дар.) Но, если вы хотите создать игру, например, с буйной растительностью и старыми полуразрушенными зданиями, это не проблема. Я могу купить то, что мне нужно, в Asset Store. Если мне нужны 15 видов зомби, я могу приобрести пакет от Mixamo в Asset Store. Потенциально возможные комбинации почти бесконечны, так что не волнуйтесь о том, что чья-то игра будет выглядеть похожей на вашу. А самое главное в том, что Asset Store интегрирован с Unity. Вы можете обновлять свои пакеты, щелкая Window | Asset Store, а затем значок корзины. Вы также можете просматривать рецензии и комментарии, чтобы быстрее понять, подойдет ли конкретный элемент для вашего проекта, например оптимизирован ли он для мобильного устройства. Настольные игры обычно используют гораздо больше объектов, текстур, вершин, памяти, чем мобильная игра, хотя некоторые из более новых чипов делают сегодня мобильные устройства близкими по своим возможностям к Xbox 360.

    В типичной 3D-игре применяются многие из тех же концепций, что и в 2D-играх: коллайдеры, триггеры, абсолютно твердые тела (rigid bodies), игровые объекты/преобразования, компоненты и др. Независимо от типа 3D-игры обычно вам нужно контролировать ввод, перемещения и персонажей, использовать анимации и эффекты частиц, а также выстраивать воображаемый мир так, чтобы он был и фантастическим, и реалистическим. Мы обсудим некоторые способы, которыми Unity может помочь добиться всего этого.

    Контроллеры ввода, перемещения и персонажей

    Чтение ввода для перемещения в 3D немного усложняется, потому что вместо простого движения в плоскостях X и Y теперь можно двигаться в трех измерениях: X, Y и Z. Варианты 3D-перемещения включают (но не исчерпываются ими) движение сверху вниз, где персонаж двигается только горизонтально и вертикально; поворачивание камеры или персонажа при считывании ввода от мыши, как это делается во многих шутерах от первого лица (first-person shooter, FPS); смещение влево и вправо при чтении ввода по горизонтали; вращение вокруг себя при чтении ввода по горизонтали или простое движение в обратном направлении. Вариантов перемещения очень много, так что вам есть из чего выбирать.

    Рис. 1. Различные методы перемещения объектов

    У каждого подхода есть свои плюсы и минусы. При перемещении только с помощью преобразования производительность может пострадать (методы 1–2), хотя это очень простой способ перемещения. Unity предполагает: если у объекта нет компонента rigidbody, он, вероятно, не является перемещаемым объектом. Она создает на внутреннем уровне статическую матрицу столкновений (static collision matrix), чтобы знать, где находятся объекты; это повышает производительность. Когда вы перемещаете объекты с помощью преобразования, эту матрицу нужно пересчитывать, что приводит к уменьшению производительности. В простых играх вы никогда не заметите этого падения производительности, и такие варианты могут оказаться для вас самыми простыми, хотя по мере усложнения ваших игр важно перемещать само абсолютно твердое тело, как в методах 4–6.

    Поворачивание объектов

    Поворачивание объектов — операция сравнительно несложная, во многом аналогичная перемещению объектов, но теперь векторы представляют градусы, а не позицию или нормализованный вектор. Нормализованный вектор — это просто вектор с максимальным значением 1 для любого значения, и он может использоваться, когда вам нужно лишь ссылаться на направление по вектору. Вам доступны некоторые ключевые слова, относящиеся к векторам, например Vector3.right, back, forward, down, up, left, right, zero и one. Все, что будет перемещаться или поворачиваться в положительном горизонтальном направлении, может использовать Vector.right, под которым подразумевается (1,0,0), или одна единица вправо, а в случае поворачиваемого объекта это один градус. На рис. 2 я просто понемногу поворачиваю объект в каждом кадре.

    Рис. 2. Метод для поворачивания объекта

    У каждого из этих методов есть свои нюансы. Какой из них следует использовать вам? Я попытался бы по возможности приложить силы к rigidbody. Наверное, я просто немного запутал вас этим вариантом. Хорошая новость в том, что уже имеется код, способный делать за вас практически все из этого.

    Вы обратили внимание на Quaternion в методе 3? Unity использует на внутреннем уровне эти Quaternion для представления всех поворачиваний. Quaternion — эффективные структуры, предотвращающие эффект, который называется шарнирной блокировкой (gimbal lock). Он возможен, если для поворачивания вы используете обычные углы Эйлера (Euler angles). Шарнирная блокировка происходит, когда две поворачиваемые оси оказываются в одной плоскости, после чего их нельзя разделить. (Наглядную демонстрацию см. в видеоролике по ссылке bit.ly/1mKgdFI.) Чтобы избежать этой проблемы, Unity использует структуры Quaternion вместо углов Эйлера, хотя вы можете задавать углы Эйлера в Unity Editor и он в конечном счете будет выполнять их преобразование в Quaternion. Многие никогда не сталкиваются с шарнирной блокировкой, но я хотел указать на то, что, если вы хотите напрямую задавать поворачивание в коде, то должны делать это через Quaternion; кроме того, вы можете сами преобразовывать углы Эйлера с помощью Quaternion.Euler.

    Теперь, когда вы увидели множество вариантов, должен отметить, что самым простым методом я нахожу использование rigidbody и простое применение .AddForce к персонажу. По возможности я предпочитаю повторно использовать код, и, к счастью, Unity предоставляет целый ряд заготовок (prefabs).

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

    Unity предоставляет пакет Sample Assets в Asset Store (bit.ly/1twX0Kr), который содержит кросс-платформенный диспетчер ввода, элементы управления для контроля джойстиков на мобильных устройствах, некоторые анимации, эффекты частиц и, что самое важное, ряд заранее скомпилированных контроллеров персонажей.

    В Unity (версии 4.6 на момент написания этой статьи) также включены некоторые более старые ресурсы. Эти ресурсы теперь распространяются как отдельный пакет, который Unity может обновлять индивидуально. Вместо написания всего кода для создания в игре персонажа от первого или третьего лица или даже самостоятельно движущегося автомобиля вы можете просто использовать заготовки (prefabs) из ресурсов-образцов. Перетащите заготовку в свою сцену и вы моментально получите персонаж с видом от третьего лица со множеством анимаций и полным доступом к исходному коду, как показано на рис. 3.

    Заготовка персонажа от третьего лица


    Рис. 3. Заготовка персонажа от третьего лица

    Анимации

    Системе анимации Mecanim в Unity можно было бы посвятить целую книгу (и такая книга уже написана, кстати). Анимации в 3D, как правило, сложнее, чем в 2D. В 2D файл анимации обычно изменяет спрайт для рендеринга в каждом ключевом кадре. В 3D данные, связанные с анимацией, гораздо сложнее. Вспомните: в предыдущей статье я говорил, что файлы анимации содержат ключевые кадры. В 3D может быть много ключевых кадров, каждый из которых содержит массу точек данных для движений пальцев, руки или ноги или для выполнения любого количества и типа перемещений. Кроме того, меши могут определять кости в них и использовать компоненты, называемые рендерами мешей со скинами (skinned mesh renderers), которые деформируют меши на основе того, как движутся кости; это во многом напоминает то, как движутся живые существа.

    Файлы анимации обычно создаются в сторонней системе моделирования/анимации, хотя их можно создавать и в Unity.

    Контроллер анимации для управления состояниями анимации персонажа


    Рис. 4. Контроллер анимации для управления состояниями анимации персонажа

    Помните, что персонажи и анимации можно получать из Unity Asset Store, создавать с помощью средств моделирования и использовать сторонние продукты вроде Fuse от Mixamo, которые позволяют быстро генерировать адаптированные под ваши потребности персонажи. Просмотрите мои видеоролики на Channel 9 — они дадут вам начальное представление об анимации в Unity.

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

    В Unity встроена система террейнов для генерации миров. Можно создать террейн, а затем использовать имеющиеся инструменты для приданию террейну нужных форм, создания гор, размещения деревьев и травы, рисования текстур и др. Можно добавить в мир небо, импортировав пакет скайбоксов (Assets | Import Package | Skyboxes) и назначив их в Edit | Render Settings | Skybox Material. У меня ушло около пары минут на создание террейна с динамической отражающей водой, деревьями, песком, горами и травой (рис. 5).

    Быстро созданный террейн


    Рис. 5. Быстро созданный террейн

    Системы координат в Unity

    В Unity есть четыре метода для ссылки на какую-либо точку в игре или на экране (рис. 6). Существует экранное пространство, диапазон которого простирается от 0 до количества пикселей; оно обычно используется для получения местоположения, где пользователь коснулся экрана или щелкнул мышью.

    Пространство области просмотра (viewport space) — просто значение от 0 до 1, благодаря которому можно сообщить, что полпути — это .5, а не делить пиксели на 2. Поэтому я могу разместить объект посреди экрана, указав в качестве его позиции координаты (.5, .5).

    Мировое пространство (world space) относится к абсолютному позиционированию объекта в игре на основе трех координат: (0, 0, 0). Все игровые объекты верхнего уровня в сцене имеют свои координаты, перечисленные в мировом пространстве.

    Наконец, локальное пространство (local space) всегда относительно родительскому игровому объекту. В случае игрового объекта верхнего уровня оно идентично мировому пространству. Все дочерние игровые объекты перечисляются в Editor с координатами относительно их предку, поэтому, например, в вашей модели у дома могут быть мировые координаты (200, 0, 35), тогда как у его передней двери (предполагая, что это дочерний игровой объект, принадлежащий дому) — только (1.5, 0, 0), поскольку они относительны предку. В коде, когда вы ссылаетесь на transform.position, всегда используются мировые координаты, даже если это дочерний объект. В данном примере у двери были бы мировые координаты (201.5, 0, 35), но, если вместо этого вы ссылаетесь на transform.localPosition, вы получили бы (1.5, 0, 0). В Unity есть функции для преобразований между различными системами координат.

    Координаты в Unity


    Рис. 6. Координаты в Unity

    Screen space: Экранное пространство:
    Viewport space: Пространство области просмотра:
    World space: Мировое пространство:

    Потоки и сопрограммы

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

    Физика и обнаружение коллизий

    Физика и средства обнаружения коллизий в 3D почти такие же, как в 2D, с тем исключением, что коллайдеры имеют другую форму и у компонента rigidbody есть несколько других свойств, таких как способность свободного вращения или перемещения по осям X, Y и Z. В 3D теперь имеется коллайдер меша, который обертывает всю фигуру модели как зону распознавания коллизии. Звучит грандиозно, и для коллизий это все весьма хорошо, но плохо для производительности. В идеале, нужно упростить формы коллайдеров и ограничить процессорные ресурсы, необходимые для их использования. У вас есть зомби? Нет проблем — используйте коллайдер капсулы (capsule collider). Сложный объект? Используйте несколько коллайдеров. По возможности избегайте коллайдера меша.

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

    Методов гораздо больше, чем перечислено здесь, в частности есть методы OnTriggerExit и OnCollisionExit, почти идентичные своим аналогам в 2D.

    Создание объектов

    Когда вам нужно создать в период выполнения новые элементы на основе GameObject, не пользуйтесь конструкторами. Вместо них применяйте Instantiate. У вас определенно могут быть классы с конструкторами, которые в скриптах неявно наследуются от MonoBehavior; это происходит во всех скриптах верхнего уровня, назначенных любому GameObject. Однако эти скрипты могут вызывать конструкторы для других объектов:

    Эффекты частиц

    Если вы хотите, чтобы у вас были мерцающие звезды, пыль, снег, взрывы, огонь, туман, поднимающийся от водопада, всякие кровавые и другие эффекты, нужно использовать эффект частиц (particle effect). В Unity есть старая система частиц и более новая, лучше оптимизированная — Shuriken. С помощью Shuriken в Unity можно делать массу потрясающий вещей, в том числе заставить падающие частицы поддерживать коллизии. Поскольку на этот счет существует множество учебных пособий, например по ссылке bit.ly/1pZ71it, и эффекты, как правило, создаются в Editor с дизайнером, здесь я просто покажу, как можно создавать их экземпляры, когда, скажем, некий персонаж попадает в область триггера монеты, которую он должен подобрать.

    Чтобы начать работу с частицами, выберите Game Object | Particle System и вы сразу же увидите, что в вашу сцену добавлен один из эффектов, как на рис. 8.

    Эффект частиц


    Рис. 8. Эффект частиц

    Я предпочитаю создавать из своих систем частиц заготовки (о которых я рассказывал во второй статье), чтобы их можно было легко использовать повторно. Достаточно создать их экземпляры в коде, сначала назначив скрипт игровому объекту (предполагая, что его класс наследует от MonoBehavior, как и все компоненты script игровых объектов), а затем перетащив нужный эффект частиц в Editor из сцены или заготовки в проект, например, на предоставляемое свойство SmokeEffect (рис. 9).

    Рис. 9. Предоставляемое свойство SmokeEffect

    Создание UI

    В Unity 4.6 добавили совершенно новую систему UI для создания элементов HUD (heads-up display) в игре с использованием текста, панелей, виджетов и др. Добавление текста в HUD вашей игры сводится к выбору GameObject | UI | Text и заданию шрифта и текста. Если вам нужно позднее управлять текстом в коде, например для обновления счета, вы просто используете:

    Если мне требуется некое изображение в UI, я открываю GameObject | UI | Image и назначаю спрайтовое 2D-изображение этому новому компоненту. Значения задаются, как и в случае любого другого игрового объекта. Надеюсь, что к этому моменту вы уже заметили шаблон. Чтобы создать простой GUI, создайте UI-объекты через меню GameObject | UI, укажите начальные значения в Editor и позже контролируйте их, получая ссылки на данные UI-компоненты и изменяя значения или даже анимируя их. Я сформировал базовый GUI, показанный на рис. 10, создав элементы под новым компонентом Canvas. Новая UI-система в Unity 4.6 содержит ряд базовых типов объектов, таких как Panel, Button, Text, Image, Slider, Scrollbar и Toggle, и с ними невероятно легко работать при создании UI.

    UI с изображением и текстов в HUD


    Рис. 10. UI с изображением и текстов в HUD

    Искусственный интеллект в вашей игре

    Заключение

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

    Когда я только начинал разрабатывать игры, я едва не сошел с ума в поисках множества моделей и текстур в Интернете. В Интернете есть некоторые великолепные торговые площадки, предлагающие такие ресурсы, но вы быстро поймете, что не все они годятся для игр. Как-то раз я скачал модель небольшого валуна, в которой оказалось почти 100 000 вершин! Ищите ресурсы, оптимизированные под мобильные устройства, или проверяйте количество вершин/многоугольников, чтобы они гарантированно работали в ваших играх. А иначе они значительно замедлят вашу игру. Существуют средства оптимизации моделей, в том числе Cruncher, включенный в Unity. В следующей статье я рассмотрю, как перенести игру или приложение из Unity на платформу Windows. Заходите в мой блог на Channel 9 (aka.ms/AdamChannel9), где я периодически выкладываю свои учебные видеоролики и ссылки на различный контент для скачивания.

    Выражаю благодарность за рецензирование статьи экспертам Мэтту Ньюмену (Matt Newman) из Subscience Studios и Тоутвидасу Цилису (Tautvydas Žilys) из Unity.

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