1. 物理引擎概述:从零认识物理世界
大家好,我是老张。做游戏开发这些年,我见过太多项目在物理系统上栽跟头。有的角色穿模穿得像鬼影,有的碰撞检测时灵时不灵。说白了,很多人对物理引擎的理解还停留在「加个刚体就能动」的阶段。
今天这一章,咱们就从头捋一捋物理引擎到底是什么。我保证,不扯玄乎的理论,全是实战里用得上的干货。
1.1 什么是物理引擎?
物理引擎,说白了就是一套帮你模拟真实世界物理规律的代码库。你想想看,如果没有物理引擎,一个球从高处落下,你得自己写重力加速度、写碰撞检测、写反弹系数……累不累?
物理引擎把这些脏活累活全包了。你只需要告诉它:「这个物体有质量,那个物体有摩擦力」,剩下的它帮你算。
我个人习惯把物理引擎分成两类:
- 实时物理引擎:游戏里用的,追求速度,精度够用就行。Unity 的 PhysX 就是典型。
- 高精度物理引擎:电影特效、工程仿真用的,算得慢但极其精确。
咱们做游戏的,当然只关心前者。记住一句话:游戏物理,是「看起来对」就行,不是「真的对」。
核心概念:物理引擎 = 碰撞检测 + 动力学求解 + 约束求解。这三块缺一不可。
1.2 Unity 物理引擎架构
Unity 底层用的是 NVIDIA 的 PhysX 引擎。嗯,这里要注意,PhysX 本身是 C++ 写的,Unity 用 C# 封装了一层接口给我们用。
整个架构大概长这样:
| 层级 | 说明 | 我踩过的坑 |
|---|---|---|
| 应用层 | 我们写的 MonoBehaviour 脚本 | 别在 FixedUpdate 里做耗时操作 |
| 引擎层 | Unity 的 Physics 模块 | Collider 和 Rigidbody 要分开放 |
| 底层 | PhysX 原生库 | 移动平台性能差异很大 |
为什么会这样分层?我刚开始做项目时也不理解。直到有一次,我在 FixedUpdate 里写了个大循环,结果物理帧直接卡成幻灯片。后来才明白,物理更新和渲染更新是两条独立的线程。
我的习惯:所有物理相关的代码,都写在 FixedUpdate 里。Update 只处理输入和动画。这个习惯帮我避免过无数次莫名其妙的抖动问题。
1.3 物理引擎在游戏中的应用
物理引擎能做的事,比你想象的多得多。我随便列几个常见的:
- 角色移动:用物理驱动角色,而不是直接改 Transform。手感会真实很多。
- 碰撞检测:判断两个物体是否接触,触发事件。
- 布娃娃系统:角色死亡时四肢自然垂落,看着就舒服。
- 车辆模拟:车轮悬挂、摩擦力、引擎扭矩,全得靠物理。
- 破坏效果:墙被打碎,碎片飞散,这就是物理的魅力。
我记得有个射击游戏项目,策划要求子弹打中木板时,木板要裂开。我当时直接用 Rigidbody 加一堆碎片预制体,每颗子弹触发一次爆炸力。效果是有了,但手机端直接卡成狗。后来改用对象池加预计算,才把性能稳住。
避坑指南:我曾经在移动端项目里用了过多的物理碰撞,结果帧率掉到 15fps。后来发现,很多碰撞完全可以用射线检测替代。记住:物理不是万能的,能不用就不用。
1.4 什么时候该用物理?什么时候不该用?
这个问题,我面试时经常问新人。很多人回答:「需要真实感的时候用物理。」这个答案太笼统了。
我的判断标准很简单:
- 需要真实交互:比如两个物体互相推挤、弹跳,用物理。
- 只需要视觉反馈:比如粒子特效、UI 动画,别用物理。
- 需要精确控制:比如平台跳跃游戏的角色移动,别用物理。
- 需要大量物体:超过 50 个刚体同时活动,就要考虑优化了。
你想想看,一个简单的开关门动画,用物理做和用动画曲线做,哪个更可控?我个人的经验是:能用动画解决的,就别碰物理。物理引擎是工具,不是信仰。
1.5 本章小结
这一章我们聊了物理引擎的本质、Unity 的架构,以及实际应用场景。说白了,物理引擎就是个帮你算物理的「黑盒子」。你不需要知道它里面怎么算的,但要知道它什么时候该用、什么时候不该用。
下一章,我们会深入碰撞系统,聊聊 Collider 和 Rigidbody 的那些坑。到时候我会分享一个我当年调了三天三夜的碰撞 bug,保证让你少走弯路。
记住:物理引擎是工具,不是魔法。理解它的边界,才能用好它。