运动学刚体
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 6 课,共 71 课。
移动平台、升降机和门需要像固体物体一样发生碰撞,但不能因为有东西落在它们上面就下落或被推来推去。这就是运动学刚体:设置 rb.isKinematic = true 后,重力、力和碰撞都不会再使它移动。它的碰撞体仍然有效,因此动态刚体(由物理系统移动的刚体)会像撞墙一样撞上它,也会像站在地面上一样站在它上面。你可以使用 rb.MovePosition 自行移动运动学刚体。
这个升降机以 lift m/s 的速度上升,直到到达 top。MovePosition 接收此步骤结束时的位置,因此代码会加上一个步骤的移动距离,并使用 Time.fixedDeltaTime:
void Start()
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
}
void FixedUpdate()
{
if (rb.position.y < top)
{
rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
}
}为什么不设置 transform.position?那会让物体瞬间传送到新位置,而物理系统并不知道它移动过:滑动平台上的箱子会被留在原处,而不会跟着平台移动。MovePosition 会告诉物理系统,刚体在此步骤中移动到了新位置,因此它接触到的物体会被正确地带动和推动。AddForce 对运动学刚体不起作用,而且运动学刚体永远不会与静态碰撞体或彼此发生碰撞:只有动态刚体会撞上它们。
挑战
简单把驳船悬在熔岩上方,用方向键滑动它。
- 在
Start()中,设置rb.isKinematic = true;。 - 在
FixedUpdate()中,读取float h = Input.GetAxisRaw("Horizontal");并调用rb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);。
按“开始”并滑动驳船:它会悬在空中,无人机则会弹开。然后点击“检查”。
亲手试试
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// 将驳船设为运动学物体
}
void FixedUpdate()
{
// 用方向键让它沿 x 轴移动
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器