Unity学习90天 - 第 6 天 -学习物理 Material + 重力与阻力并实现弹跳球和冰面滑动效果

Hey!欢迎回来! 今天我们来探索 Unity 物理引擎的"物理材质"系统!通过两个有趣的小项目------弹跳球冰面滑动------来深入理解弹性、摩擦力、重力缩放的原理和使用。

一、什么是 Physics Material?

在现实世界中,篮球和铅球落地反应完全不同,冰面和地毯摩擦力也天差地别。Unity 用 Physics Material(物理材质) 来描述这些差异。

类比:Physics Material 就像给物体穿"鞋子"------穿运动鞋(高摩擦)vs 穿溜冰鞋(低摩擦),穿皮鞋(低弹性)vs 穿气球鞋(高弹性),行为完全不同。

Physics Material 控制两件事:

属性组 描述 现实类比
Friction(摩擦力) 物体表面滑动时的阻力 地毯 vs 冰面
Bounciness(弹性) 碰撞后反弹的比例 橡皮球 vs 铁球

二、创建与配置 Physics Material

2.1 创建步骤

  1. Project 窗口右键 → Create → Physics Material(3D)

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

3.在 Inspector 中调整参数

  1. 拖到对应物体的 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 Scale2D 物理(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教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。

相关推荐
小陈phd2 小时前
多模态大模型学习笔记(三十六)—— 扩散模型与可控生成:从AI涂鸦到精准作画的技术革命
人工智能·笔记·学习
Sss_Ass2 小时前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序符号绑定语句
学习·嵌入式·汇编语言·李述铜·符号绑定语句
for_ever_love__3 小时前
UI 学习 Appearance 外观管理
学习·ui·ios·objective-c
m0_614619063 小时前
花了一下午学 Git,整理了一份学习笔记
笔记·git·学习
知识分享小能手3 小时前
ECharts入门学习教程,从入门到精通,ECharts 数据可视化入门介绍(1)
学习·信息可视化·echarts
ITxiaobing20234 小时前
Neel Somani:如何设计“既能学习又不脆弱”的AI系统
人工智能·学习·机器学习
mxwin4 小时前
Unity 单通道立体渲染(Single Pass Instanced)对 Shader 顶点布局的特殊要求
unity·游戏引擎·shader
qeen874 小时前
【数据结构】栈及其C语言模拟实现
c语言·数据结构·学习·