유니티 2D 1초 뒤 하위 오브젝트를 활성화하기 (재귀함수 이용)

농담고미고미·2024년 7월 25일

Unity 개발 일지

목록 보기
16/26

내가 원하는 기능 :
예를 들어 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이 유니티에서 위치 관련인 줄 알았는데, 알고보니 부모, 자식랑도 연관되어 있었다. 뜨헉.

  • ScoreLoading.cs
    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)에서 자식 오브젝트가 없으면 반복이 종료됩니다. 이때 더 이상 호출할 자식이 없으므로 재귀 호출도 종료됩니다.

전체 흐름

  1. SetActiveRecursively 메서드가 호출되면:
    • 현재 오브젝트를 state에 따라 활성화 또는 비활성화합니다.
    • 모든 자식 오브젝트에 대해 SetActiveRecursively를 재귀적으로 호출하여 자식들도 같은 방식으로 활성화 또는 비활성화합니다.
  2. 재귀 호출: 각 자식 오브젝트에 대해 동일한 작업을 반복하며, 자식 오브젝트가 더 이상 없을 때 호출이 종료됩니다.

이렇게 해서, SetActiveRecursively는 주어진 오브젝트와 그 모든 하위 오브젝트를 활성화하거나 비활성화합니다.

profile
농담곰을 좋아해요 말랑곰탱이

0개의 댓글