UPL7-1——Physics Debugger

Physics Debugger

Physics Debugger 是 Unity 提供的一个 物理系统可视化调试工具
它不会改变场景中的物理行为,而是通过图形化的方式把:

  • 碰撞体(Collider)
  • 刚体(Rigidbody)
  • 触发器(Trigger)
  • 关节(Joint)
  • 接触点(Contact)
  • 射线检测(Raycast)
  • 范围检测(Overlap)

等信息直观显示在 Scene 视图里

帮助开发者快速定位物理相关的问题,它严格来说并不是性能检测工具,而是用于定位物理碰撞表现问题的,比如:

  • 定位为什么碰撞没有触发
  • 为什么子弹打不中敌人
  • 关节为什么拉扯异常

等等问题的

点击工具栏 ——> Window ——> Analysis ——> Physics Debugger 即可打开相应窗口:

image

初始 Physics Debug 窗口

image

物理调试窗口中,主要由五部分组成:

  1. Info(信息)

    显示被选中物理对象(通常是 Rigidbody)的运行时物理属性
    用途:检查某个物体在运行时的物理状态是否正常,比如为什么这个刚体不动、为什么它抖动等等

    image

  2. Filtering(过滤)

    控制哪些物理对象会在 Scene 视图中显示
    用途:当场景里物体太多时,只显示与调试相关的碰撞体/刚体,避免视图杂乱

    image

  3. Rendering(渲染)

    调整物理调试可视化的显示方式
    用途:让调试显示更清晰。例如在复杂场景中,给不同对象分配不同颜色

    image

  4. Contacts(联系方式)

    显示物体之间的物理接触信息
    用途:调试 碰撞为什么没有触发、为什么会穿模、为什么弹力怪异,能看到碰撞点在哪里、法线指向哪里

    image

  5. Queries(查询)

    可视化物理查询操作
    用途:调试射线、范围检测逻辑是否正常,比如子弹打不中敌人,是因为 Raycast 没命中还是方向错了的问题

    image

调整了上边页签的数值后,点击右侧的 Reset 即可重置参数

打开 Physics Debugger 后,Scene 中会出现 Physics Debug 的小窗口,它是 Scene 窗口里 Physics Debugger 的浮动工具栏
它提供了几个快速开关,主要用于控制物理调试可视化的显示内容

image

  1. Collision Geometry(碰撞几何体)

    作用:是否在 Scene 视图中绘制 碰撞几何体(Collider) 的可视化,勾选时会显示 各种碰撞器 的线框和形状轮廓
    主要用于检查物体的 物理碰撞体和视觉模型是否对齐,排查看起来模型碰到了,但物理没碰到的问题

    image

  2. Mouse Select(鼠标选择)

    作用:勾选后,你用鼠标点击某个物体时,会在 Scene 视图里给出 颜色高亮,方便我们通过鼠标选择更直观的观察对象

    image

Info(信息)页签

显示被选中物理对象(通常是 Rigidbody)的运行时物理属性
用途:检查某个物体在运行时的物理状态是否正常,比如为什么这个刚体不动、为什么它抖动等等

当你未选择任何对象时会显示:

image

当没有选择任何对象时会提示: 选择一个带有 Rigidbody​(刚体)或 ArticulationBody​(关节体)组件的 GameObject,以显示它的相关信息

image

  • Number of items per row(每行项目数): 设置调试信息在窗口中每行显示几个对象

  • Tracked objects(追踪对象): 当前正在跟踪的物体数量

    点击 Clear locked objects 会将 Info 页签内当前锁定显示的对象清空

  • GameObject(游戏对象): 被跟踪的具体对象,会显示对象名

  • Draw Gizmos for(绘制工具): 决定在场景里为该对象绘制哪类辅助图形

    image

    • None: 不绘制额外辅助图形,只显示普通的物理可视化

    • Center Of Mass(质心): 会在 Scene 视图中绘制一个小标记(通常是球或者十字),表示刚体的 质心位置

      质心不一定在几何中心,比如带有偏移 Collider 的物体,它的质心就可能偏移
      用于调试物体的旋转行为。刚体绕质心旋转,如果质心位置偏移不对,可能导致旋转怪异

      image

    • Inertia Tensor(惯性张量): 会绘制一个类似“椭球”或三根轴线的图形,表示刚体的 惯性张量方向和大小

      惯性张量描述了物体对不同方向旋转的“抗拒程度”
      用于调试物体旋转时的动力学。如果你发现物体某个方向特别难旋转,可以用这个 Gizmo 检查惯性张量是不是和物体几何不匹配
      长轴易转,短轴难转

      image

  • 速度相关(Speed)

    • Speed(速度): 物体的瞬时速度大小,单位为 m/s
    • Velocity (X/Y/Z)(速度): 物体在世界坐标下的方向速度向量
    • Angular Velocity (X/Y/Z)(角速度): 物体绕个轴的角速度向量,单位是 rad/s
  • 惯性张量相关(Inertia Tensor 衡量扭动物体有多难)

    • Inertia Tensor (X/Y/Z)(惯性张量): 刚体在本地坐标系下的惯性张量分量,用来描述物体对旋转加速度的阻抗(系统对外部作用的反抗程度)。
    • Inertia Tensor Rotation (X/Y/Z)(惯性张量旋转): 惯性张量的旋转方向,用四元数或欧拉角表示,定义了惯性张量相对刚体本地坐标的旋转。
  • 质心相关(Mass)

    • Local Center of Mass (X/Y/Z)(局部质心): 刚体在自身局部坐标系下的质心位置。
    • World Center of Mass (X/Y/Z)(世界质心): 刚体在世界坐标系下的质心位置。
  • 休眠状态和阈值(Sleep)

    • Sleep State(休眠状态): 刚体当前是否处于睡眠状态

      • Asleep = 静止且不参与物理模拟
      • Awake = 活跃
    • Sleep Threshold(休眠阈值): 当物体速度低于该阈值时,会进入睡眠状态

  • 限制参数

    • Max Linear Velocity:最大线性速度上限,超过会被截断,防止数值过大导致模拟不稳定。
    • Max Angular Velocity: 最大角速度上限
  • 求解器参数(Solver)

    • Solver Iterations(求解器迭代): 物理解算迭代次数(用于处理碰撞和约束)。 数值越大精度越高,但性能开销更大。
    • Solver Velocity Iteration(求解器速度迭代): 解算速度相关的迭代次数(影响摩擦、反弹等效果的精度)。

调试建议:

  1. 确定物体为啥不动

    主要看 Velocity(速度)、Sleep State(休眠状态)

  2. 排查旋转异常

    主要看 Angular Velocity(角速度)、Inertia Tensor (惯性张量)

  3. 排查穿透或弹力怪异

    主要看 Solver Iterations(求解器迭代)和下文的 Contacts(联系页签) 等等

Filtering(过滤)页签

控制哪些物理对象会在 Scene 视图中显示
用途:当场景里物体太多时,只显示与调试相关的碰撞体/刚体,避免视图杂乱

image

  • Show Physics Scene(显示物理场景): 选择要调试的 物理场景

    Unity 支持多物理场景(比如多线程模拟、子场景),这里可以切换

  • Show Unity Scene(显示Unity场景): 选择对应的 Unity 场景(Scene)

    通常一个物理场景对应一个 Unity 场景

  • Show Layers(显示层级): 根据 Layer 来过滤,只显示特定 Layer 的物理对象

    例如只显示 Player、Enemy

  • 按物体类别过滤

    • Show Static Colliders(显示静态碰撞器): 显示静态碰撞体

      即显示无 Rigidbody​ 的 Collider,常见于地形、建筑

    • Show Triggers(显示触发器): 显示触发器 Collider

      显示 isTrigger = true 的碰撞体

    • Show Rigidbodies(显示刚体): 显示所有刚体

      显示带 Rigidbody 的物体

    • Show Kinematic Bodies(显示运动学刚体): 显示运动学刚体

      显示 isKinematic = true​ 的 Rigidbody
      它们不会受物理模拟影响,但能驱动物理

    • Show Articulation Bodies(显示关节体): 显示 ArticulationBody 组件

      ArticulationBody 主要用于机器人/机械臂模拟

    • Show Sleeping Bodies(显示休眠的刚体): 显示 睡眠中的刚体

      Rigidbody 处于 Sleep 状态,不再参与模拟

  • 按碰撞体类型过滤(Collider Types)

    • Show BoxColliders(显示盒装碰撞器)
    • Show SphereColliders(显示球状碰撞器)
    • Show CapsuleColliders(显示胶囊碰撞器)
    • Show MeshColliders (convex)(显示凸型的网格碰撞器)
    • Show MeshColliders (concave)(显示凹型的网格碰撞器,只能用于静态物体)
    • Show TerrainColliders(显示地形碰撞体)
  • Show None(一键取消选中所有,隐藏所有物理对象)

  • Show All(一键显示所有物理对象)

调试建议: 这个界面就是一个 物理可视化过滤器,让我们在复杂场景里筛选出想调试的部分

Rendering(渲染)页签

调整物理调试可视化的显示方式
用途:让调试显示更清晰。例如在复杂场景中,给不同对象分配不同颜色

image

  • 颜色设置相关

    • Static Colliders(静态碰撞器): 设置今天碰撞体显示颜色,即无刚体的碰撞器

    • Triggers: 设置触发器碰撞体(isTrigger = true)显示颜色

    • Rigidbodies: 设置普通刚体显示颜色

    • Kinematic Bodies: 设置运动学刚体显示颜色

      显示 isKinematic = true​ 的 Rigidbody
      它们不会受物理模拟影响,但能驱动物理

    • Articulation Bodies: 设置关节刚体 ArticulationBody 显示颜色

      ArticulationBody 主要用于机器人/机械臂模拟

    • Sleeping Bodies: 设置处于 Sleep 状态的刚体的显示颜色

  • 渲染参数

    • Variation(变化):给不同物体随机加点颜色偏移,数值越大,颜色差异越明显

      避免一堆同类物体颜色完全一样

    • Transparency(透明度): 控制物体调试显示的透明度

      0 = 全不透明,1 = 全透明,一般调中间值方便观察叠加物体

    • Force Overdraw(强制叠加绘制): 如果勾选,会强制所有物体在 Scene 视图里渲染出来,即使有被遮挡。 类似“透视模式”,避免某些物体被挡住看不到。

    • View Distance(视距): 可视化的最大显示距离

      超过这个距离的物体不会绘制 Gizmo,可以减少 Scene 杂乱和性能开销

    • Terrain Tiles Max(地形瓦片绘制最大值): 针对 Terrain Collider 的优化,限制一次最多绘制多少个地形瓦片

  • Gizmos settings(绘制小工具设置)

    主要影响 Info 页签设置的 Draw Gizmos for 绘制的内容

    • Constant screen size(Constant screen size): 如果勾选,物体 Gizmo(如质心点、碰撞体线框)会在 Scene 视图里保持固定屏幕大小,而不是随镜头远近缩放。 常用于调试小物体时避免 Gizmo 太小看不清
    • Inertia Tensor scale(惯性张量比例): 控制显示的惯性张量 Gizmo 的缩放 例如把它调大,更容易看清楚刚体的主惯性轴方向

调试建议: 这个界面就是一个 调试工具颜色设置界面,可以让我们自定义颜色、细节显示,方便我们更清楚直观的观察物理系统对象的变化

Contacts(联系方式)页签

显示物体之间的物理接触信息
用途:调试 碰撞为什么没有触发、为什么会穿模、为什么弹力怪异,能看到碰撞点在哪里、法线指向哪里

image

image

  • 接触点显示信息相关

    • Show Contacts(显示接触信息): 总开关

      是否在 Scene 里显示物体的接触点,开启后,才可以详细设置下方的勾选项

    • Show All Contacts(显示所有接触信息): 勾选后,会显示所有接触点(有时两个物体接触可能有多个接触点,比如箱子放在地面上)

      image

    • Show Impulse(显示接触点冲量): 显示物理引擎在这个点施加了多大的反作用力 可用来调试反弹力度、碰撞是否过强/过弱

      image

    • Show Separation(显示接触点分离向量): 显示物体相互“推开”的方向和距离。 可用来调试物体是否正确分离,避免穿透

    • Use Filtering settings(使用过滤设置): 如果勾选,就会应用 Filtering 页签里的过滤条件(比如只显示某个 Layer 的接触点) 不勾选的话,就显示所有接触点

  • 接触点颜色设置

    • Use varied colors(使用多种颜色): 是否使用随机颜色来区分不同接触点,避免所有接触点看起来一样
    • Contact color(普通接触点的颜色设置)
    • Contact separation color(接触点分离向量颜色设置)
    • Contact impulse color(碰撞冲量颜色设置)

调试建议:接触页签主要是让我们在Scene窗口中可以清楚的看到:

  1. 物体之间到底哪些点发生了接触
  2. 接触点的碰撞强度
  3. 接触点的分离方向和距离
  4. 用不同颜色区分不同类型的信息

等等

Queries(查询)页签

可视化物理查询操作
用途:调试射线、范围检测逻辑是否正常,比如子弹打不中敌人,是因为 Raycast 没命中还是方向错了的问题

image

  • Show queries(显示物理查询信息): 总开关

    勾选后,Unity 会把你运行时的物理查询(Raycast、Overlap 等)绘制到 Scene 视图里

  • Query color(查询颜色): 用来绘制查询的 调试图形 的颜色 比如射线 Raycast 的线段、SphereOverlap 的球体边框,会用这里的颜色显示

  • Show shapes 显示形状设置

    • Sphere 显示球体查询(范围检测)
    • Box 显示盒装查询(范围检测)
    • Capsule 显示胶囊体查询(范围检测)
    • Ray 显示射线检测
  • Show types 显示类型设置

    • Overlay 会显示 Overlay 类型的查询 比如 Physics.OverlapSphere
    • Check 会显示 Check 类型的查询(返回 bool​ 值,判断是否有物体与形状相交) 比如 Physics.CheckBox 函数
    • Cast 会显示 Cast 类型的查询 比如 Physics.Raycast 函数
  • Max Queries: 最多显示多少条查询结果

  • Show None/All: 一键隐藏/显示 所有

调试建议: Queries 页签 主要用于 调试物理检测逻辑

  1. 你可以直观看到 射线、球体、盒子、胶囊体检测的范围和方向 排查是否是方法调用存在问题
  2. 判断为什么子弹没打中敌人、为什么 Overlap 检测不到碰撞体
  3. 控制显示数量,避免画面过载 等等