본문 바로가기
Coding/Unity

[Unity] 비활성화 상태의 자식 오브젝트 찾기 / transform.GetChild()

by kelina_ 2022. 4. 19.

내가 만드는 프로젝트는 마우스의 움직임으로 플레이어의 시야를 움직이는데

팝업창이 떴을 때는 마우스를 고정시키고 싶었다.

 

내가 생각한 기능 코드는 아래와 같았다.

if '팝업창'이 켜져있지 않다면{
	마우스 동작
}

여기서 문제는, '팝업창'이 한 두개가 아니라는 거(....)

 

코드를 간결하게 하고 싶어서 이 '팝업창'을 모은 배열을 만들려고 했다.

평소라면 FindGameObjectWithTag()를 사용했을 텐데..... 또 다른 문제는 바로 이 '팝업창'들이 원래 비활성화 상태라는데 일어났다.

따라서 해결해야 할 문제는 다음과 같이 변했다.

 

1. 비활성화 상태인 오브젝트 찾기

2. 찾은 오브젝트로 배열 만들기

* '팝업창' 오브젝트들은 ui 부모 오브젝트의 자식들이다.

 

아래는 내가 시도한 방법들이다...

 

1. GetComponentsInChildren

GameObject ui = UIManager.Instance.canvasPopup;  //부모 오브젝트
Transform[] allchildren = ui.GetComponentsInChildren<Transform>(true);

부모 오브젝트의 Transform 컴포넌트가 있는 자식들을 모두 가져오는 코드이다.

비활성화된 오브젝트도 찾을 수 있게 하기 위해 끝에

ui.GetComponentsInChildren<Transform>(true) => true를 붙여주었다.

 

근데 사실 시도하면서도 불안했음 ㅎㅅㅎ

GetObject가 아니라 Component라는 거랑, Transform이라는게...

 

나는 게임 오브젝트를 받고 싶은건데 컴포넌트랑 트렌스폼이라면 하위 컴포넌트까지 (버튼, 패널, 텍스트 등등..) 받아올 것 같아서 말이다.

 

아니나 다를까,

디버그 결과

테스트로 일단 자식 오브젝트에 '팝업창' 2개만 넣은건데 벌써 배열이 [26]ㅋㅋㅋㅋ

온갖게 다 들어있다....

단순히 정말 빈 오브젝트라면 Transform 컴포넌트 하나만 가지고 있을테니 이것도 먹힐 것 같다....ㅎ

나는 아니라서 이건 패스~

 

2. transform.Find()

결과부터 말하자면, 이것도 비활성화된 오브젝트를 찾는데 성공했다.

하지만 내가 원하는 완벽한(?) 상황에는 부합하지 않았다.

if (canvasPopup.transform.Find("popup") != null)
	Debug.Log("비활성화된 하위 transform 찾음");

조건은,

- 부모 오브젝트는 활성화 상태여야함

- 자식 오브젝트는 비활성화 상태여도 괜찮음

 

노파심에 말하지만 코드가 transform이기 때문에 Find가 가능한 것 같다.

Gameobject.Find() 안 통한다.

앞서 말했지만 FindGameObjectWithTag()도 안 통한다.

 

아무튼, 찾긴 찾았지만 나는 코드를 간결하게 만드는게 목표였기 때문에

열댓개의 팝업창 모두 일일이 Find() 하는 건 목표에 맞지 않는다고 생각했다.

그럴거면 그냥 일일이 배열 초기화 때 집어넣었지

 

그리고 보통 Find는 함수가 실행될 때마다 모든 오브젝트를 훑어서 해당하는 걸 찾는건데,

내가 만드는 건 마우스 기능에 포함되기 때문에 게임이 동작하는 매 순간 실행된다.

그럼 Find가 매 프레임마다 호출되는데... 성능적인 면에서 좋지 않을 것 같았다.

 

3. transform.GetChild()

이걸로 성공했다.

transform.GetChild(int index)

해당 게임 오브젝트의 자식 오브젝트 중 원하는 자식 순서(?)를 index에 넣어주면 된다.

GameObject popup = ui.transform.GetChild(0).gameObject;
//ui의 첫번째 자식 오브젝트를 popup에 지정

GameObject로 받기 위해서는 뒤에 .gameObject를 붙여 변환해주어야 한다.

 

나는 이걸 GameObject 배열로 몽땅 받았는데 그건 다음 글 참고!~

https://kim-lululala.tistory.com/5?category=1020013 

 

아무튼... 간결하게.. 자식 오브젝트 '팝업창'들을 받을 수 있어서 다행이다...

하마터면 일일이 지정할 뻔 ㅎㅅㅎ

댓글