速度
本课属于 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。请使用新名称。
挑战
简单让机器人以恰好 speed m/s 的速度行走,并让它从边缘掉下去。
- 在
FixedUpdate()中,读取float h = Input.GetAxisRaw("Horizontal");,并从"Vertical"中读取float v。 - 设置
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 在线编辑器