Hey!欢迎回来! 今天我们来探索 Unity 物理引擎的"物理材质"系统!通过两个有趣的小项目------弹跳球 和冰面滑动------来深入理解弹性、摩擦力、重力缩放的原理和使用。
一、什么是 Physics Material?
在现实世界中,篮球和铅球落地反应完全不同,冰面和地毯摩擦力也天差地别。Unity 用 Physics Material(物理材质) 来描述这些差异。
类比:Physics Material 就像给物体穿"鞋子"------穿运动鞋(高摩擦)vs 穿溜冰鞋(低摩擦),穿皮鞋(低弹性)vs 穿气球鞋(高弹性),行为完全不同。
Physics Material 控制两件事:
| 属性组 | 描述 | 现实类比 |
|---|---|---|
| Friction(摩擦力) | 物体表面滑动时的阻力 | 地毯 vs 冰面 |
| Bounciness(弹性) | 碰撞后反弹的比例 | 橡皮球 vs 铁球 |
二、创建与配置 Physics Material
2.1 创建步骤
- Project 窗口右键 → Create → Physics Material(3D)

2.命名,如 "BallMaterial"、"IceMaterial"

3.在 Inspector 中调整参数

- 拖到对应物体的 Collider → Material 插槽

注意:是 Physics Material,不是普通材质(Material)!Physics Material 控制物理行为,普通 Material 控制外观颜色。
2.2 Physics Material 参数详解
| 参数 | 范围 | 含义 | 类比 |
| Dynamic Friction | 0 ~ 1 | 运动摩擦力(运动中) | 路面粗糙程度 |
| Static Friction | 0 ~ 1 | 静止摩擦力(停止前) | 刹车力度 |
| Bounciness | 0 ~ 1 | 弹性系数 | 橡胶 vs 铁 |
| Friction Combine | 枚举 | 摩擦力合并方式 | 见下表 |
Bounce Combine |
枚举 | 弹力合并方式 | 见下表 |
|---|
2.3 各参数说明
摩擦力(Friction):
| 参数 | 范围 | 说明 |
|---|---|---|
| Dynamic Friction | 0 ~ 1 | 物体运动时的摩擦力,0 = 无摩擦(冰面),1 = 强摩擦 |
| Static Friction | 0 ~ 1 | 物体静止时的摩擦力,阻止物体开始运动 |
弹性(Bounciness):
| 值 | 效果 |
|---|---|
| 0 | 不弹,碰地就停(泥巴球) |
| 0.5 | 弹回一半高度 |
| 1 | 完全弹回(理想状态,现实中不存在) |
Combine 模式------两个物体碰撞时弹/摩擦力如何合并:
| 模式 | 计算方式 | 适用场景 |
|---|---|---|
| Average | (A + B) / 2 | 默认,适合大多数情况 |
| Minimum | min(A, B) | 取较小值,适合冰面 |
| Maximum | max(A, B) | 取较大值,适合超级弹跳 |
| Multiply | A × B | 两值相乘 |
重要 :当两个物体的 Combine 模式不同时,Unity 按优先级选择:Maximum > Multiply > Minimum > Average 。
三、重力与阻力------Rigidbody 参数
Physics Material 控制表面属性,而 Rigidbody 控制物体本身受到重力和空气阻力的程度。
3.1 Rigidbody 核心参数
| 参数 | 说明 | 典型值 |
|---|---|---|
| Mass | 质量(kg),影响碰撞力道 | 1 |
| Linear Damping | 空气阻力,值越大移动越快停下 | 0 = 无阻力,10 = 强阻力 |
| Angular Damping | 旋转阻力,阻止自转 | 默认 0.05 |
| Use Gravity | 是否受重力影响 | 默认 |
| Gravity Scale | 3D没有此项,见下方说明 | --- |
注意 :Gravity Scale 是 2D 物理(Rigidbody 2D)的参数!3D 项目中调整重力要用全局设置或代码。
3.2 调整 3D 重力的两种方式
方式一:修改全局重力(影响所有物体)
Edit → Project Settings → Physics → Gravity
默认值:Y = -9.81(地球重力) 改为 Y = -20 → 所有物体掉落更快
方式二:代码单独修改某物体重力
cs
Rigidbody rb = GetComponent<Rigidbody>();
// 关闭默认重力,手动施加自定义重力
rb.useGravity = false;
rb.AddForce(Vector3.down * 20f, ForceMode.Acceleration);
四、弹跳球效果实现
学习完了我们上面的知识我们就可以开始做我们的弹跳球啦,实现也是非常的简单,接下来我们一起实现吧!
4.1 场景搭建
① 创建 Plane(地面)
② 创建 Sphere(球),放在高处

