Optimizing Shader Load Time
레이어 기반의 충돌 감지

레이어

LayersCameras에 따라 씬의 일부만 렌더링 하거나, Lights에 따라 씬의 일부만 밝히는 등에 가장 자주 사용됩니다. 한편, 선택적으로 Collider를 무시 또는 Collisions을 생성하는 데에도 사용하실 수 있습니다.

레이어 만들기

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

빈 User Layer 안에서 새 레이어를 만듭니다. 여기에서는 레이어 8을 선택합니다.

레이어 할당

새 레이어는 만들어졌으므로 다음 게임 오브젝트 중 하나에 할당합니다.

Tag Manager에서 Player 레이어를 레이어 8에 할당했습니다.

씬의 일부만을 카메라 컬링 마스크로 그리기

카메라 컬링 마스크를 사용하여 특정 단일 레이어에 있는 오브젝트만을 선택적으로 렌더링 할 수 있습니다. 따라서 오브젝트를 선택적으로 렌더링 할 카메라를 선택합니다.

Culling Mask 프로퍼티에서 레이어의 체크 여부에 따라 컬링 마스크의 설정을 변경할 수 있습니다.

선택적으로 Raycast하기

레이어를 사용하여 Raycast할 때 특정 레이어 콜라이더를 무시할 수 있습니다. 예를 들면 Player 레이어에만 Raycast하여 다른 오브젝트를 무시하고 싶은 경우가 있을지도 모릅니다.

Physics.Raycast 함수는 비트 마스크를 사용하여 각각의 비트에서 각 레이어를 무시할지 여부를 판정시킬 수 있습니다. layerMask(레이어 마스크)의 모든 비트가 유효한 경우에는 모든 콜라이더와 충돌합니다. 만약 layerMask=0의 경우 Ray에 의해 충돌하지 않습니다.

// 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");


현실 세계에서는 그 반대를 하고 싶은 경우가 있습니다. Player 레이어를 제외한 모든 콜라이더에 Raycast합니다.

// 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 함수에 layerMask를 전달하지 않으면 IgnoreRaycast 레이어의 콜라이더만 무시합니다. Raycast 때 일부 콜라이더를 무시하려면 이것이 가장 쉬운 방법입니다.

Optimizing Shader Load Time
레이어 기반의 충돌 감지