引子一个违和的世界想象你正在玩一款游戏。你操控角色走到悬崖边纵身一跃——然后你的角色没有下坠而是像卡了 bug 一样僵直地悬浮在半空中纹丝不动。或者你朝墙上扔了一个皮球皮球啪地一声直接穿墙而过消失在墙的另一边仿佛那堵墙根本不存在。再或者你推倒一堆箱子箱子们不是哗啦啦地散落一地而是像被施了定身法保持着原来的姿势一动不动。你会有什么感觉违和。极度的违和。这个世界不对劲,它违背了我们从出生起就深深刻在骨子里的常识——东西会往下掉、实体不能互相穿透、推一下会动、撞一下会弹。而这些理所当然的常识在虚拟世界里其实一点都不理所当然。计算机并不知道什么叫重力,什么叫碰撞。默认情况下游戏里的一切物体都只是漂浮在三维空间里的幽灵——它们没有重量可以互相穿透永远静止不动。要让这个虚拟世界落地生根、变得可信、符合直觉我们就必须为它注入一套物理法则。而负责这件事的就是我们今天的主角——Unity 物理系统Physics System。它就是虚拟世界里的牛顿,为万物立下运动与碰撞的法则。一、物理系统是什么—— 虚拟世界的物理引擎让我们先给它一个清晰的定位。Unity 物理系统是一套模拟真实世界物理规律的引擎。它负责计算物体的运动、重力、碰撞、摩擦、弹性等一切与力和运动相关的行为让虚拟物体表现得像现实中的物体一样。在 Unity 内部这套系统由成熟的物理引擎驱动3D 主要基于 NVIDIA 的 PhysX2D 则基于 Box2D。你不需要自己去写重力公式“碰撞检测算法这些极其复杂的底层数学——Unity 已经把它们打包好了。你要做的只是给物体贴上标签”,告诉系统“嘿这个物体请按物理规律来对待它。”用一个比喻来理解如果说没有物理系统的游戏世界是一个静止的画片博物馆——所有东西都摆在那儿纹丝不动那么加入物理系统后这个世界就变成了一个活的游乐场——球会滚、箱子会倒、角色会摔、爆炸会把碎片崩得到处都是。物理系统就是让世界从静态画片变成动态现实的那股神奇力量。那么具体怎么给物体贴标签,让它们服从物理法则呢这就要引出物理系统的两大核心组件了。二、两大基石Rigidbody 与 Collider在 Unity 物理系统里有两个组件是绝对的核心、是基石中的基石。理解了它们你就掌握了物理系统的半壁江山。它们就是——刚体Rigidbody和碰撞器Collider。这两者的关系是初学者最容易混淆、也最需要理清的。我们用一个生动的比喻来一次性讲透。Rigidbody刚体—— 赋予物体灵魂让它动起来Rigidbody是让物体接受物理引擎控制的组件。一旦你给一个物体加上了 Rigidbody 组件就相当于对物理系统宣告“从现在起这个物体交给你管了请给它施加重力、让它响应力的作用、计算它的运动。”于是神奇的事情发生了这个物体会开始下落受重力你推它一把它会移动受力你让它飞出去它会带着惯性继续前进。它拥有了质量、速度、动量这些物理属性成了一个真正有分量的实体。没有 Rigidbody 的物体是物理世界里的局外人——重力对它无效力对它无效它只能靠你写代码硬生生地移动它的坐标。而有了 Rigidbody物体就活了它会自己遵循物理规律运动。比喻Rigidbody 就像是给一个木偶注入了会响应牵引的灵魂。没有它木偶只是个僵硬的摆件有了它你一拉线施加力它就会自然地摆动、下垂、晃荡。Collider碰撞器—— 赋予物体身体让它有边界Collider是定义物体物理形状、让它能发生碰撞的组件。我们知道游戏里的物体外观是由 Mesh网格决定的但那只是看得见的外壳。物理系统并不关心你长得多精致——它需要知道的是“这个物体的’实体边界’在哪里它碰到别的东西时该在哪里发生碰撞”Collider 就是用来定义这个实体边界的。它像给物体套上了一层隐形的碰撞外壳。常见的有Box Collider盒型立方体形状适合箱子、墙壁、地面。Sphere Collider球形球体形状适合球、炮弹。Capsule Collider胶囊形胶囊形状常用于角色。Mesh Collider网格完全贴合模型形状精确但性能开销大。有了 Collider两个物体靠近时物理系统才能检测到它们碰上了,从而阻止它们互相穿透或者触发碰撞反应。比喻如果说 Mesh 是物体看得见的皮肤,那 Collider 就是物体摸得着的身体。皮肤决定了它好不好看身体决定了它能不能被碰到、会不会被穿透。黄金搭档两者如何配合现在最关键的问题来了Rigidbody 和 Collider该怎么配合记住这个核心原则Rigidbody 负责让物体动Collider 负责让物体能碰。要实现完整的物理交互比如一个球落到地上并停住通常需要两者配合。我们用一个最经典的场景来说明——“一个球掉到地上”球需要Rigidbody让它受重力下落Collider球形碰撞器让它有实体。地面需要Collider让它有实体能挡住球但通常不需要 Rigidbody因为地面是静止的不需要它自己运动下落。当游戏运行时球因为有 Rigidbody受重力开始下落下落到接触地面时球的 Collider 碰到了地面的 Collider物理系统检测到碰撞于是阻止球继续下坠球稳稳地停在了地面上。看这就是一次完美的配合Rigidbody 提供了运动的动力,Collider 提供了碰撞的边界,二者协作才上演了这幕最自然不过的球落地。几种常见组合的对照物体类型RigidbodyCollider例子会动、会碰撞✅ 有✅ 有掉落的球、可推的箱子静止、能挡住东西❌ 无✅ 有地面、墙壁、静态障碍只做逻辑、不参与碰撞❌ 无❌ 无纯装饰物、UI三、两种实体:碰撞Collision与触发Trigger理解了 Rigidbody 和 Collider我们再深入一层看看物体接触时的两种不同处理方式。这也是物理系统里极其实用的一个知识点。Collider 有一个重要的开关叫Is Trigger是否为触发器。它决定了物体接触时是走碰撞路线还是走触发路线。碰撞Collision—— 实打实的物理阻挡当Is Trigger关闭时默认状态Collider 是一个实心的物理实体。物体之间会发生真实的物理碰撞——它们会互相阻挡、反弹、推挤无法穿透彼此。比如一个球撞到墙上会弹回来两辆车相撞会互相顶开角色走到墙边会被挡住。这些都是碰撞——实打实的物理阻挡与反应。触发Trigger—— “穿过去但会报信”当Is Trigger开启时Collider 就变成了一个幽灵区域。物体可以直接穿过它不会被阻挡但当有物体进入、停留、离开这个区域时系统会发出通知触发事件让你知道有东西进来了。这在游戏里用途极广拾取道具角色走进金币的触发区域 → 触发捡起金币事件金币不会挡住角色。进入区域玩家走进某个地带 → 触发播放剧情“刷出敌人”。感应门角色靠近 → 触发开门。陷阱区域踏入 → 触发扣血。一句话区分碰撞Collision是撞到了走不过去;触发Trigger是穿过去了但我知道你来过。前者管物理阻挡,后者管事件感应。在代码里这两种情况分别对应不同的回调函数我们下面会讲千万别搞混。四、动手实战用代码驾驭物理系统理论讲透了我们来看看如何用 C# 代码与物理系统互动。这部分会让你真正感受到物理系统的强大。1. 给物体施加力让它动起来给有 Rigidbody 的物体施加力是最常见的操作。比如让一个球跳起来usingUnityEngine;publicclassBallJump:MonoBehaviour{privateRigidbodyrb;publicfloatjumpForce5f;voidStart(){rbGetComponentRigidbody();}voidUpdate(){// 按空格键给球一个向上的冲量if(Input.GetKeyDown(KeyCode.Space)){rb.AddForce(Vector3.up*jumpForce,ForceMode.Impulse);}}}rb.AddForce就是给物体施加力。加了力之后剩下的下落、减速、落地全都由物理系统自动接管——你不用管重力怎么算、什么时候落地物理引擎会替你搞定一切。这就是物理系统的魅力你只需推一把,世界会自然地回应。2. 处理碰撞事件当两个实心Collider 碰撞时Unity 会自动调用以下回调函数前提是至少有一方带 Rigidbody// 碰撞开始的那一刻voidOnCollisionEnter(Collisioncollision){Debug.Log(撞到了collision.gameObject.name);// 比如撞到敌人就扣血if(collision.gameObject.CompareTag(Enemy)){TakeDamage(10);}}// 碰撞持续期间每帧调用voidOnCollisionStay(Collisioncollision){}// 碰撞结束、分开的那一刻voidOnCollisionExit(Collisioncollision){}OnCollisionEnter里的collision参数包含了丰富的碰撞信息——撞到了谁、在哪个点接触、以多大的力……你可以据此做出各种反应。3. 处理触发事件当涉及 Trigger触发器时用的是另一组回调// 有物体进入触发区域voidOnTriggerEnter(Colliderother){Debug.Log(other.gameObject.name 进入了区域);// 比如玩家进入捡起金币if(other.CompareTag(Player)){CollectCoin();}}// 物体停留在触发区域内每帧调用voidOnTriggerStay(Colliderother){}// 物体离开触发区域voidOnTriggerExit(Colliderother){}注意区分碰撞用OnCollisionXXX参数是Collision触发用OnTriggerXXX参数是Collider。这是新手极易混淆的地方务必记牢。4. 射线检测Raycast:物理系统的探照灯物理系统还提供了一个超级实用的工具——射线检测Raycast。它能从一个点朝某个方向发射一条看不见的射线,检测这条线上碰到了什么。voidShoot(){RaycastHithit;// 从摄像机位置朝前方发射射线if(Physics.Raycast(transform.position,transform.forward,outhit,100f)){Debug.Log(击中了hit.collider.gameObject.name);Debug.Log(击中点坐标hit.point);}}射线检测用途极广射击游戏判断子弹打中了谁、鼠标点击选中场景中的物体、检测角色脚下是否有地面、AI 判断前方有没有障碍……都靠它。它就像物理系统的一支探照灯,能精准地探测出射线路径上的一切。五、物理系统的隐藏规则与实战要点用好物理系统还有一些关键的规则和坑需要知道。要点一物理计算要用 FixedUpdate这是一个至关重要、却常被新手忽略的点。Unity 里Update()每帧执行一次但每帧的时间间隔是不固定的帧率高时间隔短帧率低时间隔长。而物理计算需要稳定、固定的时间步长才能准确。因此所有与物理相关的操作尤其是 AddForce、修改 Rigidbody 速度等都应该放在FixedUpdate()里而不是Update()。voidFixedUpdate(){// 物理相关操作放这里保证计算稳定rb.AddForce(Vector3.forward*speed);}FixedUpdate以固定的时间间隔执行默认 0.02 秒一次与帧率无关能保证物理模拟的稳定和准确。记住逻辑输入检测用 Update物理施力用 FixedUpdate。要点二别用 transform 直接移动物理物体如果一个物体有 Rigidbody不要用transform.position ...去硬移动它——这会绕过物理系统导致碰撞检测出错比如穿墙。正确的做法是通过 Rigidbody 来移动比如用rb.MovePosition()或施加力/设置速度。让物理系统来主导有 Rigidbody 物体的运动才能保证物理行为正确。要点三Kinematic运动学刚体Rigidbody 有一个Is Kinematic选项。开启后物体不再受重力和外力影响但依然能参与碰撞检测并且可以由代码如动画精确控制其位置。这在很多场景很有用比如一个由动画驱动的平台你不希望它被物理推动但希望角色站上去时能被它承载、能触发碰撞。这时就用 Kinematic 刚体。要点四性能优化物理计算是有成本的。几条优化原则优先用简单碰撞器Box、Sphere、Capsule慎用 Mesh Collider尤其是复杂模型的。静止不动的物体不要加 Rigidbody如地面、墙只加 Collider 即可。合理使用碰撞层Layer与碰撞矩阵让不需要相互碰撞的物体互相忽略,减少无谓的检测。不需要物理的物体就别加物理组件。六、2D 与 3D两套平行的物理世界最后补充一点Unity 的物理系统其实有两套——3D 物理和2D 物理它们是相互独立的两个平行世界。3D 物理组件是Rigidbody、BoxCollider、SphereCollider等基于 PhysX。2D 物理组件是Rigidbody2D、BoxCollider2D、CircleCollider2D等基于 Box2D专为 2D 游戏优化。关键提醒两套系统不能混用你不能让一个 3D 的BoxCollider和一个 2D 的BoxCollider2D发生碰撞。做 2D 游戏就全程用 2D 组件做 3D 游戏就用 3D 组件。选错了物理交互就完全失效。概念上2D 和 3D 物理是相通的——都有刚体、碰撞器、触发器、力、射线检测只是一个在平面XY里运作一个在立体空间里运作。理解了 3D2D 也就触类旁通了。尾声物理系统是可信世界的地基我们从一个违和的世界出发——物体悬空、皮球穿墙、箱子定身——一路认识了物理系统是模拟真实物理规律的引擎让世界落地生根;Rigidbody灵魂让物体动和 Collider身体让物体能碰是两大基石需配合使用;碰撞实打实阻挡与触发穿过去但报信是两种接触处理方式;用代码可以施加力、响应碰撞与触发事件、进行射线检测;实战中要注意 FixedUpdate、别硬移动物理物体、性能优化等要点;2D 与 3D 是两套独立的物理世界不可混用。回过头看物理系统在游戏开发里扮演着一个低调却根本的角色。它不像华丽的特效那样吸引眼球玩家甚至根本意识不到它的存在——但正是这种意识不到,才是它最大的成功。因为当一切都符合直觉时我们是不会特意去注意它的。球该落就落墙该挡就挡箱子该倒就倒——一切理所当然。玩家沉浸其中感觉这个虚拟世界真实可信,却说不出为什么。而这份可信,正是物理系统在幕后默默构筑的地基。只有当物理出了 bug——角色卡进墙里、道具诡异地乱飞、车子无故弹上天——玩家才会猛然惊觉“这个世界不对劲”那一刻恰恰反证了物理系统平日里的功劳。所以物理系统是让虚拟世界从看起来像进化到感觉起来真的关键一环。它把冰冷的坐标数字变成了会下落、会碰撞、会滚动、会飞溅的活物。它是连接虚拟与直觉的桥梁是让玩家愿意相信、愿意沉浸的那份底层承诺。掌握了物理系统你就掌握了为虚拟世界立法的能力——让你亲手创造的那方天地从此有了重量有了阻挡有了牛顿定律般不容置疑的秩序与真实。而这正是让一个世界真正活过来的最坚实的第一步。
让虚拟世界“落地生根“:深入浅出 Unity 物理系统
发布时间:2026/7/10 2:52:11
引子一个违和的世界想象你正在玩一款游戏。你操控角色走到悬崖边纵身一跃——然后你的角色没有下坠而是像卡了 bug 一样僵直地悬浮在半空中纹丝不动。或者你朝墙上扔了一个皮球皮球啪地一声直接穿墙而过消失在墙的另一边仿佛那堵墙根本不存在。再或者你推倒一堆箱子箱子们不是哗啦啦地散落一地而是像被施了定身法保持着原来的姿势一动不动。你会有什么感觉违和。极度的违和。这个世界不对劲,它违背了我们从出生起就深深刻在骨子里的常识——东西会往下掉、实体不能互相穿透、推一下会动、撞一下会弹。而这些理所当然的常识在虚拟世界里其实一点都不理所当然。计算机并不知道什么叫重力,什么叫碰撞。默认情况下游戏里的一切物体都只是漂浮在三维空间里的幽灵——它们没有重量可以互相穿透永远静止不动。要让这个虚拟世界落地生根、变得可信、符合直觉我们就必须为它注入一套物理法则。而负责这件事的就是我们今天的主角——Unity 物理系统Physics System。它就是虚拟世界里的牛顿,为万物立下运动与碰撞的法则。一、物理系统是什么—— 虚拟世界的物理引擎让我们先给它一个清晰的定位。Unity 物理系统是一套模拟真实世界物理规律的引擎。它负责计算物体的运动、重力、碰撞、摩擦、弹性等一切与力和运动相关的行为让虚拟物体表现得像现实中的物体一样。在 Unity 内部这套系统由成熟的物理引擎驱动3D 主要基于 NVIDIA 的 PhysX2D 则基于 Box2D。你不需要自己去写重力公式“碰撞检测算法这些极其复杂的底层数学——Unity 已经把它们打包好了。你要做的只是给物体贴上标签”,告诉系统“嘿这个物体请按物理规律来对待它。”用一个比喻来理解如果说没有物理系统的游戏世界是一个静止的画片博物馆——所有东西都摆在那儿纹丝不动那么加入物理系统后这个世界就变成了一个活的游乐场——球会滚、箱子会倒、角色会摔、爆炸会把碎片崩得到处都是。物理系统就是让世界从静态画片变成动态现实的那股神奇力量。那么具体怎么给物体贴标签,让它们服从物理法则呢这就要引出物理系统的两大核心组件了。二、两大基石Rigidbody 与 Collider在 Unity 物理系统里有两个组件是绝对的核心、是基石中的基石。理解了它们你就掌握了物理系统的半壁江山。它们就是——刚体Rigidbody和碰撞器Collider。这两者的关系是初学者最容易混淆、也最需要理清的。我们用一个生动的比喻来一次性讲透。Rigidbody刚体—— 赋予物体灵魂让它动起来Rigidbody是让物体接受物理引擎控制的组件。一旦你给一个物体加上了 Rigidbody 组件就相当于对物理系统宣告“从现在起这个物体交给你管了请给它施加重力、让它响应力的作用、计算它的运动。”于是神奇的事情发生了这个物体会开始下落受重力你推它一把它会移动受力你让它飞出去它会带着惯性继续前进。它拥有了质量、速度、动量这些物理属性成了一个真正有分量的实体。没有 Rigidbody 的物体是物理世界里的局外人——重力对它无效力对它无效它只能靠你写代码硬生生地移动它的坐标。而有了 Rigidbody物体就活了它会自己遵循物理规律运动。比喻Rigidbody 就像是给一个木偶注入了会响应牵引的灵魂。没有它木偶只是个僵硬的摆件有了它你一拉线施加力它就会自然地摆动、下垂、晃荡。Collider碰撞器—— 赋予物体身体让它有边界Collider是定义物体物理形状、让它能发生碰撞的组件。我们知道游戏里的物体外观是由 Mesh网格决定的但那只是看得见的外壳。物理系统并不关心你长得多精致——它需要知道的是“这个物体的’实体边界’在哪里它碰到别的东西时该在哪里发生碰撞”Collider 就是用来定义这个实体边界的。它像给物体套上了一层隐形的碰撞外壳。常见的有Box Collider盒型立方体形状适合箱子、墙壁、地面。Sphere Collider球形球体形状适合球、炮弹。Capsule Collider胶囊形胶囊形状常用于角色。Mesh Collider网格完全贴合模型形状精确但性能开销大。有了 Collider两个物体靠近时物理系统才能检测到它们碰上了,从而阻止它们互相穿透或者触发碰撞反应。比喻如果说 Mesh 是物体看得见的皮肤,那 Collider 就是物体摸得着的身体。皮肤决定了它好不好看身体决定了它能不能被碰到、会不会被穿透。黄金搭档两者如何配合现在最关键的问题来了Rigidbody 和 Collider该怎么配合记住这个核心原则Rigidbody 负责让物体动Collider 负责让物体能碰。要实现完整的物理交互比如一个球落到地上并停住通常需要两者配合。我们用一个最经典的场景来说明——“一个球掉到地上”球需要Rigidbody让它受重力下落Collider球形碰撞器让它有实体。地面需要Collider让它有实体能挡住球但通常不需要 Rigidbody因为地面是静止的不需要它自己运动下落。当游戏运行时球因为有 Rigidbody受重力开始下落下落到接触地面时球的 Collider 碰到了地面的 Collider物理系统检测到碰撞于是阻止球继续下坠球稳稳地停在了地面上。看这就是一次完美的配合Rigidbody 提供了运动的动力,Collider 提供了碰撞的边界,二者协作才上演了这幕最自然不过的球落地。几种常见组合的对照物体类型RigidbodyCollider例子会动、会碰撞✅ 有✅ 有掉落的球、可推的箱子静止、能挡住东西❌ 无✅ 有地面、墙壁、静态障碍只做逻辑、不参与碰撞❌ 无❌ 无纯装饰物、UI三、两种实体:碰撞Collision与触发Trigger理解了 Rigidbody 和 Collider我们再深入一层看看物体接触时的两种不同处理方式。这也是物理系统里极其实用的一个知识点。Collider 有一个重要的开关叫Is Trigger是否为触发器。它决定了物体接触时是走碰撞路线还是走触发路线。碰撞Collision—— 实打实的物理阻挡当Is Trigger关闭时默认状态Collider 是一个实心的物理实体。物体之间会发生真实的物理碰撞——它们会互相阻挡、反弹、推挤无法穿透彼此。比如一个球撞到墙上会弹回来两辆车相撞会互相顶开角色走到墙边会被挡住。这些都是碰撞——实打实的物理阻挡与反应。触发Trigger—— “穿过去但会报信”当Is Trigger开启时Collider 就变成了一个幽灵区域。物体可以直接穿过它不会被阻挡但当有物体进入、停留、离开这个区域时系统会发出通知触发事件让你知道有东西进来了。这在游戏里用途极广拾取道具角色走进金币的触发区域 → 触发捡起金币事件金币不会挡住角色。进入区域玩家走进某个地带 → 触发播放剧情“刷出敌人”。感应门角色靠近 → 触发开门。陷阱区域踏入 → 触发扣血。一句话区分碰撞Collision是撞到了走不过去;触发Trigger是穿过去了但我知道你来过。前者管物理阻挡,后者管事件感应。在代码里这两种情况分别对应不同的回调函数我们下面会讲千万别搞混。四、动手实战用代码驾驭物理系统理论讲透了我们来看看如何用 C# 代码与物理系统互动。这部分会让你真正感受到物理系统的强大。1. 给物体施加力让它动起来给有 Rigidbody 的物体施加力是最常见的操作。比如让一个球跳起来usingUnityEngine;publicclassBallJump:MonoBehaviour{privateRigidbodyrb;publicfloatjumpForce5f;voidStart(){rbGetComponentRigidbody();}voidUpdate(){// 按空格键给球一个向上的冲量if(Input.GetKeyDown(KeyCode.Space)){rb.AddForce(Vector3.up*jumpForce,ForceMode.Impulse);}}}rb.AddForce就是给物体施加力。加了力之后剩下的下落、减速、落地全都由物理系统自动接管——你不用管重力怎么算、什么时候落地物理引擎会替你搞定一切。这就是物理系统的魅力你只需推一把,世界会自然地回应。2. 处理碰撞事件当两个实心Collider 碰撞时Unity 会自动调用以下回调函数前提是至少有一方带 Rigidbody// 碰撞开始的那一刻voidOnCollisionEnter(Collisioncollision){Debug.Log(撞到了collision.gameObject.name);// 比如撞到敌人就扣血if(collision.gameObject.CompareTag(Enemy)){TakeDamage(10);}}// 碰撞持续期间每帧调用voidOnCollisionStay(Collisioncollision){}// 碰撞结束、分开的那一刻voidOnCollisionExit(Collisioncollision){}OnCollisionEnter里的collision参数包含了丰富的碰撞信息——撞到了谁、在哪个点接触、以多大的力……你可以据此做出各种反应。3. 处理触发事件当涉及 Trigger触发器时用的是另一组回调// 有物体进入触发区域voidOnTriggerEnter(Colliderother){Debug.Log(other.gameObject.name 进入了区域);// 比如玩家进入捡起金币if(other.CompareTag(Player)){CollectCoin();}}// 物体停留在触发区域内每帧调用voidOnTriggerStay(Colliderother){}// 物体离开触发区域voidOnTriggerExit(Colliderother){}注意区分碰撞用OnCollisionXXX参数是Collision触发用OnTriggerXXX参数是Collider。这是新手极易混淆的地方务必记牢。4. 射线检测Raycast:物理系统的探照灯物理系统还提供了一个超级实用的工具——射线检测Raycast。它能从一个点朝某个方向发射一条看不见的射线,检测这条线上碰到了什么。voidShoot(){RaycastHithit;// 从摄像机位置朝前方发射射线if(Physics.Raycast(transform.position,transform.forward,outhit,100f)){Debug.Log(击中了hit.collider.gameObject.name);Debug.Log(击中点坐标hit.point);}}射线检测用途极广射击游戏判断子弹打中了谁、鼠标点击选中场景中的物体、检测角色脚下是否有地面、AI 判断前方有没有障碍……都靠它。它就像物理系统的一支探照灯,能精准地探测出射线路径上的一切。五、物理系统的隐藏规则与实战要点用好物理系统还有一些关键的规则和坑需要知道。要点一物理计算要用 FixedUpdate这是一个至关重要、却常被新手忽略的点。Unity 里Update()每帧执行一次但每帧的时间间隔是不固定的帧率高时间隔短帧率低时间隔长。而物理计算需要稳定、固定的时间步长才能准确。因此所有与物理相关的操作尤其是 AddForce、修改 Rigidbody 速度等都应该放在FixedUpdate()里而不是Update()。voidFixedUpdate(){// 物理相关操作放这里保证计算稳定rb.AddForce(Vector3.forward*speed);}FixedUpdate以固定的时间间隔执行默认 0.02 秒一次与帧率无关能保证物理模拟的稳定和准确。记住逻辑输入检测用 Update物理施力用 FixedUpdate。要点二别用 transform 直接移动物理物体如果一个物体有 Rigidbody不要用transform.position ...去硬移动它——这会绕过物理系统导致碰撞检测出错比如穿墙。正确的做法是通过 Rigidbody 来移动比如用rb.MovePosition()或施加力/设置速度。让物理系统来主导有 Rigidbody 物体的运动才能保证物理行为正确。要点三Kinematic运动学刚体Rigidbody 有一个Is Kinematic选项。开启后物体不再受重力和外力影响但依然能参与碰撞检测并且可以由代码如动画精确控制其位置。这在很多场景很有用比如一个由动画驱动的平台你不希望它被物理推动但希望角色站上去时能被它承载、能触发碰撞。这时就用 Kinematic 刚体。要点四性能优化物理计算是有成本的。几条优化原则优先用简单碰撞器Box、Sphere、Capsule慎用 Mesh Collider尤其是复杂模型的。静止不动的物体不要加 Rigidbody如地面、墙只加 Collider 即可。合理使用碰撞层Layer与碰撞矩阵让不需要相互碰撞的物体互相忽略,减少无谓的检测。不需要物理的物体就别加物理组件。六、2D 与 3D两套平行的物理世界最后补充一点Unity 的物理系统其实有两套——3D 物理和2D 物理它们是相互独立的两个平行世界。3D 物理组件是Rigidbody、BoxCollider、SphereCollider等基于 PhysX。2D 物理组件是Rigidbody2D、BoxCollider2D、CircleCollider2D等基于 Box2D专为 2D 游戏优化。关键提醒两套系统不能混用你不能让一个 3D 的BoxCollider和一个 2D 的BoxCollider2D发生碰撞。做 2D 游戏就全程用 2D 组件做 3D 游戏就用 3D 组件。选错了物理交互就完全失效。概念上2D 和 3D 物理是相通的——都有刚体、碰撞器、触发器、力、射线检测只是一个在平面XY里运作一个在立体空间里运作。理解了 3D2D 也就触类旁通了。尾声物理系统是可信世界的地基我们从一个违和的世界出发——物体悬空、皮球穿墙、箱子定身——一路认识了物理系统是模拟真实物理规律的引擎让世界落地生根;Rigidbody灵魂让物体动和 Collider身体让物体能碰是两大基石需配合使用;碰撞实打实阻挡与触发穿过去但报信是两种接触处理方式;用代码可以施加力、响应碰撞与触发事件、进行射线检测;实战中要注意 FixedUpdate、别硬移动物理物体、性能优化等要点;2D 与 3D 是两套独立的物理世界不可混用。回过头看物理系统在游戏开发里扮演着一个低调却根本的角色。它不像华丽的特效那样吸引眼球玩家甚至根本意识不到它的存在——但正是这种意识不到,才是它最大的成功。因为当一切都符合直觉时我们是不会特意去注意它的。球该落就落墙该挡就挡箱子该倒就倒——一切理所当然。玩家沉浸其中感觉这个虚拟世界真实可信,却说不出为什么。而这份可信,正是物理系统在幕后默默构筑的地基。只有当物理出了 bug——角色卡进墙里、道具诡异地乱飞、车子无故弹上天——玩家才会猛然惊觉“这个世界不对劲”那一刻恰恰反证了物理系统平日里的功劳。所以物理系统是让虚拟世界从看起来像进化到感觉起来真的关键一环。它把冰冷的坐标数字变成了会下落、会碰撞、会滚动、会飞溅的活物。它是连接虚拟与直觉的桥梁是让玩家愿意相信、愿意沉浸的那份底层承诺。掌握了物理系统你就掌握了为虚拟世界立法的能力——让你亲手创造的那方天地从此有了重量有了阻挡有了牛顿定律般不容置疑的秩序与真实。而这正是让一个世界真正活过来的最坚实的第一步。