Menu
CoddyTech

使用 AddForce 推动

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

对象添加 Rigidbody 后,物理系统会移动它,所以你不再直接改变它的位置,而是改为推动它。rb.AddForce(force)会施加一个力来推动刚体,力是以牛顿为单位的Vector3。力不会直接设定速度:只要你持续施加力,刚体就会加速,每秒增加的速度等于力除以质量。停止推动后,刚体会保持当前速度。

这艘 2 kg 的气垫船装有推进器:按住向上箭头时,一个大小为thrust的力会沿着 +z 方向向前推动它。推力为 12 时,它每秒增加 12 / 2 = 6 m/s 的速度:

public float thrust = 12f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.UpArrow))
    {
        rb.AddForce(Vector3.forward * thrust);
    }
}

要在FixedUpdate()中施加力。Unity 会在每个物理步骤前调用它,每秒调用 50 次(第 4 课会解释原因)。这行代码中不需要Time.deltaTime:AddForce 已经会在整个步骤中分配这个力,乘以Time.deltaTime反而会让推力弱 50 倍。在地面上,摩擦力会产生反向推力,所以较小的力可能根本无法推动沉重的箱子。

challenge icon

挑战

简单

用力推动冰球,让它在无摩擦的冰场上滑动。

  1. 在 FixedUpdate() 中读取 float h = Input.GetAxis("Horizontal"); 和 float v = Input.GetAxis("Vertical");。
  2. 调用 rb.AddForce(new Vector3(h, 0, v) * push);,不要使用 Time.deltaTime。

按“开始”,推动冰球后松开:冰球会继续滑行。然后点击“检查”。

亲手试试

using UnityEngine;

public class PuckPusher : MonoBehaviour
{
    public float push = 4f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // 推动冰球:水平方向沿 x 轴,垂直方向沿 z 轴
    }
}

物理与游戏玩法中的所有课

自己练习: Unity 在线编辑器