Menu
CoddyTech

速度

本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 5 课,共 71 课。

rb.linearVelocity 表示物体当前的运动状态:它是一个 Vector3,表示物体沿 x、y 和 z 轴每秒移动的米数。读取它可以知道物体的运动方向,而 rb.linearVelocity.magnitude 表示它的速度。设置它会立即改变运动状态,不需要逐渐加速,也不涉及质量:一个 1 kg 的箱子和一个 50 kg 的保险箱都设置为 2 m/s 后,从下一个物理步骤开始,它们的速度都恰好是 2 m/s。之后,重力、摩擦力和碰撞仍会对它产生作用。

这辆卡丁车以恰好 cruise m/s 的速度向前行驶。它复制速度,只改变 z,然后将速度赋回去,因此重力赋予它的 y 方向速度会保留下来,卡丁车仍会从坡道末端落下:

void FixedUpdate()
{
    Vector3 vel = rb.linearVelocity;
    vel.z = cruise;            // 以恰好 cruise m/s 的速度向前
    rb.linearVelocity = vel;   // y 保持重力作用后的值
}

如果同时将 y 设为 0,每个步骤都会丢弃重力赋予它的速度,卡丁车就会从坡道上缓缓飘下,而不是落下。在 Unity 6 之前,这个属性名为 velocity。旧教程仍会写 rb.velocity:在 Unity 6 中,这段代码可以编译,但会显示警告,指出 velocity 已过时,并已重命名为 linearVelocity。drag 也以相同方式改名为 linearDamping。请使用新名称。

challenge icon

挑战

简单

让机器人以恰好 speed m/s 的速度行走,并让它从边缘掉下去。

  1. 在 FixedUpdate() 中,读取 float h = Input.GetAxisRaw("Horizontal");,并从 "Vertical" 中读取 float v。
  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 在线编辑器