Unity 6.3
0 онлайн 68 гостей 3 в системе
Вход

Rigidbody2D.Slide

Declaration

public Rigidbody2D.SlideResults Slide(Vector2 velocity, float deltaTime, Rigidbody2D.SlideMovement slideMovement);

Параметры

Параметр Описание
скорость Скорость, используемая при скольжении Rigidbody2D.
deltaTime Время для интеграции velocity закончилось.
slideMovement Конфигурация управления, как слайд должен быть выполнен.

Возвращаемое значение

SlideResults Результаты движения слайда.

Описание

Сдвиньте Rigidbody2D с помощью указанного velocity интегрированного через deltaTime с помощью конфигурации, указанной slideMovement.

Этот метод обеспечивает достаточно сложное перемещение с помощью минимального API. Оно включает скольжение вдоль поверхностей в заданном диапазоне углов наклона, привязку к поверхности, действие гравитации и соскальзывание со склонов при определённых углах. Все контакты обрабатываются автоматически. Метод может перемещать объект Rigidbody2D с любым типом тела: немедленно изменять его положение, откладывать изменение положения до шага симуляции либо только возвращать рассчитанное положение.

Ниже приведено полное описание логики этого механизма:

Объект Rigidbody2D можно переместить с указанной velocity, проинтегрированной за указанный интервал deltaTime. При этом любой контакт с другими объектами Collider2D приводит к соответствующему изменению направления (скорости) без учёта трения и отскока. Такое изменение направления с последующим продолжением движения на оставшейся после контакта скорости называется «скольжением». Это одна итерация скольжения. Скольжение происходит, только если угол наклона поверхности меньше значения, заданного свойством Rigidbody2D.SlideMovement.surfaceSlideAngle. Максимальное допустимое количество итераций скольжения задаётся свойством Rigidbody2D.SlideMovement.maxIterations.

Во время итерации скольжения скорость перемещения может увести объект Rigidbody2D от поверхности объекта Collider2D. Это происходит, например, когда скольжение проходит по небольшому пандусу или при движении вниз по склону направлено от поверхности. Зачастую такое поведение нежелательно. Чтобы его предотвратить, свойство Rigidbody2D.SlideMovement.surfaceAnchor позволяет для каждой итерации задать направление и расстояние поиска поверхности. Благодаря этому скользящий объект может постоянно оставаться «привязанным» к поверхности, даже если скорость направляет его от неё. Если такое поведение не требуется, свойству Rigidbody2D.SlideMovement.surfaceAnchor можно присвоить значение Vector2.zero.

Скольжение выполняется в несколько итераций, пока не будет соблюдено одно из двух условий:

  • Было достигнуто максимальное количество итераций, контролируемых Rigidbody2D.SlideMovement.maxIterations.
  • Расстояние, на котором должно быть выполнено повторное напоминание, достигло нуля (определяемого величиной velocity (скорости) по отношению к указанной величине deltaTime).

Когда движение слайда завершено, как определено выше, любое запрашиваемое поведение гравитации будет обработано, если указанный вектор Rigidbody2D.SlideMovement.gravity имеет величину больше нуля. В этом случае Rigidbody2D перемещается Rigidbody2D.SlideMovement.gravity в масштабе указанного deltaTime. Если движение гравитации вызывает контакт, Rigidbody2D перемещается в эту позицию.

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

  • Контактная поверхность представляет собой поверхность, угол наклона которой меньше угла скольжения, определенного в ,Rigidbody2D.SlideMovement.gravitySlipAngleи.
  • Нет изначального velocity указано i.e. нет скольжения, если движение запрашивается, так что скольжение не противодействует этому движению.

В целом, вызов метода скольжения с использованием гравитации приведет к тому, что Rigidbody2D будут двигаться под действием силы тяжести, но если velocity не указан, то Rigidbody2D будут скользить/скользить в соответствии с порогом наклона поверхности, указанным Rigidbody2D.SlideMovement.surfaceSlipAngle.

Когда описанное выше поведение завершено, новое положение Rigidbody2D было рассчитано, однако Rigidbody2D на самом деле не было перемещено на этом этапе. Именно здесь Rigidbody2D могут быть мгновенно размещены в новом положении или перемещение может быть отложено с помощью Rigidbody2D.MovePosition. Это управляется с помощью Rigidbody2D.SlideMovement.useSimulationMove. Когда это включено, используется Rigidbody2D.MovePosition, а когда отключено, Rigidbody2D мгновенно устанавливается в новом положении. Следует отметить, что как Rigidbody2D, так и Transform будут обновляться при отключении Rigidbody2D.SlideMovement.useSimulationMove, и что любая интерполяция Rigidbody2D продолжает работать, как ожидалось.

Остальные параметры конфигурации позволяют более детально контролировать функциональность слайда. Это:

Примечание: Метод скольжения может быть использован на любом RigidbodyType2D, но в основном предназначен для использования, когда Rigidbody2D является кинематическим. Никакой тип тела не будет мешать методу скольжения, но использование динамического режима может привести к неожиданным результатам, поскольку такой Rigidbody2D может иметь собственную гравитацию, силы, реакцию на столкновение и т.д. Нет никаких потерь в производительности при использовании любого типа тела, кинематического, статического или динамического, и все они действительны, если требуется. Динамический тип тела просто требует тщательной конфигурации, чтобы его присущие характеристики не вызвали конфликтное и неожиданное поведение движения.

Следующий код использует простой ввод левой/правой клавиатуры для установки относительной скорости налево или направо. Метод скольжения скользит Rigidbody2D с использованием конфигурации, указанной в SlideMovement и возвращает результаты скольжения в SlideResults:

using UnityEngine;

public class Example : MonoBehaviour { public Rigidbody2D.SlideMovement SlideMovement = new Rigidbody2D.SlideMovement(); public Rigidbody2D.SlideResults SlideResults;

public float HorizontalSpeed = 2f;

private Rigidbody2D m_Rigidbody;

void Start() { m_Rigidbody = GetComponent<Rigidbody2D>(); }

void Update() { // Calculate the horizontal velocity from keyboard input. var horizontalInput = (Input.GetKey(KeyCode.LeftArrow) ? -1 : 0f) + (Input.GetKey(KeyCode.RightArrow) ? 1f : 0f); var velocity = new Vector2(horizontalInput * HorizontalSpeed, 0f);

// Slide the rigidbody. SlideResults = m_Rigidbody.Slide(velocity, Time.deltaTime, SlideMovement); } }