(StagePanelUI.cs)
TextMeshPro, Button에 접근하기 위해 아래 코드로 import한다.
using TMPro;
using UnityEngine.UI;
using System;
Text 참조는 아래 코드로 수행한다.
[SerializeField] private TextMeshProUGUI stageIndex;
[SerializeField] private TextMeshProUGUI stageName;
[SerializeField] private Button startButton;
public void Init(string index, string stageName, Action startBtnAction)
{
stageIndex.text = index;
this.stageName.text = stageName;
startButton.onClick.AddListener(() =>
{
startBtnAction.Invoke();
});
}
(startButton init은 lamda함수를 이용해 입력받은 Action을 수행한다.)
(TitleUI.cs)
이제 이렇게 만든 Panel Init 클래스를 titleUI 코드에서 일괄 호출한다.
[SerializeField] private GameObject stagePanelPrefab;
[SerializeField] private Transform contents;
[SerializeField] private List<StagePanelUI> stagePanels = new();
다중의 StagePanelUI 객체를 저장할 List를 만든다.
이때, Stage 자료를 저장하기 위한 ScriptableObject 코드를 만든다.
using System;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "StageData", menuName = "Scriptable Objects/StageData")]
public class StageData : ScriptableObject
{
public List<_StageData> stageDataList = new List<_StageData>();
}
[Serializable]
public class _StageData
{
public string StageIndex;
public string StageName;
public string SceneName;
}
이때 하나하나의 원소로 담을 클래스는 pure C#으로, 인스펙터에서 편집하려면 [Serializable] 속성을 달아야 한다.

추가로 에셋 폴더에 Scriptable Object를 추가한다.
(TitleUI.cs)
이제 title화면의 요소들을 초기화할 수 있도록 init메소드를 만든다.
void Start()
{
Init();
}
private void Init()
{
foreach (var data in stageData.stageDataList)
{
GameObject stagePanel = Instantiate(stagePanelPrefab, contents);
stagePanel.transform.SetParent(contents);
stagePanels.Add(stagePanel.GetComponent<StagePanelUI>());
stagePanel.GetComponent<StagePanelUI>().Init(data.StageIndex, data.StageName, () => { SceneManager.LoadScene(data.SceneName);});
}
}
'유니티' 카테고리의 다른 글
| [유니티] 저장 (0) | 2026.05.13 |
|---|---|
| [유니티] UI 팝업 구현 (0) | 2026.05.13 |
| [유니티] Canvas and UI (0) | 2026.05.13 |
| [유니티] Audio Source (0) | 2026.05.12 |
| [유니티] Prefabs (0) | 2026.05.12 |