Скорость
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 5 из 71.
rb.linearVelocity показывает, как тело движется прямо сейчас: это Vector3 в метрах в секунду вдоль осей x, y и z. Чтение этого значения показывает, куда движется тело, а rb.linearVelocity.magnitude — его скорость. Если задать этому свойству значение, движение изменится сразу, без разгона и без учёта массы: коробка массой 1 кг и сейф массой 50 кг, которым задали скорость 2 м/с, после следующего шага физики оба будут двигаться ровно со скоростью 2 м/с. После этого на них по-прежнему действуют гравитация, трение и удары.
Этот карт управляется вперёд с постоянной скоростью cruise м/с. Он копирует скорость, изменяет только z и присваивает её обратно, поэтому значение y, заданное гравитацией, сохраняется, и карт по-прежнему падает с края рампы:
void FixedUpdate()
{
Vector3 vel = rb.linearVelocity;
vel.z = cruise; // вперёд со скоростью ровно cruise м/с
rb.linearVelocity = vel; // y сохраняет значение, полученное под действием гравитации
}Если также задать y значение 0, скорость, полученную благодаря гравитации, придётся пропускать на каждом шаге, и карт будет плавно съезжать с рампы вместо того, чтобы падать. До Unity 6 это свойство называлось velocity. В старых руководствах по-прежнему пишут rb.velocity: в Unity 6 такой код компилируется с предупреждением о том, что velocity устарело и было переименовано в linearVelocity. Аналогично, drag стало называться linearDamping. Используй новые названия.
Задание
ЛегкоПеремещай робота со скоростью ровно speed м/с и позволь ему упасть с края.
- В
FixedUpdate()считайfloat h = Input.GetAxisRaw("Horizontal");иfloat vиз"Vertical". - Задай
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, v * speed);, сохранив компоненту y гравитации.
Нажми «Играть» и сойди с края: робот остановится, когда ты отпустишь клавиши, и упадёт. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
public class RobotWalk : MonoBehaviour
{
public float speed = 3f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Двигаться с помощью стрелок строго со скоростью speed, сохраняя компоненту y, заданную гравитацией
}
}
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка4Корутины
InvokeInvokeRepeating, CancelInvokeВаша первая корутинаЦиклы в корутинахОстановка корутинПовторение: обратный отсчёт10Проект: Побег с арены
АренаОхотники2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Монетная гонка
Катящийся шарСобираем монетыПотренируйтесь самостоятельно: Песочница Unity