레이어를 사용하여 프로젝트와 워크플로를 최적화할 수 있습니다. 레이어의 일반적인 용도에는 다음 사항이 포함됩니다. * 레이어 기반 렌더링 * 레이어 기반 충돌
카메라의 컬링 마스크 를 사용하는 경우 특정 레이어나 레이어 선택의 오브젝트만 렌더링할 수 있습니다. 컬링 마스크를 변경하려면 사용할 카메라를 선택하고 인스펙터 창에서 Culling Mask 드롭다운을 선택합니다. 레이어의 체크박스를 지우면 씬에서 렌더링되지 않습니다.
참고: UI 요소와 스크린 공간 캔버스 자식은 위의 사항에 예외이며 상관없이 렌더링됩니다.
레이어를 사용하여 레이캐스트가 교차할 수 있는 게임 오브젝트를 지정할 수 있습니다. 레이캐스트가 게임 오브젝트를 무시하게 하려면 게임 오브젝트를 Ignore Raycast 레이어에 할당하거나 레이어마스크를 레이캐스트 API 호출에 전달합니다.
레이어마스크를 레이캐스트 API 호출에 전달하지 않으면 Unity는 Ignore Raycast를 제외한 모든 레이어와 일치하는 Physics.DefaultRaycastLayers를 사용합니다.
Physics.Raycast 함수는 비트마스크를 사용하고 각 비트는 레이의 레이어 무시 여부를 결정합니다. 레이어마스크의 모든 비트가 켜져 있으면 레이는 모든 콜라이더에 충돌합니다. 레이어마스크가 = 0이면 어떤 것도 레이와 충돌하지 않습니다.
예를 들어 레이어 8에 레이를 캐스트하려면 아래의 코드 샘플을 참조하십시오.
int layerMask = 1 << 8;
// Does the ray intersect any objects which are in layer 8?
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
{
Debug.Log("The ray hit the player");
그런 다음 반대로 수행하면 레이가 레이어 8을 제외한 모든 레이어와 충돌합니다.
void Update ()
{
// Bit shift the index of the layer (8) to get a bit mask
int layerMask = 1 << 8;
// This casts rays only against colliders in layer 8.
// But to collide against everything except layer 8, use the ~ operator because it inverts a bitmask.
layerMask = ~layerMask;
RaycastHit hit;
// Does the ray intersect any objects excluding layer 8.
if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask))
{
Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
Debug.Log("Did Hit");
}
else
{
Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
Debug.Log("Did not Hit");
}
}
참고: 레이어마스크를 Raycast 함수에 전달하지 않으면 IgnoreRaycast 레이어를 사용하는 콜라이더가 그대로 무시됩니다.