Version: 2017.1
셰이더 로드 시간 최적화
레이어 기반 충돌 감지

레이어

레이어(Layers)카메라 가 씬의 일부만 렌더링하고 광원 이 씬의 일부만 비추기 위해 가장 많이 사용됩니다. 그 외에도 콜라이더를 선별적으로 무시하거나 충돌을 생성하기 위해 레이캐스팅에서도 사용됩니다.

레이어 만들기(Creating Layers)

첫 번째 단계에는 GameObject 에 할당할 새 레이어를 만듭니다. 새 레이어를 만들려면 Edit 메뉴를 열고 Project Settings->Tags and Layers 를 선택합니다.

비어 있는 사용자 레이어 중 하나에 새 레이어를 만듭니다. 여기서는 레이어 8을 선택합니다.

레이어 할당(Assigning Layers)

이제 새 레이어를 만들었으므로 이 레이어를 게임 오브젝트 중 하나에 할당해야 합니다.

태그 관리자에서 플레이어 레이어를 레이어 8로 할당했습니다.

카메라의 컬링 마스크로 씬의 일부만 그리기(Drawing only a part of the scene with the camera’s culling mask)

카메라의 컬링 마스크를 사용하여 특정 레이어 하나에 있는 오브젝트를 선별적으로 렌더링할 수 있습니다. 이렇게 하려면 오브젝트를 선별적으로 렌더링할 카메라를 선택합니다.

컬링 마스크 프로퍼티에서 레이어를 선택하거나 선택 해제하여 컬링 마스크를 수정합니다.

UI 요소는 컬링되지 않습니다. 스크린 공간 캔버스 자식은 카메라의 컬링 마스크를 사용하지 않습니다.

선별적 레이캐스팅

레이어를 레이캐스팅에 사용하고 특정 레이어의 콜라이더를 무시하는 데 사용할 수 있습니다. 예를 들어 플레이어 레이어에만 레이캐스팅를 적용하고 그 외의 모든 콜라이더는 무시하고 싶을 수 있습니다.

Physics.Raycast 함수는 비트마스크를 사용하고, 각 비트에 따라 레이어 무시 여부가 결정됩니다. 레이어마스크의 모든 비트가 켜져 있으면 모든 콜라이더에 충돌합니다. 레이어마스크가 = 0이면 어떤 것도 레이와 충돌하지 않습니다.

// JavaScript example.

// bit shift the index of the layer to get a bit mask
var layerMask = 1 << 8;
// Does the ray intersect any objects which are in the player layer.
if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    print ("The ray hit the player");


// C# example.

int layerMask = 1 << 8;
        
// Does the ray intersect any objects which are in the player layer.
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    Debug.Log("The ray hit the player");


하지만, 보통은 그 반대로 플레이어 레이어에 있는 콜라이더를 제외한 모든 콜라이더에 레이캐스트를 적용하는 것을 원합니다.

// JavaScript example.
function Update () {
  // Bit shift the index of the layer (8) to get a bit mask
  var layerMask = 1 << 8;
  // This would cast rays only against colliders in layer 8.
  // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
  layerMask = ~layerMask;

  var hit : RaycastHit;
  // Does the ray intersect any objects excluding the player layer
  if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    print ("Did Hit");
  } else {
    Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    print ("Did not Hit");
  }
}


// C# example.
void Update () {
    // Bit shift the index of the layer (8) to get a bit mask
    int layerMask = 1 << 8;
        
    // This would cast rays only against colliders in layer 8.
    // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
    layerMask = ~layerMask;
    
    RaycastHit hit;
    // Does the ray intersect any objects excluding the player layer
    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 레이어를 사용하는 콜라이더만 무시됩니다. 이 방법은 레이캐스팅을 적용할 때 일부 콜라이더를 무시하는 가장 간단한 방법입니다.


  • 2017–05–08 일부 편집 리뷰를 거쳐 페이지 수정됨

  • Unity 2017.1에서 컬링 마스크 정보 업데이트됨

셰이더 로드 시간 최적화
레이어 기반 충돌 감지