유니티 심화

LearnUGUI - Test06 [ Mission ] - 미션 Cell 데이터 연동하기

다모아 2023. 9. 8. 16:54

UIMissionCell
시작 전
시작 후 [프리팹 인스턴스]

 


MissionData

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

public class MissionData
{
    public int id;
    public string name;
    public string desc;
    public int goal;
    public string icon_name;
    public int mission_icon_width;
    public int mission_icon_height;
    public int reward_amount;
    public string reward_icon_name;
    public int reward_icon_width;
    public int reward_icon_height;
}

 

Test06AtlasManager

using System.Collections;
using System.Collections.Generic;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.U2D;

public class Test06AtlasManager : MonoBehaviour
{
    public static Test06AtlasManager instance;

    [SerializeField]
    private string[] arrAtlasNames;

    private Dictionary<string, SpriteAtlas> dicAtlas = new Dictionary<string, SpriteAtlas>();
    private void Awake()
    {
        if(instance != null && instance != this)
        {
            Destroy(this.gameObject);
        }    
        else
        {
            instance = this;
        }

        DontDestroyOnLoad(this.gameObject);
    }

    public void LoadAtlasData()
    {
        foreach (string atlasName in arrAtlasNames)
        {
            SpriteAtlas asset = Resources.Load<SpriteAtlas>(atlasName);
            this.dicAtlas.Add(atlasName, asset);
        }
        Debug.LogFormat("{0}개의 Atlas를 로드했습니다.", this.dicAtlas.Count);
    }

    public SpriteAtlas GetAtlas(string atlasName)
    {
        return this.dicAtlas[atlasName];
    }
}

 

Test06DataManager

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

public class Test06DataManager
{
    public static readonly Test06DataManager instance = new Test06DataManager();

    private Dictionary<int, MissionData> dicMissionDatas = new Dictionary<int, MissionData>();

    public void LoadMissionData()
    {
        TextAsset asset = Resources.Load<TextAsset>("mission_data");
        string json = asset.text;
        MissionData[] missionDatas = JsonConvert.DeserializeObject<MissionData[]>(json);
        this.dicMissionDatas = missionDatas.ToDictionary(x => x.id);
        Debug.LogFormat("{0}개의 MissionData로드 완료", this.dicMissionDatas.Count);
    }

    public List<MissionData> GetMissionData()
    {
        return this.dicMissionDatas.Values.ToList();
    }
}

 

Test06UIMissionCell

using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;
public class Test06UIMissionCell : MonoBehaviour
{
    private enum eCellType
    {
        Doing, Done, Complete
    }

    //mission_icon
    [SerializeField]
    private Image missionIcon;
    //txtMissionName
    [SerializeField]
    private TMP_Text txtMissionName;
    //txtMissionDesc
    [SerializeField]
    private TMP_Text txtMissionDesc;
    //complete_reward_icon
    [SerializeField]
    private Image completeRewardIcon;
    //doing_reward_icon
    [SerializeField]
    private Image doingRewardIcon;
    //doing_txtAmount
    [SerializeField]
    private TMP_Text doingTxtAmount;
    //complete_txtAmount
    [SerializeField]
    private TMP_Text completeTxtAmount;
    //Slider
    public Slider slider;
    //desc
    public string desc;
    private int id;
    public void Init(MissionData data)
    {
        this.LoadData(data);
    }

    private void LoadData(MissionData data)
    {
        this.id = data.id;
        //MissionName
        this.txtMissionName.text = data.name;
        //Collect {0} Golds란 말이지 Debug.LogFormat("Collect {0} Golds", data.goal); 을 하면 되는데
        //Collect {0} Golds가 data.desc임
        this.desc = string.Format(data.desc, data.goal);
        //MissionDesc
        this.txtMissionDesc.text = this.desc;
        //doing_txtAmount
        this.doingTxtAmount.text = data.reward_amount.ToString();
        //complete_txtAmount
        this.completeTxtAmount.text = data.reward_amount.ToString();
        //SpriteAtlas 할당해주기
        SpriteAtlas atlas = Test06AtlasManager.instance.GetAtlas("Test06UIAtlas");
        //mission_icon
        this.missionIcon.sprite = atlas.GetSprite(data.icon_name);
        this.missionIcon.SetNativeSize();
        this.missionIcon.rectTransform.sizeDelta = new Vector2(data.mission_icon_width, data.mission_icon_height);
        //doing_reward_icon
        this.doingRewardIcon.sprite = atlas.GetSprite(data.reward_icon_name);
        this.doingRewardIcon.SetNativeSize();
        this.doingRewardIcon.rectTransform.sizeDelta = new Vector2(data.reward_icon_width, data.reward_icon_height);
        //complete_reward_icon
        this.completeRewardIcon.sprite = atlas.GetSprite(data.reward_icon_name);
        this.completeRewardIcon.SetNativeSize();
        this.completeRewardIcon.rectTransform.sizeDelta = new Vector2(data.reward_icon_width, data.reward_icon_height);
    }
}

 

Test06UIMissionScrollView

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class Test06UIMissionScrollView : MonoBehaviour
{
    [SerializeField]
    private GameObject uiMissionCellPrefab;
    //위치지정
    [SerializeField]
    private Transform contentTr;

    private List<Test06UIMissionCell> cellList = new List<Test06UIMissionCell>();

    public void Init()
    {
        //데이터 받아와서
        List<MissionData> missionDatas = Test06DataManager.instance.GetMissionData();
        //foreach 돌리면서 프리팹 만들기
        foreach (MissionData missionData in missionDatas)
        {
            //null 값의 Test06UIMissionCell 만들어줘서 넣어주자고
            Test06UIMissionCell cell = null;
            //프리팹 만들자
            GameObject go = Instantiate<GameObject>(this.uiMissionCellPrefab, this.contentTr);
            //cell에다가 컴포넌트 넣어주기
            cell = go.GetComponent<Test06UIMissionCell>();
            //Init
            cell.Init(missionData);
            this.cellList.Add(cell);

            Debug.LogFormat("data.icon_name : {0}", missionData.icon_name);
            Debug.LogFormat("{0}, {1}, {2}%", missionData.id, missionData.name, cell.slider.value);
            Debug.LogFormat("{0}", cell.desc);
        }
    }
}

 

Test06UIMain

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

public class Test06UIMain : MonoBehaviour
{
    [SerializeField]
    private Test06UIMissionScrollView uiMissionScrollView;
    private void Start()
    {
        Test06AtlasManager.instance.LoadAtlasData();
        Test06DataManager.instance.LoadMissionData();

        this.uiMissionScrollView.Init();
    }
}