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 메서드가 호출되기 전에, 기존에 생성된 모든 버튼을 제거한다.