유니티에서 태그와 레이어, 둘 다 게임 오브젝트를 구분하는 데 사용된다. 하지만 레이어는 엔진의 기능적인 부분에 쓰이고 태그는 스크립트에서만 쓰인다는 점을 차이점으로 볼 수 있다. 기능적인 부분이라 하면 렌더링 되어야 할 오브젝트를 구분하거나 충돌, 레이 캐스트를 무시하는 기능들을 말할 수 있다.
레이어
레이어는 카메라 컴포넌트에서 컬링 마스크를 설정하기 위한 용도로 사용될 수 있다.
컬링 마스크로 여러 레이어를 할당할 수 있고, 카메라는 할당된 레이어를 가진 게임 오브젝트만 렌더 하게 된다. 이런 기능은 3D UI, 미니맵 기능 등에 사용될 수 있다. 또한 라이팅에서도 빛의 영향을 받을 오브젝트와 받지 않을 오브젝트를 구분하는 데 사용되어, 성능적인 면이나 비주얼적인 면에서도 레이어는 유용하게 사용될 수 있습니다. 또한 불필요한 충돌 체크를 피하는데도 사용할 수 있습니다. 레이어-베이스 충돌 감지와 관련된 자세한 내용은 아래의 링크에서 확인 가능합니다.
Unity - Manual: Layer-based collision detection
Layer-based collision detection Layer-based collision detectionAn automatic process performed by Unity which determines whether a moving GameObject with a Rigidbody and collider component has come into contact with any other colliders. More infoSee in Glos
docs.unity3d.com
태그
태그는 어떠한 엔진의 기능적인 부분을 지원하지는 않습니다. 단순히 스크립트에서 편하게 사용할 수 있습니다. 충돌된 오브젝트의 레이어가 다르더라도 태그가 같으면 해당 오브젝트들에게 같은 작업을 수행할 수 있거나, FindGameObjectsWithTag 처럼 특정 태그를 가진 오브젝트를 스크립트에서 찾을 수도 있습니다.
차이
레이어는 불필요한 체크, 계산 등을 피할 수 있기 때문에 게임에 필요한 최소한의 연산만 해서 원하는 결과를 얻을 수 있게 해 줍니다. 이는 성능적인 개선을 얻을 수 있기 때문에 레이어 사용은 게임 제작에서 필수적이라고 할 수 있습니다. 태그는 필수적으로 사용해야 하는 것은 아니지만 게임을 만들 때 매우 유용하고 다양하게 사용될 수 있습니다.
게임오브젝트에 Inspector> component를 살펴 보았다.
이름 왼쪽에 체크 되있는부분이 게임 오브젝트가 활성화 되어있는 부분이다.
이부분을 스크립트를 통해서 활성화와 비활성화를 시켜보자.
1) 비활성화시키기
-----------------------------------------
게임오브젝트.활성화시키기(비활성화);
=>
gameObject.SetActive(false);
-----------------------------------------
Start() 함수에 넣어보자.
========================
public class PlayerMove : MonoBehaviour
{
void Start()
{
gameObject.SetActive(false);
Debug.Log("비활성화");
}
void Update()
{
}
}
========================
플레이 버튼을 누르면 플레이어가 없어지고 Inspector에서 활성화 체크가 꺼진것을 볼 수 있다.
참고로 비활성화가 되면 스크립트도 작동이 안된다.
2) 활성화시키기
이번에는 반대로 활성화 시켜보자.
-----------------------------------------
게임오브젝트.활성화시키기(활성화);
=>
gameObject.SetActive(true);
-----------------------------------------
false부분에 true로 넣어주면된다.
========================
public class PlayerMove : MonoBehaviour
{
void Start()
{
gameObject.SetActive(true);
Debug.Log("활성화");
}
void Update()
{
}
}
========================
플레이버튼을 누르면 아무런 변화가 없다. 활성화가 되있는 상태에서 활성화하라고 하니 변화가 없는 것이다.
3) 활성화 상태 보기
gameObject.activeSelf;
결과를 true/false로 반환한다.
다음과 같이 해보자.
-----------------------------------------
게임오브젝트.활성화자신;
=>
gameObject.activeSelf;
-----------------------------------------
========================
========================
결과값으로 True를 반환하는 것을 볼 수 있다.
4) 오브젝트 이름 알아내기
-----------------------------------------
게임오브젝트.이름;
=>
gameObject.name;
-----------------------------------------
========================
========================
플레이 버튼을 누르고 실행시키면
오브젝트의 이름을 알 수 있다.
5) 태그 알아내기
player-idle의 tag를 Player로 정하고 tag를 이름을 디버그로 찍어보자.
-----------------------------------------
게임오브젝트.태그
=>
gameObject.tag
-----------------------------------------
========================
public class PlayerMove : MonoBehaviour
{
void Start()
{
Debug.Log(gameObject.tag);
}
void Update()
{
}
}
========================
6) Layer 알아내기
레이어를 Water로 지정하고 다음과 같이 스크립팅해보자.
--------------------
게임오브젝트.레이어
=>
gameObject.layer
--------------------
========================
public class PlayerMove : MonoBehaviour
{
void Start()
{
Debug.Log(gameObject.layer);
}
void Update()
{
}
}
========================
gameObject.layer를 찍어보면 4라고 숫자가 나오는데 이는 레이어에 인덱스 번호 이다.
* 레이어 이름 가져오기
그렇다면, Water를 가져올 수는 없을까?
방법이 있다. 레이어 번호를 이름으로 바꿔주 함수!
------------------------
레이어마스크.레이어를이름으로(레이어번호)
=>
LayerMask.LayerToName(레이어번호)
------------------------
레이어 번호 대신에 gameObject.layer를 넣어주면 현재 레이어 이름을 알 수 있다.
========================
public class PlayerMove : MonoBehaviour
{
void Start()
{
Debug.Log(LayerMask.LayerToName(gameObject.layer));
}
void Update()
{
}
}
========================
이제까지 gameObject의 속성에 대해서 살펴 봤다.
게임을 스크립팅하면서 중요하게 사용될 내용들이니, 복사 붙여넣기를 잘 활용해서 유용하게 사용해보자
다음 챕터에서는 Transform 속성요소를 살펴 보겠다.!!
gameObject 클래스 참조 :
//docs.unity3d.com/kr/530/ScriptReference/Object.html