使用 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 倍。在地面上,摩擦力会产生反向推力,所以较小的力可能根本无法推动沉重的箱子。
挑战
简单用力推动冰球,让它在无摩擦的冰场上滑动。
- 在
FixedUpdate()中读取float h = Input.GetAxis("Horizontal");和float v = Input.GetAxis("Vertical");。 - 调用
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 在线编辑器