내가 만드는 프로젝트는 마우스의 움직임으로 플레이어의 시야를 움직이는데
팝업창이 떴을 때는 마우스를 고정시키고 싶었다.
내가 생각한 기능 코드는 아래와 같았다.
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
아무튼... 간결하게.. 자식 오브젝트 '팝업창'들을 받을 수 있어서 다행이다...
하마터면 일일이 지정할 뻔 ㅎㅅㅎ
댓글