Unity学习90天 - 第 6 天 -学习物理 Material + 重力与阻力并实现弹跳球和冰面滑动效果
Hey欢迎回来今天我们来探索 Unity 物理引擎的物理材质系统通过两个有趣的小项目——弹跳球和冰面滑动——来深入理解弹性、摩擦力、重力缩放的原理和使用。一、什么是 Physics Material在现实世界中篮球和铅球落地反应完全不同冰面和地毯摩擦力也天差地别。Unity 用Physics Material物理材质来描述这些差异。类比Physics Material 就像给物体穿鞋子——穿运动鞋高摩擦vs 穿溜冰鞋低摩擦穿皮鞋低弹性vs 穿气球鞋高弹性行为完全不同。Physics Material 控制两件事属性组描述现实类比Friction摩擦力物体表面滑动时的阻力地毯 vs 冰面Bounciness弹性碰撞后反弹的比例橡皮球 vs 铁球二、创建与配置 Physics Material2.1 创建步骤1. Project 窗口右键 → Create → Physics Material3D2.命名如 BallMaterial、IceMaterial3.在 Inspector 中调整参数4. 拖到对应物体的 Collider → Material 插槽注意是Physics Material不是普通材质MaterialPhysics Material 控制物理行为普通 Material 控制外观颜色。2.2 Physics Material 参数详解参数范围含义类比Dynamic Friction0 ~ 1运动摩擦力运动中路面粗糙程度Static Friction0 ~ 1静止摩擦力停止前刹车力度Bounciness0 ~ 1弹性系数橡胶 vs 铁Friction Combine枚举摩擦力合并方式见下表Bounce Combine枚举弹力合并方式见下表2.3 各参数说明摩擦力Friction参数范围说明Dynamic Friction0 ~ 1物体运动时的摩擦力0 无摩擦冰面1 强摩擦Static Friction0 ~ 1物体静止时的摩擦力阻止物体开始运动弹性Bounciness值效果0不弹碰地就停泥巴球0.5弹回一半高度1完全弹回理想状态现实中不存在Combine 模式——两个物体碰撞时弹/摩擦力如何合并模式计算方式适用场景Average(A B) / 2默认适合大多数情况Minimummin(A, B)取较小值适合冰面Maximummax(A, B)取较大值适合超级弹跳MultiplyA × B两值相乘重要当两个物体的 Combine 模式不同时Unity 按优先级选择Maximum Multiply Minimum Average。三、重力与阻力——Rigidbody 参数Physics Material 控制表面属性而Rigidbody控制物体本身受到重力和空气阻力的程度。3.1 Rigidbody 核心参数参数说明典型值Mass质量kg影响碰撞力道1Linear Damping空气阻力值越大移动越快停下0 无阻力10 强阻力Angular Damping旋转阻力阻止自转默认 0.05Use Gravity是否受重力影响默认Gravity Scale3D没有此项见下方说明—注意Gravity Scale是2D 物理Rigidbody 2D的参数3D 项目中调整重力要用全局设置或代码。3.2 调整 3D 重力的两种方式方式一修改全局重力影响所有物体Edit → Project Settings → Physics → Gravity默认值Y -9.81地球重力 改为 Y -20 → 所有物体掉落更快方式二代码单独修改某物体重力Rigidbody rb GetComponentRigidbody(); // 关闭默认重力手动施加自定义重力 rb.useGravity false; rb.AddForce(Vector3.down * 20f, ForceMode.Acceleration);四、弹跳球效果实现学习完了我们上面的知识我们就可以开始做我们的弹跳球啦实现也是非常的简单接下来我们一起实现吧4.1 场景搭建① 创建 Plane地面② 创建 Sphere球放在高处③ 给 Sphere 添加 Rigidbody 组件④ 创建 Physics Material → Tantiaoqiu⑤ 配置 Tantiaoqiu 参数⑥ 把 BallMaterial 拖到 Sphere 的 Sphere Collider → Material4.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.80) / 2 0.4效果减半。改成 Maximum 就取两者最大值确保弹力完整保留。4.3运行结果展示那么我们可以看到我们成功实现了弹跳球效果接下来就是我们的下一个冰面滑动啦五、冰面滑动效果实现5.1 原理冰面 极低摩擦力物体踏上去后几乎不减速持续滑行。需要两个 Physics Material材质应用在摩擦力设置IceMaterialPlane冰面极低摩擦PlayerMaterial玩家/小球也要低摩擦否则相互摩擦仍有阻力5.2 IceMaterial 参数IceMaterial:├── Dynamic Friction 0.01 ← 几乎无摩擦├── Static Friction 0.01├── Bounciness 0.0├── Friction Combine Minimum ← 取最小值确保冰感└── Bounce Combine Average5.3 场景搭建① 创建 Plane冰面赋予 IceMaterial冰面材质② 可以另建一个 Plane普通地面不赋材质对比用③ 创建 玩家添加 RigidbodyLinear Damping设为 0④ 给 玩家 的 Collider 也赋予低摩擦材质或 IceMaterial5.4 冰面控制脚本using UnityEngine; public class IcePlayer : MonoBehaviour { public float pushForce 8f; // 施加的推力大小 private Rigidbody rb; void Start() { rb GetComponentRigidbody(); // 关闭旋转防止物体翻滚 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教程从基础到一个网络部分有兴趣的朋友们可以收藏关注谢谢如果有疑问评论区见。