기본 패턴
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는 단순 분류표가 아니라 "물리/쿼리/렌더링 선택 기준"이므로, 프로젝트 초기에 팀 규칙으로 잡아 두는 편이 장기적으로 유리합니다.
빠른 정리
| 항목 | 역할 |
|---|---|
| Layer | 오브젝트 분류 |
| Collision Matrix | 레이어 간 충돌 허용 여부 |
LayerMask | 쿼리에서 볼 레이어 집합 |
| Raycast 필터링 | 필요한 대상만 검사 |
| 디버깅 순서 | 콜백/레이캐스트 이상 시 레이어부터 확인 |
주의할 점
레이어를 나중에 아무 기준 없이 늘리기 시작하면, 어떤 시스템이 어떤 레이어를 기대하는지 금방 흐려집니다. "충돌용", "레이캐스트용", "렌더링 구분용"을 최소한 문서로라도 먼저 나눠 두는 편이 좋습니다.
참고 링크
3 sources