弹跳与摩擦力
本课属于 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。
挑战
简单为蹦床和冰面分别设置弹性和摩擦力。
- 在
Start()中,使用PhysicsMaterial mat = GetComponent<Collider>().material;,并将mat.bounciness = bounce;、mat.dynamicFriction和mat.staticFriction设置为friction。 - 设置
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 在线编辑器