Menu
CoddyTech

Скорость

Часть раздела Физика и игровой процесс путешествия по 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. Используй новые имена.

challenge icon

Задание

Легко

Робот ходит по приподнятой платформе. Сделай так, чтобы стрелки перемещали его со скоростью ровно 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, определяемую гравитацией
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс