Unity/기능구현

[Unity] 모든 하위 오브젝트의 레이어 변경하기

민트초밥 2022. 4. 19. 15:10

유니티 에디터에서 레이어를 변경하면 아래와 같은 창이 나온다.

첫번째 버튼을 누르면 모든 하위 오브젝트의 레이어가 동시에 변경되고, 두번째 버튼을 누르면 해당 오브젝트의 레이어만 변경된다.

 

 

 

이 기능은 에디터에서 실행되는 기능이기 때문에 게임플레이 도중 실시간으로 적용할 수 없다. 그렇기 때문에 플레이 도중 레이어를 한꺼번에 변경할 수 있게하는 기능을 만들어 봤다.

 

먼저 오브젝트의 레이어를 변경하려면 아래같이 레이어의 인덱스 번호를 대입해주면 된다.

(변경할 레이어(NewLayer)의 인덱스는 8)

private void Start()
{
    gameObject.layer = 8;
}

 

 

또는 레이어의 이름으로 변경하는 방법도 있다.

private void Start()
{
    gameObject.layer = LayerMask.NameToLayer("NewLayer");
}

 

 

 

위와 같이 레이어를 변경한다면 해당 오브젝트의 레이어만 변경된다.

자식 오브젝트의 레이어를 변경하기 위해서는 오브젝트가 가지고 있는 모든 자식오브젝트에 접근하여 레이어를 변경해주어야 한다.

 

자식오브젝트에 접근하기 위한 방법으로는 재귀함수를 사용하면 된다.

private void Start()
{
    int layer = LayerMask.NameToLayer("NewLayer");

    ChangeLayerRecursively(gameObject, layer);
}

private void ChangeLayerRecursively(GameObject obj, int layer)
{
    obj.layer = layer;

    foreach(Transform child in obj.transform)
    {
        ChangeLayerRecursively(child.gameObject, layer);
    }
}

 

 

GetComponentsInChildren<Transform>() 함수를 사용해서 자식오브젝트에 접근을 할 수도 있지만 GetComponentsInChildren은 자식 뿐만아니라 해당 오브젝트까지도 포함되기 때문에 에러가 발생한다.

 

그렇기 때문에 foreach(Transform child in obj.transform) 문장을 통해 자신을 제외한 모든 자식오브젝만 반복할 수 있도록 했다.

 

 

반응형