빠른 비교
csharp
[SerializeField] private LayerMask targetMask;
if (Physics.Raycast(origin, direction, out RaycastHit hit, 100f, targetMask))
{
Debug.Log(hit.collider.name);
}갈리는 기준
- Layer는 "이 오브젝트를 어떤 그룹으로 취급할 것인가"를 정하는 시스템이고, Collision Matrix는 그 그룹끼리 실제 충돌 계산을 할지 말지를 정하는 전역 규칙입니다.
LayerMask는 특히 레이캐스트나 오버랩 쿼리에서 중요합니다. 모든 Collider를 다 보는 대신 필요한 레이어만 보게 하면 정확도와 비용이 함께 좋아집니다.- 충돌이 이상하게 안 나거나 너무 많이 나면 코드보다 먼저 Layer와 Matrix를 보는 편이 좋습니다. 물리 버그 상당수가 여기서 시작됩니다.
- 플레이어, 적, 투사체, 상호작용 오브젝트, UI용 3D 오브젝트를 레이어로 분리하면 Raycast와 Trigger 로직이 훨씬 단순해집니다.
- Layer는 단순 분류표가 아니라 "물리/쿼리/렌더링 선택 기준"이므로, 프로젝트 초기에 팀 규칙으로 잡아 두는 편이 장기적으로 유리합니다.
선택 기준
| 상황 | 적합한 선택 |
|---|---|
| 레이캐스트가 불필요한 오브젝트도 감지 | LayerMask로 필요한 레이어만 필터링 |
| 투사체가 아군에 맞는 버그 | Collision Matrix에서 레이어 간 충돌 규칙 확인 |
| 충돌이 안 나거나 너무 많이 남 | 코드보다 Layer 설정과 Matrix 먼저 확인 |
| 레이어 규칙이 프로젝트 전체에 퍼져 있음 | 프로젝트 초기에 팀 Layer 규칙 문서화 |
주의할 점
레이어 기준 없이 추가하다 보면 어떤 시스템이 어떤 레이어를 기대하는지 금방 흐려집니다. 초기에 용도별 레이어 규칙을 잡아 두세요.
csharp
// ❌ 레이어 없이 모든 Collider를 Raycast로 확인 → 의도치 않은 히트
Physics.Raycast(origin, direction, out RaycastHit hit);
// UI, Ground, Enemy 모두 감지됨
// ✅ LayerMask로 필요한 레이어만 필터링
[SerializeField] private LayerMask enemyMask;
// Inspector에서 "Enemy" 레이어만 체크
if (Physics.Raycast(origin, direction, out RaycastHit hit, 100f, enemyMask))
{
hit.collider.GetComponent<Enemy>()?.TakeDamage(damage);
}
// Collision Matrix 예시 (Project Settings > Physics):
// Player ↔ Enemy: 충돌 ON
// Player ↔ PlayerBullet: 충돌 OFF ← 아군 총알 자해 방지
// Enemy ↔ EnemyBullet: 충돌 OFF ← 적 총알 자해 방지참고 링크
3 sources