Unity/수업 내용

[Unity 2020.3] UGUI 스테이지 점수 표시

JSH1 2021. 10. 28. 16:46


 

UI 프리팹

using UnityEngine;
using TMPro;

public class StageUI : MonoBehaviour
{
    public TextMeshProUGUI textMesh;
    public GameObject[] star;
}

 

스테이지별 점수

public class StageInfo
{
    public int stage;
    public int score;
}

 

리소스 관리 매니저 스크립트

using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;

public class StageManager 
{
    private static StageManager instance;

    private StageManager() { }

    public static StageManager Instance
    {
        get
        {
            if (instance == null)
                instance = new StageManager();
            return instance;
        }
    }

    Dictionary<int, StageInfo> dicStages = new Dictionary<int, StageInfo>();
    GameObject stageUI;

    public void LoadStageInfo()
    {
        TextAsset scoreInfo = Resources.Load<TextAsset>("Data/score_info");
        dicStages = JsonConvert.DeserializeObject<StageInfo[]>(scoreInfo.text).ToDictionary(x => x.stage);

        stageUI = Resources.Load<GameObject>("Prefabs/stage");
    }

    public Dictionary<int, StageInfo> PassStagesInfo()
    {
        return dicStages;
    }

    public GameObject PassStageUI()
    {
        return stageUI;
    }
}

 

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonManager : MonoBehaviour
{
    public Transform canvas;
    public Button stageLoadBtn;

    void Start()
    {
        stageLoadBtn.onClick.AddListener(() =>
        {
            StageManager.Instance.LoadStageInfo();

            Dictionary<int, StageInfo> dicStages = StageManager.Instance.PassStagesInfo();
            GameObject stageUIPrefab = StageManager.Instance.PassStageUI();

            for (int i = 0; i < dicStages.Count; i++)
            {
                GameObject stageObj = Instantiate(stageUIPrefab);
                stageObj.name = string.Format("stage {0}", i + 1);
                stageObj.transform.parent = canvas;
                
                RectTransform rect = stageObj.GetComponent<RectTransform>();
                rect.anchoredPosition = new Vector3((i * 384) - 780, 0, 0);
                
                StageUI stageUI = stageObj.GetComponent<StageUI>();
                stageUI.textMesh.text = string.Format("stage {0}", i + 1);

                for (int j = 0; j < 3; j++) 
                {
                    if (dicStages[i + 1].score > (j + 1) * 1000)
                    {
                        stageUI.star[j].SetActive(true);
                    }
                }
            }
        });
    }
}