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 什么时候该用物理?什么时候不该用?

这个问题,我面试时经常问新人。很多人回答:「需要真实感的时候用物理。」这个答案太笼统了。

我的判断标准很简单:

  1. 需要真实交互:比如两个物体互相推挤、弹跳,用物理。
  2. 只需要视觉反馈:比如粒子特效、UI 动画,别用物理。
  3. 需要精确控制:比如平台跳跃游戏的角色移动,别用物理。
  4. 需要大量物体:超过 50 个刚体同时活动,就要考虑优化了。

你想想看,一个简单的开关门动画,用物理做和用动画曲线做,哪个更可控?我个人的经验是:能用动画解决的,就别碰物理。物理引擎是工具,不是信仰。

1.5 本章小结

这一章我们聊了物理引擎的本质、Unity 的架构,以及实际应用场景。说白了,物理引擎就是个帮你算物理的「黑盒子」。你不需要知道它里面怎么算的,但要知道它什么时候该用、什么时候不该用。

下一章,我们会深入碰撞系统,聊聊 Collider 和 Rigidbody 的那些坑。到时候我会分享一个我当年调了三天三夜的碰撞 bug,保证让你少走弯路。

记住:物理引擎是工具,不是魔法。理解它的边界,才能用好它。