Menu
CoddyTech

弹跳与摩擦力

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

碰撞体的弹跳和滑动方式由它的PhysicsMaterial决定(这是 Unity 6 中的名称,旧版本中称为 PhysicMaterial)。bounciness的范围是从 0(不弹跳)到 1(保留全部速度)。dynamicFriction会减慢正在滑动的物体,staticFriction则决定静止物体开始滑动前需要受到多大的推力。没有材质的碰撞体会使用 0.6 的摩擦力和 0 的弹性。这个超级球为自己的碰撞体设置了弹性材质:

void Start()
{
    PhysicsMaterial mat = GetComponent<Collider>().material;   // 这个碰撞体自己的副本
    mat.bounciness = 0.9f;
    mat.bounceCombine = PhysicsMaterialCombine.Maximum;
}

一次接触涉及两个碰撞体,因此 Unity 会合并它们的两个值。每种材质都会指定合并方式,弹性使用bounceCombine,摩擦力使用frictionCombine。两者都可以采用四种模式之一:Average(默认)、Minimum、Multiply或Maximum。如果两个碰撞体指定了不同模式,则列表中靠后的模式优先。碰到没有材质的地板时,使用 Average 会让球的弹性变为 (0.9 + 0) / 2 = 0.45。使用 Maximum 时,球每次弹跳都会保留 0.9 的速度,也就是保留 81% 的高度,因为高度与速度的平方成正比。

.material会为这个碰撞体创建一份独立的材质副本,因此更改只会影响它。.sharedMaterial是材质资源本身,所有使用它的碰撞体共享该资源。如果碰撞体从未被指定材质,.sharedMaterial的值就是null。

challenge icon

挑战

简单

为蹦床和冰面分别设置弹性和摩擦力。

  1. 在 Start() 中,使用 PhysicsMaterial mat = GetComponent<Collider>().material;,并将 mat.bounciness = bounce;、mat.dynamicFriction 和 mat.staticFriction 设置为 friction。
  2. 设置 mat.bounceCombine = PhysicsMaterialCombine.Maximum; 和 mat.frictionCombine = PhysicsMaterialCombine.Minimum;,这样就会优先使用表面自身的值。

按下 Play:球会在蹦床上高高弹起。然后点击 Check。

亲手试试

using UnityEngine;

public class Surface : MonoBehaviour
{
    public float bounce = 0f;
    public float friction = 0.6f;

    void Start()
    {
        // 给这个碰撞体创建专属材质,并设置弹性和摩擦力
    }
}

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

自己练习: Unity 在线编辑器