유니티 레이어 스크립트 - yuniti leieo seukeulibteu

유니티에서 태그와 레이어, 둘 다 게임 오브젝트를 구분하는 데 사용된다. 하지만 레이어는 엔진의 기능적인 부분에 쓰이고 태그는 스크립트에서만 쓰인다는 점을 차이점으로 볼 수 있다. 기능적인 부분이라 하면 렌더링 되어야 할 오브젝트를 구분하거나 충돌, 레이 캐스트를 무시하는 기능들을 말할 수 있다.

Show

    레이어


    레이어는 카메라 컴포넌트에서 컬링 마스크를 설정하기 위한 용도로 사용될 수 있다.

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    컬링 마스크로 여러 레이어를 할당할 수 있고, 카메라는 할당된 레이어를 가진 게임 오브젝트만 렌더 하게 된다. 이런 기능은 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

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    태그


    태그는 어떠한 엔진의 기능적인 부분을 지원하지는 않습니다. 단순히 스크립트에서 편하게 사용할 수 있습니다. 충돌된 오브젝트의 레이어가 다르더라도 태그가 같으면 해당 오브젝트들에게 같은 작업을 수행할 수 있거나, FindGameObjectsWithTag 처럼 특정 태그를 가진 오브젝트를 스크립트에서 찾을 수도 있습니다.

    차이


    레이어는 불필요한 체크, 계산 등을 피할 수 있기 때문에 게임에 필요한 최소한의 연산만 해서 원하는 결과를 얻을 수 있게 해 줍니다. 이는 성능적인 개선을 얻을 수 있기 때문에 레이어 사용은 게임 제작에서 필수적이라고 할 수 있습니다. 태그는 필수적으로 사용해야 하는 것은 아니지만 게임을 만들 때 매우 유용하고 다양하게 사용될 수 있습니다.

    게임오브젝트에 Inspector> component를 살펴 보았다. 

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    이름 왼쪽에 체크 되있는부분이 게임 오브젝트가 활성화 되어있는 부분이다. 

    이부분을 스크립트를 통해서 활성화와 비활성화를 시켜보자.

    1) 비활성화시키기

    -----------------------------------------

    게임오브젝트.활성화시키기(비활성화);

    =>

    gameObject.SetActive(false);

    -----------------------------------------

    Start() 함수에 넣어보자.

    ========================

    public class PlayerMove : MonoBehaviour
    {
        void Start()
        {
            gameObject.SetActive(false);
            Debug.Log("비활성화");
        }

        void Update()
        {

                }
    }

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    플레이 버튼을 누르면 플레이어가 없어지고 Inspector에서 활성화 체크가 꺼진것을 볼 수 있다. 

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    참고로 비활성화가 되면 스크립트도 작동이 안된다.

    2) 활성화시키기

    이번에는 반대로 활성화 시켜보자.

    -----------------------------------------

    게임오브젝트.활성화시키기(활성화);

    =>

    gameObject.SetActive(true);

    -----------------------------------------

    false부분에 true로 넣어주면된다.

    ========================

    public class PlayerMove : MonoBehaviour 
    { 
        void Start() 
        { 
            gameObject.SetActive(true); 
            Debug.Log("활성화"); 
        } 

        void Update() 
        { 
            
        } 
    }

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    플레이버튼을 누르면 아무런 변화가 없다. 활성화가 되있는 상태에서 활성화하라고 하니 변화가 없는 것이다.

    3) 활성화 상태 보기

    gameObject.activeSelf; 

    결과를 true/false로 반환한다. 

    다음과 같이 해보자. 

    -----------------------------------------

    게임오브젝트.활성화자신;

    =>

    gameObject.activeSelf; 

    -----------------------------------------

    ========================

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    결과값으로 True를 반환하는 것을 볼 수 있다. 

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    4) 오브젝트 이름 알아내기

    -----------------------------------------

    게임오브젝트.이름;

    =>

    gameObject.name; 

    -----------------------------------------

    ========================

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    플레이 버튼을 누르고 실행시키면 

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    오브젝트의 이름을 알 수 있다. 

    5) 태그 알아내기

    player-idle의 tag를 Player로 정하고 tag를 이름을 디버그로 찍어보자.

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    -----------------------------------------

    게임오브젝트.태그

    =>

    gameObject.tag

    -----------------------------------------

    ========================

    public class PlayerMove : MonoBehaviour
    {

        void Start()
        {
            Debug.Log(gameObject.tag);
        }

        void Update()
        {

                }
    }

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    6) Layer 알아내기

    레이어를 Water로 지정하고 다음과 같이 스크립팅해보자.

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    --------------------

    게임오브젝트.레이어

    =>

    gameObject.layer

    --------------------

    ========================

    public class PlayerMove : MonoBehaviour 
    { 

        void Start() 
        { 
            Debug.Log(gameObject.layer); 
        } 

        void Update() 
        { 
            
        } 
    }

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu
    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    gameObject.layer를 찍어보면 4라고 숫자가 나오는데 이는 레이어에 인덱스 번호 이다.

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    * 레이어 이름 가져오기

    그렇다면, Water를 가져올 수는 없을까?

    방법이 있다. 레이어 번호를 이름으로 바꿔주 함수!

    ------------------------

    레이어마스크.레이어를이름으로(레이어번호)

    =>

    LayerMask.LayerToName(레이어번호)

    ------------------------

    레이어 번호 대신에 gameObject.layer를 넣어주면 현재 레이어 이름을 알 수 있다.

    ========================

    public class PlayerMove : MonoBehaviour
    {

        void Start()
        {

            Debug.Log(LayerMask.LayerToName(gameObject.layer));
        }

        void Update()
        {

                }
    }

    ========================

    유니티 레이어 스크립트 - yuniti leieo seukeulibteu
    유니티 레이어 스크립트 - yuniti leieo seukeulibteu

    이제까지 gameObject의 속성에 대해서 살펴 봤다. 

    게임을 스크립팅하면서 중요하게 사용될 내용들이니, 복사 붙여넣기를 잘 활용해서 유용하게 사용해보자

    다음 챕터에서는 Transform 속성요소를 살펴 보겠다.!!

    gameObject 클래스 참조 : 

    https://docs.unity3d.com/kr/530/ScriptReference/Object.html