Menu
CoddyTech

Скорость

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

challenge icon

Задание

Легко

Перемещай робота со скоростью ровно speed м/с и позволь ему упасть с края.

  1. В FixedUpdate() считай float h = Input.GetAxisRaw("Horizontal"); и float v из "Vertical".
  2. Задай 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, заданную гравитацией
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity