UPL7-3——碰撞层矩阵

物理检测中的广义阶段和狭义阶段

具体概念详见:UPL2-9——Physics 模块

在物理引擎中,碰撞简称一般分两步:

  1. Broadphase(广义阶段 | 粗检测阶段 | 宽阶段检测)

    目标:快速找出可能会相撞的一对对象
    方法:用简单的边界盒(AABB:Axis-Aligned Bounding Box,轴对齐包围盒)进行检测
    特点:非常快,但不精确。它不会算真的撞没撞,只负责筛选出候选对

  2. Narrowphase(狭义阶段 | 精检测阶段 | 窄阶段检测)

    目标:对 Broadphase 找到的候选对象,进行更精确的检测
    方法:用实际碰撞体形状(球体、胶囊体、多边形、网格等)计算真正的接触点
    特点:精确但耗时大

因此在进行碰撞检测时,Broadphase 就像安检口的初筛,它是第一步会做的事情

优化物理引擎消耗的主要思路

物理引擎的 CPU 消耗,本质上就是碰撞检测和物理解算的计算量
Unity 的物理模块会对所有可能发生碰撞的对象进行检测,而这一步就是开销最大的部分之一

因此优化物理引擎消耗的主要思路,就是从本质上减少物理相关的无效计算

比如我们上节课学习的 增加物理更新时间步长 就是减少物理计算的一种方案
但是在采用这种方案时,一定要注意不能影响我们的物理表现

而设置碰撞层矩阵,就是 Unity 提供给我们的避免无效计算的有效解决方案

Layer Collision Matrix(碰撞层矩阵)设置

Layer Collision Matrix(碰撞层矩阵)设置,可以在 Unity 的 Project Settings 中的 Physics 相关页签中找到

image

在 Unity 的物理系统中,每个碰撞器都属于某一个 Layer(层级)
Layer Collision Matrix(层碰撞矩阵) 就是一张 Layer 与 Layer 之间是否参与碰撞检测的开关表

  1. 勾选,则两个层中的碰撞器会进行碰撞检测
  2. 取消勾选,则两个层中的碰撞器完全不会进入Broadphase(广义阶段)
    引擎会直接忽略这对 Layer 组合,可以节约 CPU 消耗

总的来说,Layer Collision Matrix(碰撞层矩阵)就是一个全局碰撞过滤器

举例说明:
假设游戏中有 Player、Monster、Bullet、UI 默认设置
Bullet 会跟 Player、Enemy、UI 层都进行碰撞检测,Player 也会跟 UI 层检测
这样的结果就是,产生了大量的无意义的检测,
我们可以通过设置 Layer Collision Matrix(层碰撞矩阵)大幅减少无意义计算,从而优化 CPU 性能