UI 버튼을 동적 로딩 하는방법 (프리펩으로 생성)

2024. 11. 22. 12:58카테고리 없음

UI 버튼을 동적 로딩하는 방법

동적으로 생성할 UI를 프리펩으로 만들어 둔 다음에 코드를 통해서 동적 로딩하면 된다.

코드

[SerializeField] private GameObject buttonPrefab;
List<GameObject> buttons = new List<GameObject>();

public void GetMaps()
{
    OnDestroy();
    
    TextAsset[] jsonFiles = Resources.LoadAll<TextAsset>("Maps");
    for (int i = 0; i < jsonFiles.Length; i++)
    {
        string json = jsonFiles[i].name;
        GameObject obj = Instantiate(buttonPrefab, transform);
        obj.GetComponentInChildren<TextMeshProUGUI>().text = json;
        obj.GetComponent<UserMapButton>().SetUp(json);
        
        buttons.Add(obj);
    }
}

private void OnDestroy()
{
    for (int i = 0; i < buttons.Count; i++)
    {
        Destroy(buttons[i]);
    }
}

 

코드 설명

buttonPrefab 으로 프리펩을 받아온다.

그 후에 Resources폴더에 저장되어있는 Maps파일들을(JSON으로 파일이 저장되어 있어서 TextAsset타입으로 받아온다.) 전체로드해서 jsonfFiles 변수에 저장한다.

저장된 값만큼 배열을 돌리는데 이떄 변수에 저장된 배열의 이름을 가져와 문자열 타입인 json에 초기화한다. 그 다음에 Instantiate를 통해서 프리펩을 생성해주는데 생성 위치는 현재 스크립트가 달려있는 오브젝트의 위치에 달린다.

프리펩(obj)의 자식에 있는 TextMeshProUGUI가 달려있는 컴퍼넌트를 찾아서 그 텍스트에 값을 json으로 한다.

프리팹(obj)에 붙어있는 UserMapButton 컴포넌트를 가져와 SetUp 메서드를 호출한다.

생성된 버튼들을 관리하기 위해서 List에 Add를 해서 추가해준다.

OnDestory함수 : GetMaps 메서드가 호출되기 전에, 기존에 생성된 모든 버튼을 제거한다.