# LayerMask
- LayerMask 필요 이유 및 개념
Raycasting은 연산 부하가 매우 크다
이를 최적화하는 다양한 방법이 있다
복잡한 MeshCollider 대신 충돌용 Collider로 Raycasting을 하도록 하는 방식이 있다
이 방식은 당연히 최적화를 위해 많이 사용되는 방법이지만
Raycasting에서 해당 방식은 오브젝트가 많은 경우에 효과는 미비하다
그래서 모든 대상이 아닌 특정한 종류(대상)만 Raycasting을 하도록
bitmask를 이용한 것이 LayerMask이다
- Layer 추가방법
아무 오브젝트의 Inspector에서
Layer를 클릭해 AddLayer를 통해 우리가 원하는 Layer 추가 가능하다
- Layer 설정방법
Layer를 지정해주고 싶은 오브젝트의 Inspector에서
Layer를 클릭해 우리가 원하는 Layer를 선택하면 된다
- LayerMask 코드 사용법
비트플래그를 활용하는 방식도 있지만, 매번 숫자로 입력을 하는 것은 그다지이기에
LayerMask.GetMMask를 통해 원하는 Layer string을 인자로 넣어주면 된다
Pysics.Raycast()의 10번 overloading버전처럼
int layerMask를 입력해 주는 버전을 사용하면 된다
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
//int mask = (1 << 8) | (1 << 9);
LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
Debug.Log($"Raycast Camera {hit.collider.gameObject.name}");
}
}
# Tag
만약, Hierarchy 창에서
MainCamera 오브젝트의 Tag를 설정하지 않는 것으로 바꾸면
Camera.main.ScreenPointToRay() 같은 함수에서 오류가 발생한다
그 이유가 Camera.main을 타고 가면
Tag를 이용해 해당 오브젝트를 찾기 때문이다
이처럼 Tag는 다양하게 활용이 된다
GameObject.FindGameObjectwithTag(),
GameObject.FindGameObjectswithTag()를 이용해 Tag에 맞는 오브젝트들을 찾을 수도 있다
GameObject go = GameObject.FindGameObjectWithTag("MainCamera");
GameObject[] gos = GameObject.FindGameObjectsWithTag("MainCamera");
또한, hit.collider.gameObject.tag를 이용해 Raycast 및 충돌에서도 활용 가능하다
Debug.Log($"Raycast Camera {hit.collider.gameObject.tag}");
'게임 엔진 - 유니티 > [루키스] 유니티' 카테고리의 다른 글
[유니티 Note] 섹션 6-2 (0) | 2025.07.02 |
---|---|
[유니티 Note] 섹션 6-1 (0) | 2025.07.02 |
[유니티 Note] 섹션 5-5 (0) | 2025.07.02 |
[유니티 Note] 섹션 5-4 (0) | 2025.07.02 |
[유니티 Note] 섹션 5-3 (0) | 2025.07.02 |