Quick answer: Verify each collider’s GameObject layer is what you think. Check for runtime Physics.IgnoreLayerCollision calls overriding the matrix, and confirm 2D vs 3D matrix.
The Layer Collision Matrix says “Projectile” shouldn’t hit “Projectile”, but bullets still collide. The layer assignment or a runtime override is wrong.
Check GameObject Layer
Select the bullet prefab. The Layer dropdown (top-right of Inspector) must be “Projectile”. A common bug: the collider is on a child object with a different layer than the parent.
Layers are per-GameObject; each collider uses its own GameObject’s layer.
Runtime Overrides
// This OVERRIDES the matrix at runtime:
Physics.IgnoreLayerCollision(projectileLayer, projectileLayer, false); // re-enables!
Search your codebase for IgnoreLayerCollision. A stray call with false re-enables a collision the matrix disabled. The matrix is just the initial state.
2D vs 3D Matrix
Physics (3D) and Physics2D have separate Layer Collision Matrices in Project Settings. Editing the 3D matrix does nothing for 2D colliders. Confirm you edited the right one.
Per-Collider Exclude Layers
Unity 2022+ colliders have Include Layers / Exclude Layers fields that override the global matrix per collider. Check these aren’t re-including the layer.
Verifying
Fire bullets near each other. They pass through. Other layer interactions still work per the matrix. No stray IgnoreLayerCollision calls.
“The matrix is the default; layer assignment and runtime overrides are the reality. Check all three.”
Document any IgnoreLayerCollision calls with a comment — they’re invisible in the editor and confuse everyone who only checks the matrix.