유니티 에디터에서 레이어를 변경하면 아래와 같은 창이 나온다.
첫번째 버튼을 누르면 모든 하위 오브젝트의 레이어가 동시에 변경되고, 두번째 버튼을 누르면 해당 오브젝트의 레이어만 변경된다.
이 기능은 에디터에서 실행되는 기능이기 때문에 게임플레이 도중 실시간으로 적용할 수 없다. 그렇기 때문에 플레이 도중 레이어를 한꺼번에 변경할 수 있게하는 기능을 만들어 봤다.
먼저 오브젝트의 레이어를 변경하려면 아래같이 레이어의 인덱스 번호를 대입해주면 된다.
(변경할 레이어(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) 문장을 통해 자신을 제외한 모든 자식오브젝만 반복할 수 있도록 했다.
반응형
'Unity > 기능구현' 카테고리의 다른 글
[Unity] Prefab의 Missing Script 자동으로 삭제하기 (0) | 2024.07.19 |
---|---|
[Unity] Table CSV 파일을 ScriptableObject로 변환해보자 (0) | 2024.04.30 |
[Unity] 게이지바 구현하기 (0) | 2024.02.25 |
[Unity] Debug Log를 Text 파일의 형태로 저장하기 (0) | 2022.04.19 |
[Unity] Debug Log 출력문에 색상 변경하기 (0) | 2022.04.19 |