유니티에서 태그와 레이어, 둘 다 게임 오브젝트를 구분하는 데 사용된다. 하지만 레이어는 엔진의 기능적인 부분에 쓰이고 태그는 스크립트에서만 쓰인다는 점을 차이점으로 볼 수 있다. 기능적인 부분이라 하면 렌더링 되어야 할 오브젝트를 구분하거나 충돌, 레이 캐스트를 무시하는 기능들을 말할 수 있다. Show 레이어레이어는 카메라 컴포넌트에서 컬링 마스크를 설정하기 위한 용도로 사용될 수 있다. 컬링 마스크로 여러 레이어를 할당할 수 있고, 카메라는 할당된 레이어를 가진 게임 오브젝트만 렌더 하게 된다. 이런 기능은 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 Update() } ======================== 플레이 버튼을 누르면 플레이어가 없어지고 Inspector에서 활성화 체크가 꺼진것을 볼 수 있다. 참고로 비활성화가 되면 스크립트도 작동이 안된다. 2) 활성화시키기 이번에는 반대로 활성화 시켜보자. ----------------------------------------- 게임오브젝트.활성화시키기(활성화); => gameObject.SetActive(true); ----------------------------------------- false부분에 true로 넣어주면된다. ======================== public class PlayerMove : MonoBehaviour 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() void Update() } ======================== 6) Layer 알아내기 레이어를 Water로 지정하고 다음과 같이 스크립팅해보자. -------------------- 게임오브젝트.레이어 => gameObject.layer -------------------- ======================== public class PlayerMove : MonoBehaviour void Start() 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 클래스 참조 : https://docs.unity3d.com/kr/530/ScriptReference/Object.html |