
내가 원하는 기능 :
예를 들어 A라는 게임 오브젝트 아래에는 B, C, D 게임오브젝트가 있다고 하자. B 게임오브젝트 아래에는 E,F,G,H,I 자식 게임 오브젝트가 있다. 나는 A의 자식 오브젝트 중 C,D를 먼저 화면에 불러오고, 0.5초 후에 E,F,G,H,I 을 포함한 B 자식 오브젝트를 화면에 불러오고 싶다. 그 기능을 구현함.
Invoke 함수를 이용했습니다. Invoke 함수는 몇 초 후에 특정한 함수를 실행시킬 수 있다.
B도 자식 오브젝트들이 있기 때문에, 재귀함수를 이용해서 순회해야함. 자식 오브젝트들을 싹 다 true로 돌려야한다. foreach를 이용함.
Transform이 유니티에서 위치 관련인 줄 알았는데, 알고보니 부모, 자식랑도 연관되어 있었다. 뜨헉.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreLoading : MonoBehaviour
{
public GameObject Popup_BestScore;
private GameObject TXT_RecordList;
public void OnClickRecord()
{
TXT_RecordList = Popup_BestScore.transform.Find("TXT_RecordList").gameObject;
// 먼저 TXT_RecordList를 비활성화
TXT_RecordList.SetActive(false);
// Popup_BestScore 팝업창을 활성화
Popup_BestScore.SetActive(true);
// 1초 후에 ActivateRecordList 메서드 호출
Invoke("ActivateRecordList", 0.5f);
}
private void ActivateRecordList()
{
// 특정 게임 오브젝트를 활성화
SetActiveRecursively(TXT_RecordList, true);
}
private void SetActiveRecursively(GameObject obj, bool state)
{
obj.SetActive(state);
foreach (Transform child in obj.transform)
{
SetActiveRecursively(child.gameObject, state);
}
}
}Transform, foreach, SetActiveRecursively 메서드의 작동 방식에 대해 자세히 설명드리겠습니다.
Transform의 의미Transform은 Unity에서 게임 오브젝트의 위치, 회전, 크기와 같은 변환 정보를 다루는 컴포넌트입니다. 각 게임 오브젝트는 Transform 컴포넌트를 가지고 있으며, 이를 통해 오브젝트의 위치를 이동시키거나 회전시키거나 크기를 조절할 수 있습니다.
Transform 속성:position: 오브젝트의 위치를 나타냅니다.rotation: 오브젝트의 회전을 나타냅니다.localScale: 오브젝트의 크기를 나타냅니다.parent: 오브젝트의 부모를 나타냅니다.children: 오브젝트의 자식들을 나타냅니다.게임 오브젝트는 Transform을 통해 계층 구조를 구성하며, 각 오브젝트는 자식 오브젝트를 가질 수 있습니다. 이 계층 구조는 Transform의 child 속성으로 접근할 수 있습니다.
foreach 문foreach 문은 컬렉션(예: 배열, 리스트)의 각 요소를 반복적으로 처리할 때 사용됩니다. foreach는 컬렉션 내의 모든 요소를 순차적으로 접근하여 작업을 수행할 수 있도록 합니다.
문법 예시:
foreach (타입 변수명 in 컬렉션)
{
// 각 요소에 대해 수행할 작업
}
사용 예시:
foreach (Transform child in obj.transform)
{
// obj의 자식 Transform인 child를 반복적으로 처리
}
Transform child in obj.transform: obj의 자식 오브젝트들을 순회하여 각 자식을 child라는 변수로 참조합니다.child 오브젝트에 대해 지정된 작업을 수행합니다. 이 경우, SetActiveRecursively 메서드를 재귀적으로 호출하여 자식 오브젝트들을 활성화합니다.SetActiveRecursively 메서드목표: 주어진 오브젝트와 그 모든 자식 오브젝트들을 활성화 또는 비활성화하는 메서드입니다.
코드:
private void SetActiveRecursively(GameObject obj, bool state)
{
obj.SetActive(state); // 현재 오브젝트를 활성화 또는 비활성화
foreach (Transform child in obj.transform) // 모든 자식 오브젝트를 반복
{
SetActiveRecursively(child.gameObject, state); // 자식 오브젝트에 대해 재귀 호출
}
}
obj.SetActive(state): 현재 오브젝트의 활성화 상태를 state에 따라 설정합니다.foreach (Transform child in obj.transform): 현재 오브젝트의 모든 자식 Transform을 반복적으로 처리합니다.SetActiveRecursively(child.gameObject, state): 각 자식 오브젝트에 대해 SetActiveRecursively 메서드를 재귀적으로 호출하여 자식 오브젝트를 활성화/비활성화합니다.재귀 함수는 종료 조건이 있어야만 작동을 멈추고 호출 스택에서 빠져나옵니다. SetActiveRecursively 메서드의 경우:
SetActiveRecursively가 호출되므로, obj.transform에 더 이상 자식이 없을 때 종료됩니다.foreach (Transform child in obj.transform)에서 자식 오브젝트가 없으면 반복이 종료됩니다. 이때 더 이상 호출할 자식이 없으므로 재귀 호출도 종료됩니다.SetActiveRecursively 메서드가 호출되면:state에 따라 활성화 또는 비활성화합니다.SetActiveRecursively를 재귀적으로 호출하여 자식들도 같은 방식으로 활성화 또는 비활성화합니다.이렇게 해서, SetActiveRecursively는 주어진 오브젝트와 그 모든 하위 오브젝트를 활성화하거나 비활성화합니다.