Layers

Layers는 씬의 한 부분만을 그리기 위해 Cameras에 의해서 주로 사용되고 씬의 부분들만을 비추기위해 Lights에 의해 사용되기도 합니다. 그러나 그들은collisions을 생성하기 위해서나 또는 colliders을 선택적으로 무시하기 위해 raycasting에 의해 사용될 수 있습니다.

Creating Layers

첫 번째 스텝은 새로운 레이어를 생성하는 것이고 그것은 우리가 하나의 GameObject를 지정할 수 있습니다. 새로운 레이어를 생성하기 위해서 Edit 메뉴를 열고 Project Settings→Tags를 선택합니다.

우리는 빈 User Layers 하나에서 새로운 레이어를 생성합니다. 우리는 레이어 8을 선택합니다.

Assigning Layers

사용자는 새로운 레이어를 선택하고 게임 오브젝트의 하나에 그 레이어를 지정해야만 한다는 것을 명심해야 합니다.

태그 manager에서 우리는 플레이어 레이어를 레이어 8이 되도록 지정했습니다.

Drawing only a part of the scene with the camera's culling mask

카메라의 culling 마스크를 사용해서 사용자는 선택적으로 하나의 특정한 레이어에 있는 물체를 표현할 수 있습니다. 이것을 하기 위해서 선택적으로 물체를 표현해야 하는 카메라를 선택합니다.

Culling 마스크 속성에서 체크하거나 또는 체크하지 않는 레이어에 의해 culling 마스크를 변경합니다.

Casting Rays Selectively

레이어를 사용해서 사용자는 광선을 캐스트할 수 있고 특정 레이어에서 colliders를 무시할 수 있습니다. 예를 들어 사용자는 플레이어 레이어에 반하여 하나의 광선을 캐스트하고 싶을지도 모르고 모든 다른 colliders를 무시할지도 모릅니다.

Physics.Raycast 함수는 각 비트가 하나의 레이어가 무시되어질 것인지 아닌지를 결정하는 bitmask를 취합니다. layerMast에서 모든 비트들이 세팅된다면 우리는 모든 colliders에 반하여 충돌할 것입니다. 만약 layerMast가 0라면 우리는 광선과 함께인 어떠한 충돌도 결코 찾을 수 없을 것입니다.

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

실제 세상에서 우리는 그것의 반대를 원합니다. 그러나 우리는 플레이어 레이어에서 그것들 외에 모든 colliders에 반하여 하나의 광선을 캐스트하기를 원합니다.

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

우리가 layerMast를 Raycast 함수로 패스하지 않을 때 그것은IgnoreRaycast 레이어를 사용하는 colliders을 무시할 것입니다. 이것이 광선을 캐스팅할 때 colliders을 무시하는 가장 쉬운 방법입니다.

역링크