Скорость
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 5 из 63.
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 м/с (3 в Inspector): влево и вправо вдоль x, вверх и вниз вдоль z, используя необработанные оси, чтобы движение не сглаживалось.
- Если не удерживать ни одну из стрелок, робот сразу стоит на месте.
- Гравитация продолжает действовать: если робот сойдёт с края, он упадёт на землю внизу.
Нажми Play и сойди с платформы, затем нажми Check.
Попробуйте сами
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 для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора