Как сделать инерцию в unity

Обновлено: 05.07.2024

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.

Приветствую всех друзья! В прошлой статье я рассказал о настройках графики в окне настроек проекта. Сегодня я продолжу цикл статей о настройках проекта, и на очереди у нас вкладка настройки физики для 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. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!

Запущенная игра с управляемым персонажем

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

Я решил не заморачиваться с кодом. Так как я новичок, путевого ничего все равно не напишу. Следовательно, первое время буду использовать готовые ассеты. Устанавливать их можно из официального Asset Store Unity. Не сложнее, чем моды для игр.

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

Создание земли (Terrain)

Создать землю в Unity очень легко.

  1. Добавляем на сцену Terrain (GameObject → 3D Objects → Terrain).
  2. Выбираем ее в окне иерархии слева, а справа в Inspector открываем раздел Terrain.
  3. Здесь выбираем режим Paint Terrain (кисточка), ниже в поле выбираем Raise or Lower Terrain и начинаем рисовать себе горы и овраги доступными кистями. Настраиваем размер и просто водим кисточкой по террейну.
  4. Находим в интернете любую бесшовную текстуру травы. Здесь же, в инспекторе выбираем режим Paint Texture, создаем слой и запихиваем туда эту текстуру.

Мои зеленые горы

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

Создание персонажа (First Person Controller)

  1. Идем в Asset Store, находим готовый ассет Mini First Person Controller.
  2. Нажимаем кнопку ADD TO MY ASSETS, соглашаемся с лицензией.
  3. Далее нажимаем OPEN IN UNITY.
  4. В самом Unity у нас открывается Package Manager с этим ассетом. Нажимаем Download, ждем загрузки, затем Import, потом еще раз.
  5. Находим в корневой папке проекта новую папку First Person Controller. Заходим внутрь.
  6. Находим там болванку с названием First person controller full и просто перетаскиваем на Terrain. Немного приподнимаем над землей, чтобы не застрял.

Перетаскиваем готового персонажа на сцену

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


Рейтинг:

Novità Aprile 2019: Godot 3.1 / 3.2 / 4.0 e nascita Godot Italia

Поскольку unity3d использует Physx под поверхностью, очевидно, что они имеют одни и те же функции.

Одна из особенностей - тензор момента инерции - один Unity3D, один PhysX.

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

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

Я проверил, но не смог найти решение для вывода (я не знаю, возможно ли это).

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

Вот почему единство и физика не имеют отношения к продуктам инерции.

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

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