③ 给 Sphere 添加 Rigidbody 组件

④ 创建 Physics Material → Tantiaoqiu

⑤ 配置 Tantiaoqiu 参数

⑥ 把 BallMaterial 拖到 Sphere 的 Sphere Collider → Material

4.2 BallMaterial 推荐参数
Tantiaoqiu:
├── Dynamic Friction = 0.4
├── Static Friction = 0.4
├── Bounciness = 0.8 ← 关键!弹跳强度
├── Friction Combine = Average
└── Bounce Combine = Maximum ← 用 Maximum 保证弹力生效
为什么 Bounce Combine 用 Maximum? 地面的 Physics Material 默认 Bounciness = 0,如果用 Average,弹性就变成 (0.8+0) / 2 = 0.4,效果减半。改成 Maximum 就取两者最大值,确保弹力完整保留。
4.3运行结果展示:

那么我们可以看到我们成功实现了弹跳球效果,接下来就是我们的下一个冰面滑动啦!
五、冰面滑动效果实现
5.1 原理
冰面 = 极低摩擦力,物体踏上去后几乎不减速,持续滑行。
需要两个 Physics Material:
| 材质 | 应用在 | 摩擦力设置 |
|---|---|---|
| IceMaterial | Plane(冰面) | 极低摩擦 |
| PlayerMaterial | 玩家/小球 | 也要低摩擦(否则相互摩擦仍有阻力) |
5.2 IceMaterial 参数
IceMaterial:
├── Dynamic Friction = 0.01 ← 几乎无摩擦
├── Static Friction = 0.01
├── Bounciness = 0.0
├── Friction Combine = Minimum ← 取最小值,确保冰感
└── Bounce Combine = Average

5.3 场景搭建
① 创建 Plane(冰面),赋予 IceMaterial(冰面材质)
② 可以另建一个 Plane(普通地面),不赋材质对比用

③ 创建 (玩家),添加 Rigidbody,Linear Damping设为 0
④ 给 玩家 的 Collider 也赋予低摩擦材质(或 IceMaterial)

5.4 冰面控制脚本
cs
using UnityEngine;
public class IcePlayer : MonoBehaviour
{
public float pushForce = 8f; // 施加的推力大小
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// 关闭旋转,防止物体翻滚
rb.freezeRotation = true;
}
void Update()
{
HandleMove();
}
void HandleMove()
{
float h = Input.GetAxis("Horizontal"); // A/D 或 ←/→
float v = Input.GetAxis("Vertical"); // W/S 或 ↑/↓
// 用 AddForce 而不是直接改速度------这样才有"冰滑感"
// 冰面上:施加力 → 速度缓慢增加,松手 → 几乎不减速
Vector3 force = new Vector3(h, 0, v) * pushForce;
rb.AddForce(force);
// 调试:显示当前速度
Debug.Log("速度:" + rb.linearVelocity.magnitude.ToString("F2"));
}
}
为什么用 AddForce 而不是 velocity = ...?
| 方式 | 效果 |
|---|---|
rb.velocity = direction * speed |
瞬间达到目标速度,无惯性,像普通地面 |
rb.AddForce(force) |
逐渐加速,松手靠摩擦减速------冰面摩擦近乎 0,所以一直滑 |
5.5运行结果展示:
可以看到我们在蓝色的冰面上实现了滑动的效果,而在普通的黄色地面是却没有这个效果,那么我们本章的任务就算完成啦!

**今天的教学就到这里!**接下来我将连续更新90天的Untiy教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。