Как ограничить скорость падения rigitbody unity?
Хочется, чтобы на тело действовала физика падения(гравитация), но скорость падения была ограниченна. Думаю это можно как-то аккуратно сделать через трение, но не знаю как оно точно работает. Из школьной физики знаю, что сила трения о воздух может быть как линейно зависима от скорости падения, так и квадратично. В общем хочется увидеть конкретную реализацию ограничения скорости.
PS костыль if(abs(rv.velocity.y) > max_vel) rb.velocity.y = max_vel не подойдёт. Из-за такого вмешательства в физику тело при падении начинает немного дёргать, и это неуместно в моей задаче.
Ответы (4 шт):
Там, где вы считаете изменение скорости за счёт гравитации
Vy = Vy - g * dt
добавьте противодействие силы сопротивления воздуха
Vy = Vy - g * dt - Sign(Vy) * k * ro * S * Vy * Vy / 2
Sign - функция знака аргумента (-1;0;1 для отрицательных, нуля, положительных, Math.Sign в шарпе)
k - некий коэффициент (для достоверности можно подобрать его таким, что установившая скорость падения тела массой 100 кг и площадью 0.25 м^2 составит 50 м/c)
ro - плотность воздуха
S - площадь поперечного сечения тела
Зачем Sign? - чтобы учесть, что сила сопротивления всегда действует против направления движения.
У Rigidbody есть настройка Drag. Чем больше значение, тем меньше скорость.
Второй вариант - попробуй засунуть в FixedUpdate()
rigidbody.velocity = Vector3.ClampMagnitude(rigidbody.velocity, maxVelocity);
но лучше воспользуйся первым вариантом.
[RequireComponent(typeof(Rigidbody))]
public class Foo : MonoBehaviour
{
[SerializeField] float _maxFallSpeed = -10;
private Rigidbody _rigidbody;
private void Awake ()
{
_rigidbody = GetComponent<>(Rigidbody);
}
private void FixedUpdate ()
{
if (_rigidbody.velocity.y < _maxFallSpeed)
_rigidbody.velocity = new Vector3(rigidbody.velocity.x, _maxFallSpeed, rigidbody.velocity.z);
}
}
Есть вот такой метод.
Но он, правда, ограничивает скорость объекта во всех направлениях, может вам подойдет.
Проверить достигает ли твоя скорость предела. Это то что указывается в speed твоего Rigidbody. Найти эту скорость можно через RigidBody.velocity.magnitude
Соответственно теперь проверять является ли скорость больше максимальной? Если да то нормализовать скорость, и умножить на максимальную скорость. В таком варианте при любом движении физическая скорость не будет выше максимальной Текст из ответа по ссылке.
if (_rigidBody.velocity.magnitude >= maxVelocity)
{
_rigidBody.velocity = _rigidBody.velocity.normalized * maxVelocity;
}