1. 레이어 ( Layers )
레이어(Layer)는 오브젝트들의 그룹을 만들고 관리하는 데 사용됩니다. 레이어는 씬의 일부분만을 렌더링 하거나, 물리적 충돌을 판정하는 데 사용됩니다. 유니티는 0-7까지의 유니티의 기본 레이어 외에 8~31개까지의 커스텀 레이어를 제공합니다. 그 이상의 레이어는 만들 수 없습니다.
추가, 수정 및 삭제의 레이어 관리는 Tags and Layers에서 합니다.
위의 그림의 녹색 부분을 클릭하면 Tags and Layers가 있습니다.
위치는 아래와 같습니다.
Edit → Project settings → Tags and Layers
1.1 선택적 렌더링
레이어는 선택적 렌더링에 사용됩니다. 카메라로부터 특정 레이어만을 렌더링하도록 합니다.
카메라에는 레이어를 선택할 수 있는 Culling Mask가 있습니다. Default는 모든 레이어를 렌더링 합니다.
게임오브젝트는 하나의 레이어 그룹에 속할 수 있습니다. 게임오브젝트를 생성하면, Defalut로 설정되어 있습니다.
게임오브젝트는 하위 요소로 다른 레이어 그룹에 속한 게임 오브젝트를 가질 수 있습니다. 하위 요소를 다른 레이어 그룹에 속하게 함으로써, 존재는 하나 보이지 않도록 하는 효과를 줄 수 있습니다.
1.2 레이어 충돌 매트릭스 (Layer Conllision Matrix)
레이어는 오브젝트들의 그룹입니다. 레이어를 기반으로 각 오브젝트 그룹들 간의 충돌을 관리할 수 있습니다.
레이어 충돌 매트릭스는 서로 충돌할 수 있는 레이어를 정의 합니다. 동일한 레이어끼리 충돌을 가능하게 하거나, 다른 레이어와의 충돌을 감지하지 않도록 설정할 수 있습니다.
충돌하는 모든 게임 오브젝트를 일일이 확인하는 것은 비효율적입니다. 레이어 충돌 매트릭스는 게임 오브젝트들의 간의 불필요한 연산을 하지 않도록합니다.시스템에서 충돌을 처리하지 않으므로, 물리 연산에 드는 자원 및 시간을 절약합니다. 결론적으로 성능 향상에 도움을 줍니다.
Layers의 물리 출동 설정은 Project settings에서 합니다.
Edit → Project settings → Physics or Physics 2D → Layer Collision Matrix
※ Physics 와 Physics 2D는 서로 물리 연산을 하지 않습니다.
Project settings에는 Layer Collision Matrix가 두 개 존재합니다. Physics와 Physics 2D입니다. 각각은 Layers 설정을 기반으로 레이어 충돌 매트릭스가 설정되어 있습니다. 하지만 Physics에서 수정된 사항은 Physcis 2D 설정에 반영되지 않습니다. 따라서 서로 다른 레이어 충돌 매트릭스입니다.
1.3 레이캐스팅 충돌 (Raycasting Collision)
레이 캐스팅( Raycasting )은 빔을 쏘아, 충돌을 판정합니다. 레이캐스팅은레이 캐스팅은 물리 연산을 사용합니다. 일반적으로 레이 캐스팅은 모든 게임오브젝트에 대하여 충돌을 판단합니다. 하지만 특정 게임오브젝트가 존재하는지를 판단하기 위해서는 비효율적인 방식입니다. 이럴 때 LayerMask를 설정해 특정 레이어와의 충돌을 판정할 수 있습니다. LayerMask는 단일 레이어 뿐만 아니라, 여러 개의 레이어, 심지어 모든 레이어를 선택하여 관리할 수 있습니다.
물론 LayerMask는 특정 레이어들을 무시하도록 설정하는 경우에도 사용 가능합니다.
다음의 코드는 레이어 마스크에 설정된 특정 레이어와의 충돌을 판단하는 간단한 예제입니다.
마우스를 클릭하면, 클릭한 지점에 인터랙터블 레이어에 속한 게임오브젝트가 존재하는지를 판단합니다.
public class RayExample : MonoBehaviour
{
//특정 레이어 지정을 위한 레이어 마스크
public LayerMask interacableLayer;
private Ray ray;
private RaycastHit raycastHit;
void Update()
{
// 마우스 오른쪽 클릭
if (Input.GetMouseButtonDown(1))
{
// 빔을 조사
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 특정 레이어와의 충돌을 체크한다.
if (Physics.Raycast(ray, out raycastHit, 30.0f, interacableLayer))
{
Interacterble interacterble = raycastHit.collider.GetComponent<Interacterble>();
if (interacterble != null)
{
SetFocus(interacterble);
}
}
}
}
void SetFocus(Interactable _interactable)
{
_interactable.SetTarget(_interactable.transform);
}
}
public class Interactable : MonoBehaviour
{
private Transform target;
public void SetTarget(Transform _target)
{
target = _target;
}
}
2. 태그(Tags)
Tags는 오브젝트들을 식별하는 데 사용합니다. Layers가 그룹 관리라면, Tags는 단일 게임오브젝트를 관리합니다. Tags는 Layers보다 더 좁은 범위에서 오브젝트들의 확인합니다. 레이 캐스팅에서 LayerMask를 사용해 게임오브젝트들을 판단하고, 이후에 Tag로 게임오브젝트를 판별하여, 대상을 확인합니다.
여러 게임오브젝트에 동일한 태그를 사용할 수 있습니다.
Tag의 관리는 Tag & Layer에서 합니다.
Tag는 Layer와 달리 많은 수의 Tag를 등록하여, 오브젝트를 구별하는 데 사용할 수 있습니다.
게임오브젝트가 충돌하였을 때, 충돌 대상의 확인은 CompareTag(Tag)를 사용합니다.
public class TagExample : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
if(other.CompareTag(“Player”))
{
// Do something.
}
}
}
3. 정렬 레이어 (Sorting Layer)
정렬 레이어는 게임오브젝트 내에서 렌더링 순서를 정의합니다. 2D 시스템에서 주로 사용합니다. 이는 스프라이트를 정렬하는데 아주 유용합니다. 8개의 스프라이트로 구성된 캐릭터를 만들 때, 8개의 스프라이트를 하나의 정렬 레이어로 설정합니다. 이후 정렬 레이어 안에서 추가적으로 정렬 순서를 정하여, 캐릭터를 구현합니다.
참고
https://docs.unity3d.com/kr/530/Manual/class-TagManager.html
OSI Seven Layer
ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95
'유니티 > 기초' 카테고리의 다른 글
유니티 스카이박스 ( Skybox ) (0) | 2020.11.06 |
---|---|
유니티 카메라 ( Camera ) (0) | 2020.11.05 |
유니티 물리 충돌 ( Physics ) (0) | 2020.11.05 |
유니티 Update 함수 (0) | 2020.11.05 |
유니티 프리팹(Prefab)과 프리팹 인스턴스(Prefab Instance) (1) | 2020.11.02 |