unity3d
физика
Поиск…
Rigidbodies
обзор
Компонент Rigidbody дает GameObject физическое присутствие на сцене в том, что он способен реагировать на силы. Вы можете применить силы непосредственно к GameObject или позволить ему реагировать на внешние силы, такие как гравитация, или другой Rigidbody, ударяющий по нему.
Добавление компонента Rigidbody
Вы можете добавить Rigidbody, нажав Component> Physics> Rigidbody
Перемещение объекта Rigidbody
Рекомендуется, если вы примените Rigidbody к GameObject, который использует силы или крутящий момент, чтобы переместить его, а не манипулировать его Transform. Для этого используйте AddForce()
или AddTorque()
:
// Add a force to the order of myForce in the forward direction of the Transform.
GetComponent<Rigidbody>().AddForce(transform.forward * myForce);
// Add torque about the Y axis to the order of myTurn.
GetComponent<Rigidbody>().AddTorque(transform.up * torque * myTurn);
масса
Вы можете изменить массу объекта GameGuide, чтобы повлиять на то, как он реагирует на другие Rigidbodies и силы. Более высокая масса означает, что GameObject будет иметь большее влияние на другие основанные на физике GameObjects и потребует большей силы для перемещения. Объекты различной массы будут падать с одинаковой скоростью, если они имеют одинаковые значения перетаскивания. Чтобы изменить массу в коде:
GetComponent<Rigidbody>().mass = 1000;
Тащить, тянуть
Чем выше значение перетаскивания, тем больше объект будет замедляться при перемещении. Подумайте об этом как о противостоянии. Чтобы изменить перетаскивание кода:
GetComponent<Rigidbody>().drag = 10;
isKinematic
Если вы отметите Rigidbody как Kinematic, то это не может быть затронуто другими силами, но все равно может повлиять на другие GameObjects. Изменить код:
GetComponent<Rigidbody>().isKinematic = true;
Ограничения
Также возможно добавить ограничения для каждой оси, чтобы заморозить положение или вращение Rigidbody в локальном пространстве. По умолчанию используется RigidbodyConstraints.None
как показано здесь:
Пример ограничений в коде:
// Freeze rotation on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation
// Freeze position on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition
// Freeze rotation and motion an all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll
Вы можете использовать побитовый оператор OR |
для объединения нескольких ограничений:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
Столкновения
Если вы хотите, чтобы GameObject с Rigidbody на нем реагировал на столкновения, вам также нужно добавить к нему коллайдер. Типы коллайдера:
- Коллайдер коробки
- Сферный коллайдер
- Капсульный коллайдер
- Коллайдер колес
- Мешевый коллайдер
Если вы применяете несколько коллайдеров к GameObject, мы называем это сложным коллайдером.
Вы можете сделать коллайдер в триггере , чтобы использовать OnTriggerEnter()
, OnTriggerStay()
и OnTriggerExit()
. Триггерный коллайдер физически не реагирует на столкновения, другие GameObjects просто проходят через него. Они полезны для обнаружения, когда другой GameObject находится в определенной области или нет, например, при сборе элемента, мы можем захотеть просто запустить его, но обнаружить, когда это произойдет.
Гравитация в жестком теле
Свойство useGravity
RigidBody
контролирует, влияет ли на него гравитация или нет. Если установлено значение false
RigidBody
будет вести себя так, как если бы в космическом пространстве (без постоянной силы, применяемой к нему в некотором направлении).
GetComponent<RigidBody>().useGravity = false;
Это очень полезно в ситуациях, когда вам нужны все другие свойства RigidBody
кроме движения, управляемого гравитацией.
Когда включено, на RigidBody
будет влиять гравитационная сила, созданная в разделе « Physics Settings
:
Гравитация определяется в мировых единицах в секунду в квадрате и вводится здесь как трехмерный вектор: это означает, что с настройками в изображении примера все RigidBodies
с свойством useGravity
установленным в True
будут испытывать силу в 9,81 единиц в секунду в секунду в направлении вниз (как отрицательные значения Y в системе координат Unity вниз).