Menu
CoddyTech

运动学刚体

本课属于 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 对运动学刚体不起作用,而且运动学刚体永远不会与静态碰撞体或彼此发生碰撞:只有动态刚体会撞上它们。

challenge icon

挑战

简单

把驳船悬在熔岩上方,用方向键滑动它。

  1. 在 Start() 中,设置 rb.isKinematic = true;。
  2. 在 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 在线编辑器