Как сделать притяжение в unity

Добавил пользователь Дмитрий К.
Обновлено: 29.08.2024

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

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

Я просто хочу установить гравитацию для 1 игрового объекта.

Поскольку вы делаете 2D-игру, я предполагаю, что ваш GameObject имеет подключенный компонент Rigidbody2D. Установите масштаб гравитации на 0. Также приложите ConstantForce2D к вашему GameObject и примените силу тяжести -> X. Чтобы получить такое же усилие, как и гравитация, вам нужно умножить свою гравитацию (вероятно, 9.81) на массу вашего GameObject. Если ваша пользовательская гравитация или масса GameObject время от времени меняются, убедитесь, что вы вычислили это в своем методе обновления, а затем примените его к компоненту ConstantForce2D. Это может выглядеть примерно так:

Приветствую всех друзья! В прошлой статье я рассказал о настройках графики в окне настроек проекта. Сегодня я продолжу цикл статей о настройках проекта, и на очереди у нас вкладка настройки физики для 3D проектов.

Используйте настройки физики (находятся в окне настроек проекта по пути Edit\Project Settings , вкладка Physics ), чтобы применить глобальные настройки для 3D физики. Для управления 2D физикой используйте вкладку Physics 2D , следующую статью я как раз посвящу ей.

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

  • Gravity – используйте оси X, Y и Z чтобы задать величину силы тяжести, приложенный ко всем компонентам RigidBody . Для реалистичных настроек гравитации примените отрицательное число к оси Y . Гравитация определяется в мировых единицах на квадрат в секунду. Если вы увеличиваете гравитацию, вам также может потребоваться увеличить значение параметра Default Solver Iterations для поддержания стабильных контактов.
  • Default Material – установите ссылку на физический материал по умолчанию, который будет использоваться, если он не был назначен отдельному коллайдеру.
  • Bounce Threshold – Установите значение скорости. Если два сталкивающихся объекта имеют относительную скорость ниже этого значения, они не отскакивают друг от друга. Это значение также уменьшает дрожание, поэтому не рекомендуется устанавливать его на очень низкое значение.
  • Sleep Threshold – установите глобальный порог энергии, ниже которого не кинетический Rigidbody (то есть тот, который не контролируется физической системой) может заснуть. Когда Rigidbody спит, он не обновляется каждый кадр, что экономит ресурсы системы. Если кинетическая энергия RigidBody деленная на его массу, находится ниже этого порога, то оно является кандидатом на сон.
  • Default Contact Offset – установите расстояние обнаружения столкновения, которое система использует для генерации контакта при коллизии. Значение должно быть положительным, и если оно установлено слишком близко к нулю, это может вызвать дрожание. По умолчанию это значение равно 0,01 . Коллайдеры генерируют контакты при столкновении только в том случае, если их расстояние меньше суммы значений смещения контактов.
  • Default Solver Iterations - определите, сколько процессов решателя ( solver ) Unity выполняется при каждом физическом кадре. Решатели - это небольшие задачи физического движка, которые определяют ряд физических взаимодействий, таких как движение суставов ( joints ) или управление контактом между перекрывающимися компонентами RigidBody . Это свойство влияет на качество выходных данных решателя, и рекомендуется изменить его в случае, если свойство Time.fixedDeltaTime установлено в значение не по умолчанию, или конфигурация является очень требовательной. Как правило, он используется для уменьшения дрожания, возникающего в результате стыков или контактов.
  • Default Solver Velocity Iterations - установите, сколько процессов скорости ( velocity ) выполняет решатель в каждом физическом кадре. Чем больше процессов выполняет решатель, тем выше точность результирующей скорости выхода после отскока RigidBody . Если вы испытываете проблемы с сочлененными компонентами RigidBody или регдолами ( Ragdolls ), слишком сильно движущимися после столкновений, попробуйте увеличить это значение.
  • Queries Hit Backfaces - включите этот параметр, если вам нужны запросы физики (например, Physics.Raycast ) для обнаружения попаданий с обратной стороны треугольников у MeshColliders . По умолчанию этот параметр отключен.
  • Queries Hit Triggers - включите эту опцию, если вы хотите, чтобы физические тесты попадания (такие как Raycasts, Sphere Casts или Sphere Tests ) возвращали попадание, когда они пересекаются с коллайдером, помеченным как триггер. Отдельные рейкасты могут переопределить это поведение. По умолчанию этот параметр включен.
  • Enable Adaptive Force - включите эту опцию, чтобы включить адаптивную силу. Адаптивная сила влияет на то, как силы передаются через кучу или стопку объектов, чтобы дать более реалистичное поведение. По умолчанию этот параметр отключен.
  • Contacts Generation - выберите метод генерации контактов.
  1. Legacy Contacts Generation - до Unity 5.5 Unity использовала метод генерации контактов, основанный на теореме о разделительной оси ( SAT . PCM более эффективен, но для более старых проектов, возможно, Вам будет проще продолжать использовать SAT , чтобы избежать необходимости немного изменить физику. PCM может привести к немного отличному от SAT отскоку, а также уменьшить количество бесполезных контактов, которые окажутся в буферах контактов (то есть массивы, которые вы получаете при столкновении коллайдеров и которые передаются в OnCollisionEnter, OnCollisionStay и OnCollisionExit ). Совет по обновлению: чтобы перенести проект, созданный с Unity 2018.2 или ниже, возможно, потребуется обновить скрипты для работы с кодом, который работает с выбором контактов.
  2. Persistent Contacts Manifold (PCM) - каждый физический кадр генерирует меньше контактов, и больше контактных данных совместно используется между кадрами. Путь генерации контактов PCM также является более точным и обычно обеспечивает лучшую обратную связь при столкновении в большинстве случаев. Это значение по умолчанию.
  • Auto Simulation - включите этот параметр, чтобы автоматически запустить физическую симуляцию или разрешить явный контроль над ней.
  • Auto Sync Transforms - включите этот параметр, чтобы автоматически синхронизировать изменения преобразований с физической системой всякий раз, когда компонент Transform изменяется.
  • Reuse Collision Callbacks – включение данного параметра определяет, должен ли сборщик мусора повторно использовать только один экземпляр типа Collision для всех обратных вызовов collision . Включение данного параметра повышает производительности, если вы используете в коде методы обнаружения коллизий.
  • Cloth Gravity – установите силу тяжести для всех компонентов ткани.
  • Contact Pairs Mode - выберите тип используемой генерации контактных пар.
  1. Default Contact Pairs - прием столкновений и триггерных событий от всех контактных пар, кроме кинематико-кинематических ( kinematic с kinematic ) и кинематико-статических ( kinematic с static ) пар.
  2. Enable Kinematic Kinematic Pairs - прием столкновений и триггерных событий от кинематических-кинематических ( kinematic с kinematic ) контактных пар.
  3. Enable Kinematic Static Pairs - прием столкновений и триггерных событий от кинематико-статических ( kinematic с static ) контактных пар.
  4. Enable All Contact Pairs - получайте события столкновения и триггера от всех пар контактов.
  • Broadphase Type - выберите, какой широкофазный алгоритм использовать в физическом моделировании. Смотрите документацию NVIDIA по PhysX SDK и столкновению жестких тел .
  1. Sweep and Prune Broadphase - используйте метод развертки и обрезки broadphasecollision (то есть сортировку объектов вдоль одной оси, чтобы исключить необходимость проверки пар, которые находятся далеко друг от друга).
  2. Multibox Pruning Broadphase – много квадратная обрезка использует сетку, и каждая ячейка сетки выполняет развертку и обрезку. Это обычно помогает улучшить производительность, если, например, есть много игровых объектов в плоском мире.
  3. Automatic Box Pruning – этот алгоритм доступен с Unity 2019.3 и выше. Он похож на алгоритм Много квадратной обрезки, который я описал выше, но он может вычислять мировые границы и количество подразделений автоматически.
  • World Bounds - определите двумерную сетку, которая окружает мир, чтобы предотвратить влияние удаленных объектов друг на друга при использовании алгоритма Много квадратной обрезки широкой фазы (точного перевода этого алгоритма я так найти и не смог, поэтому прошу прощения за столь вольный и корявый перевод, на родном языке этот алгоритм называется Multibox Pruning Broadphase algorithm ). Этот параметр используется только при установке параметра BroadphaseType в значение Multibox Pruning Broadphase .
  • World Subdivisions - количество ячеек вдоль осей X и Z в алгоритме 2D-сетки. Этот параметр используется только при установке параметра BroadphaseType в значение Multibox Pruning Broadphase .
  • Friction Type - выберите алгоритм трения, используемый для моделирования физики.
  1. Patch Friction Type - базовый алгоритм сильного трения, который обычно приводит к наиболее стабильным результатам при низком количестве итераций решателя. Этот метод использует только до четырех скалярных ограничений решателя на пару соприкасающихся объектов.
  2. One Directional Friction Type - упрощение модели Кулоновского трения, в которой трение для данной точки контакта применяется в чередующихся касательных направлениях нормали контакта. Уменьшает число итераций, необходимых для сходимости, но не является столь точным, как двухнаправленная ( Two Directional ) модель.
  3. Two Directional Friction Type - как и однонаправленная ( One Directional ) модель, но трение применяется одновременно в обоих касательных направлениях. Это требует больше итераций решателя, но является более точным. Более дорогой, чем базовый алгоритм трения ( Patch Friction ) для скриптов с большим количеством точек соприкосновения, потому что он применяется в каждой точке соприкосновения.
  • Enable Enhanced Determinism - имитация на сцене является последовательной независимо от присутствующих актеров ( actors ), при условии, что игра вставляет актеров в детерминированном порядке. Этот режим жертвует некоторой производительностью, чтобы обеспечить этот дополнительный детерминизм.
  • Enable Unified Heightmaps - включите эту опцию для обработки рельефа местности (на Terrain ) коллизии точно так же, как и MeshColissions .
  • Solver Type – выберите тип физического решателя.
  1. Projected Gauss Seidel – стандартный решатель в Unity который подходит под большинство задач. Он выбран по умолчанию.
  2. Temporal Gauss Seidel – с этим видом решателей суставы ( joints ) более устойчивы к перенапряжению и различным сбоям.
  • Default Max Angular Speed – этот параметр задает максимальную угловую скорость по умолчанию.
  • Layer Collision Matrix - определите, как ведет себя система обнаружения столкновений на основе слоев. Выберите, какие слои матрицы столкновений взаимодействуют с другими слоями, проверив их.
  • Cloth Inter-Collision – включает взаимное столкновение тканей.
  1. Distance - определите диаметр сферы вокруг каждой встречной частицы ткани. Unity гарантирует, что эти сферы не пересекаются во время моделирования. Расстояние должно быть меньше, чем наименьшее расстояние между двумя частицами в конфигурации. Если расстояние больше, столкновение ткани может нарушить некоторые ограничения расстояния и привести к дрожанию.
  2. Stiffness - насколько сильным должен быть разделительный импульс между взаимодействующими частицами ткани. Решатель ткани вычисляет это, и этого импульса должно быть достаточно, чтобы держать частицы разделенными

На сегодня это все. Следующая статья будет посвящена вкладке Physics 2D в окне настроек проекта в Unity. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!

Итак, урок посвящен частицам в Unity3d. Предназначен скорее для новичков, но каждый, думаю, найдет что-то для себя интересное. Движок сегодня очень популярен и не осваивает его только ленивый. К тому же проект, над которым я сейчас работаю мы делаем тоже на Юнити.

Пару вводных фраз о самих эффектах, чтобы понимать что к чему куда и как. Мое личное мнение, что 70% отлично выглядящего эффекта составляет правильно сделанная, качественная текстура. Сюда же входят цвета, наилучшим образом передающие суть эффекта, ее размер, анимированная она или нет, с альфа каналом или без. Текстура всегда должна быть оптимальной. К примеру, нет смысла делать маленькую искру на листе 256х256. Тут достаточно 8х8 или 16х16. Оставшиеся 30% успеха создаются умело настроенным поведением частиц. Чтобы развить этот навык – смотрите больше референсов, подмечайте различные эффекты в жизни, в кино, в играх. Изучайте физику вещей. Очень хороши замедленные съемки всякого рода взрывов, выстрелов, горящего огня и т.д.
Начнем. Перед тем, как настраивать эффект необходимо определиться из каких частей он будет состоять. В нашем примере – это пламя, искры, дым и немного искажения в стиле горячего воздуха в пустыне . Всегда помните, что чем проще и оптимальнее эффект, тем больше их можно использовать на сцене и тем меньше все будет тормозить. Далее мы определяемся с общим видом эффекта – что это будет. Собираем референсы, изучаем, как ведет себя огонь в горящих бочках, что там горит – это дает понимание какой будет дым по цвету и по интенсивности. Бывает неплохо набросать эффект, несколько фаз его развития на бумаге, чтобы понимать что делать. Своеобразная раскадровка.
Запускаем Юнити. У меня версия 4.1. В какой-то из предыдущих версий была переделана система частиц, поэтому на очень старых версиях редактора урок может быть не актуален. Из меню выбираем GameObject>Create Other>Particle System. У нас появилась система частиц с летящими белыми пятнами. В правом нижнем углу вьюпорта должно появиться маленькое окошко, которое помогает запускать симуляцию эффектов, останавливать их, ставить на паузу, менять скорость проигрывания (ВНИМАНИЕ! Скорость самого эффекта изменяется не здесь).Это позволяет отловить различные артефакты и косяки при очень быстрых эффектах, например выстрел. Чтобы понимать размер эффекта относительно мира я рекомендую настраивать на уже готовых объектах. В нашем случае – это бочка. Ставим бочку в координаты 0,0,0, вводя их в свитке Inspector в окошки сабсвитка Transform. Если свитка нет, то в меню Window включите его, а так же свиток Hierarchy. Далее выбираем нашу Particle System и ставим ее так же в 0,0,0. И чуть поднимаем вверх, чтобы огонь горел не на самом дне, а начинался чуть выше. Систему частиц можно переименовать, кликнув по ней в свитке Hierarchy и нажав F2. Я назвал нашу систему частиц FireMetalBarrelы.

ОГОНЬ

рис. 002 Выбирать эмитеры(после того, как Вы их создали, конечно) можно в свитке Hierarchy.

Первое, что мы должны сделать, чтобы увидеть не дефолтные белые шарики, а нужную текстуру – это сделать материал и текстуру огня. Сразу оговорюсь, что делать текстуры то еще развлечение. Достаточно долгая и кропотливая работа. Но как я уже говорил – это стоит того в итоге. Я использую свои давние наработки, которые я делал для игры Deep Black. Для текстур огня и дыма я использовал FumeFX плагин для 3dsmax. Моделировал различные взрывы, интенсивность, направления и т.д. Потом рендерил в серии кадров. Так я получал различной интенсивности и размера огненные всполохи. С дымом чуть проще. Как? Расскажу позже.

Итак, чтобы создать новый материал достаточно кликнуть правой кнопкой по любому месту в папке Materials (для моего проекта)

Возвращаемся в наш редактор частиц, выбираем эмитер FireMetalBarrel и сразу же переходим в самый нижний сабсвиток Renderer. Ставим галочку (это значит, что он не будет игнорироваться и будет активен ) и разворачиваем его кликом по нему. Render Mode оставляем Billboard. Это значит, что при любом угле обзора текстуры частиц всегда будут направлены в камеру. Снимаем галочки Cast и Receive Shadows так как шейдер материалов, типа Particles не принимает тени и не отбрасывает их. Перетаскиваем наш заготовленный материал в строчку Material и видим что-то отдаленно похожее на огонь. Материал можно так же назначить выбрав его из всех доступных, нажав маленький кружок обведенный зеленым цветом.

Возвращаемся в начало нашего свитка FireMetalBarrel и начинаем настраивать один сабсвиток за другим. Сразу подскажу, что наведя мышку на любой параметр вы увидите всплывающую краткую подсказку о том, что он значит и как работает. Все настроенные параметры я приведу на скриншотах. У некоторых параметров есть опции – они обозначены маленькими черными треугольничками справа от параметра. Constant -постоянная величина, Curve – изменение параметра по кривой, например размер от малого к большому и опять к малому. Random between two constants – случайное значение в промежутке от одного до другого указанных значений. Random between two curves – то же, что и предыдущее, только крайними значениями выступают кривые.

Опишу действие параметров:

Duration – общая продолжительность эффекта. Как показала практика особо не влияет при зацикленных эффектах.

Looping – зацикленность

Prewarm – как бы прогрев эффекта, чтобы он начался уже с основной интенсивностью

Start Delay – задержка в старте проигрывания в секундах

Start Lifetime – Время жизни в секундах

Start Speed – скорость, с которой стартуют частицы

Start Rotation – стартовая повернутость частицы на определенный градус. В нашем случае от 0 до 360.

Start Color – стартовый цвет. Можно регулировать по альфе или по цвету.

Gravity Multiplier – множитель гравитации. 9,82 м/c– гравитация для планеты Земля.

Inherit Velocity – наследуемая скорость для следующих частиц.

Simulation Space – система координат. В нашем случае – world. При Local позволяет частицам перемещаться вместе с эмитером, как например, двигатель космолета. При world – частицы ведут себя, как факел, который несут, т.е. отстают от эмитера.

Play on Awake – частицы стартуют автоматически.

Max Particles – максимальное кол-во частиц одновременно проигрываемых из этого эмитера.

Emission

Rate – количество частиц генерируемое в секунду.

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

Shape

Shape – форма эмитера. Конус, сфера, полусфера, бокс, меш.

Angle – угол разброса. В нашем случае 15 градусов.

Radius – радиус эмитера.

Emit from – откуда генерируются частицы. Из одной точки, из всего тела эмитера и т.д.

Random Direction – Задает случайное направление движения частиц. Помогает создать некую мелкую хаотичность в нашем случае с генерацией языков пламени.

Velocity over Lifetime

Параметр позволяет рандомайзить скорость движения частиц в течение их жизни. В нашем случае система координат world и направление вверх, т.е. по Y. Случайная скорость от 0.5 до 1. Получается, что языки пламени движутся с разной скоростью.

Force over Lifetime

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

Color over lifetime

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

рис. 007 Тут можно регулировать цвета и альфаканал.

Rotation over Lifetime

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

ДЫМ.

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

и с материалом (текстурой дыма). Копируем так – выбираем наш эмитер огня FireMetalBarrel, нажимаем Ctrl+D переименовываем в Smoke и перетаскиваем новый эмитер прямо на FireMetalBarrel, чтобы эмитер Smoke стал дочерним объектом и все они вместе образовывали иерархию. Все это делается в свитке Hierarchy. Подробнее хочу остановиться на том, как сделать текстуру дыма. Тут я не использовал никаких плагинов – только старый добрый Фотошоп и Гугл . Ищем картинку одинокого облака в Гугле. Я нашел вот такую

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

Кстати я рекомендую стараться делать все текстуры кратные степени двойки по сторонам, типа 128х128, 1024х512, 64х16 и т.д. Это сэкономит Вам уйму времени, если надумаете использовать их потом еще в других проектах.
Создаём новый материал Smoke и настраиваем его по образу и подобию материала огня с той разницей, что используем немного другой шейдер и другую текстуру.

Вводим параметры, как показано на рисунке 008.

ИСКРЫ.

Искры, по сути, тот же клонированный огонь с измененными параметрами и другим материалом. Назовем этот эмитер Spark. Настройки для него показаны на рис. 012.

Текстуру можете сделать в Фотошопе – это маленькая точка или точка с небольшим свечением вокруг. Размер текстуры, как я уже говорил в начале 16х16 или около того. Шейдер – Particles/Additive.

ГОРЯЧИЙ ВОЗДУХ.

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

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

Ну и финальный результат смотрите на видео:

Да, с появлением Сюрикена, работать с частицами в Юнити стало удобнее и приятнее) Хороший урок, многим будет полезен.

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

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

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

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

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

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

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