셰이더 로드 시간 최적화(Optimizing Shader Load Time)
레이어 기반 충돌 감지

레이어

레이어(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)

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

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

선별적 레이캐스팅

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

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 레이어를 사용하는 콜라이더만 무시됩니다. 이 방법은 레이캐스팅을 적용할 때 일부 콜라이더를 무시하는 가장 간단한 방법입니다.

셰이더 로드 시간 최적화(Optimizing Shader Load Time)
레이어 기반 충돌 감지