首页/ 第 7 章 · 物理系统/ 第 99 课
LESSON 99 · 物理系统

物理层 Layer 碰撞矩阵

物理层与碰撞矩阵已掌握。下一课学射线检测 Raycast。

⏱ 约 14 分钟📊 难度:入门🗂 第 7 章 · 物理系统📍 第 99 / 300 课
课程进度
99 / 300

🎯本节学习目标

  • 理解碰撞矩阵原理
  • 掌握配置碰撞规则
  • 掌握代码 LayerMask 过滤

🚀课程导读

“子弹不打队友”“玩家不撞玩家”——通过物理层 + 碰撞矩阵控制“谁和谁碰撞”,让物理按规则运行。

碰撞矩阵配置

在设置里划规则。

  1. 先创建物理层:Edit → Project Settings → Tags and Layers → 在 User Layer 输入层名(如 Player、Enemy、Bullet、Wall)。
  2. 给对象设置 Layer(Inspector 顶部的 Layer 下拉,第 78 课)。
  3. 打开碰撞矩阵:Edit → Project Settings → Physics(或 Physics 2D)→ Layer Collision Matrix。
  4. 矩阵是一个“网格”,行与列的交叉勾选 = 这两个层会发生碰撞。
  5. 【配置示例】让 Bullet 只与 Wall 和 Enemy 碰撞、不与 Player 碰撞:取消 Bullet 行与 Player 列的勾选。
  6. 【效果】勾掉的组合不再发生物理碰撞与触发。
  7. 【注意】碰撞矩阵是全局配置,影响所有对象。
💡
正确分层 + 矩阵,能大幅减少不必要的碰撞计算,是性能优化手段之一(第 16 章)。

代码中用 LayerMask

在射线/物理查询里过滤。

  1. 【LayerMask 字段】public LayerMask targetMask; 在 Inspector 勾选要检测的层。
  2. 【射线过滤】Raycast 的 LayerMask 参数只检测指定层(第 100 课详讲):
  3. int layer = LayerMask.NameToLayer("Enemy");
  4. int mask = 1 << layer; // 位运算生成掩码
  5. Physics.Raycast(ray, out hit, 100f, mask);
  6. 【物理查询】OverlapSphere、SphereCast 等都有 LayerMask 参数(第 102 课)。
  7. 【检测某层】Physics.Raycast(..., 1 << LayerMask.NameToLayer("Enemy"))。
  8. 【实战】子弹射线只检测敌人层,忽略其他,实现“只打敌人”。
  9. 【注意】LayerMask 用位运算组合:mask = (1 << layerA) | (1 << layerB)。
💡
位运算 1 << layer 生成掩码要记住:它是 Unity 物理查询的标配。

常见错误与排查

错误:物体明明有碰撞体却互相穿过?
原因:两个层的碰撞矩阵被取消了
解决:检查 Physics 的 Layer Collision Matrix,把对应行列勾上。

动手练习

课后小任务(做出来才算真的学会)

  • 创建 Player/Enemy/Bullet/Wall 四层
  • 配置矩阵:子弹只碰墙和敌人
  • 用 LayerMask 让射线只检测敌人层

本节小结

物理层与碰撞矩阵已掌握。下一课学射线检测 Raycast。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课关节 Joint 详解