K-digital traning/유니티 심화

[주말과제]UGUI+데이터연동(2)

내꺼블로그 2023. 9. 11. 00:52

앞서 gold에 관해서 해보았고 이번에는 gem을 해보도록 하자

 

 

앞서 해놓았던 부분에서 약간만 수정하면 된다.

 

 

 

 

1.데이터 연동

(1)gem_data 엑셀 파일을 만든다.

 

(2)엑셀 파일을 기반으로 json 파일을 만든다.

 

(3)Resources 폴더에 넣는다.

 

 

 

2.Atlas 생성

 

 

 

 

 

3.코드

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

public class GemData
{
    public int id;
    public string name;
    public int type;
    public int value;
    public float price;
    public string icon_name;
    public float pos_x;
    public float pos_y;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using Newtonsoft.Json;
using System.Linq;

public class DataManager
{
    public static readonly DataManager Instance = new DataManager();
    private Dictionary<int, GoldData> dicGoldDatas;
    private Dictionary<int, GemData> dicGemDatas;
    public Dictionary<int, GoldData> DicGoldDatas { get { return dicGoldDatas; } }
    public Dictionary<int, GemData> DicGemDatas { get { return dicGemDatas; } }
    private DataManager() { }

    public void LoadData()
    {
        TextAsset textGoldData = Resources.Load<TextAsset>("data/gold_data");
        GoldData[] goldDatas = JsonConvert.DeserializeObject<GoldData[]>(textGoldData.text);
        this.dicGoldDatas = goldDatas.ToDictionary(x => x.id);

        TextAsset textGemData = Resources.Load<TextAsset>("data/gem_data");
        GemData[] gemDatas = JsonConvert.DeserializeObject<GemData[]>(textGemData.text);
        this.dicGemDatas=gemDatas.ToDictionary(x => x.id);
    }

    public GoldData GetGoldData(int id)
    {
        return this.dicGoldDatas[id];
    }

    public GemData GetGemData(int id)
    {
        return this.dicGemDatas[id];
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;

public class AtlasManager
{
    public static readonly AtlasManager Instance = new AtlasManager();
    private SpriteAtlas goldIconAtlas;
    private SpriteAtlas gemIconAtlas;

    private AtlasManager()
    {
        
    }

    public void LoadAtlas()
    {
        this.goldIconAtlas = Resources.Load<SpriteAtlas>("atlas/GoldAtlas");
        this.gemIconAtlas = Resources.Load<SpriteAtlas>("atlas/GemAtlas");
    }

    public Sprite GetGoldIconSprite(string icon_name)
    {
        return this.goldIconAtlas.GetSprite(icon_name);
    }

    public Sprite GetGemIconSprite(string icon_name)
    {
        return this.gemIconAtlas.GetSprite(icon_name);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIMain : MonoBehaviour
{
    [SerializeField]
    private UIPageShop uiPageShop;

    // Start is called before the first frame update
    void Start()
    {
        DataManager.Instance.LoadData();
        AtlasManager.Instance.LoadAtlas();
        this.uiPageShop.Init();
        this.uiPageShop.onClickPrice = (id) =>
        {
            GemData data = DataManager.Instance.GetGemData(id);
            Debug.LogFormat("<color=blue>{0} : {1}</color>", (UIGemCell.eAmountType)data.type, data.price);
        };
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIPageShop : MonoBehaviour
{
    [SerializeField]
    private UIScrollview uiScrollview;

    public System.Action<int> onClickPrice;
    public void Init()
    {
        uiScrollview.Init();
        uiScrollview.onClickPrice = (id) =>
        {
            GemData data = DataManager.Instance.GetGemData(id);
            Debug.LogFormat("<color=yellow>{0} : {1}</color>", (UIGemCell.eAmountType)data.type, data.price);
            this.onClickPrice(data.id);
        };
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;

public class UIScrollview : MonoBehaviour
{
    [SerializeField]
    private GameObject uiGoldCellPrefab;

    [SerializeField]
    private Transform parent;

    private List<UIGemCell> arrUIGoldCell = new List<UIGemCell>();

    public System.Action<int> onClickPrice;
    public void Init()
    {
        //foreach(GoldData goldData in DataManager.Instance.DicGoldDatas.Values)
        //{
        //    GoldData data = goldData;
        //    GameObject uiGoldCellGo = Instantiate(uiGoldCellPrefab, parent);
        //    UIGoldCell uiGoldCell = uiGoldCellGo.GetComponent<UIGoldCell>();
        //    uiGoldCell.Init(data.id);
        //    arrUIGoldCell.Add(uiGoldCell);
        //    uiGoldCell.btnPrice.onClick.AddListener(() =>
        //    {
        //        Debug.LogFormat("{0} : {1}", (UIGoldCell.eGoldType)data.type, data.price);
        //        this.onClickPrice(data.id);
        //    });
        //}

        foreach (GemData gemData in DataManager.Instance.DicGemDatas.Values)
        {
            GemData data = gemData;
            GameObject uiGoldCellGo = Instantiate(uiGoldCellPrefab, parent);
            UIGemCell uiGemCell = uiGoldCellGo.GetComponent<UIGemCell>();
            uiGemCell.Init(data.id);
            arrUIGoldCell.Add(uiGemCell);
            uiGemCell.btnPrice.onClick.AddListener(() =>
            {
                Debug.LogFormat("{0} : {1}", (UIGemCell.eAmountType)data.type, data.price);
                this.onClickPrice(data.id);
            });
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class UIGemCell : MonoBehaviour
{
    public enum eAmountType
    {
        Tiny, Fistful, Pouch, Box, Chest, Vault
    }
    [SerializeField]
    private Image icon;
    [SerializeField]
    private TMP_Text txtName;
    [SerializeField]
    private TMP_Text txtValue;
    [SerializeField]
    private TMP_Text txtPrice;
    public Button btnPrice;

    private eAmountType type;
    private int id;
    public void Init(int id)
    {
        //this.id = id;
        //GoldData data = DataManager.Instance.GetGoldData(this.id);
        //this.icon.sprite = AtlasManager.Instance.GetGoldIconSprite(data.icon_name);
        //this.icon.SetNativeSize();
        //this.icon.transform.localPosition = new Vector2(data.pos_x, data.pos_y);
        //this.txtName.text = data.name;
        //this.type = (eGoldType)data.type;
        //this.txtValue.text = string.Format($"{data.value:#,##0} Gold");
        //this.txtPrice.text = string.Format($"US ${data.price}");

        this.id = id;
        GemData data = DataManager.Instance.GetGemData(this.id);
        this.icon.sprite = AtlasManager.Instance.GetGemIconSprite(data.icon_name);
        this.icon.SetNativeSize();
        this.icon.transform.localPosition = new Vector2(data.pos_x, data.pos_y);
        this.txtName.text = data.name;
        this.type = (eAmountType)data.type;
        this.txtValue.text = string.Format($"{data.value}");
        this.txtPrice.text = string.Format($"US ${data.price}");
    }
}

 

 

 

결과

 

 

 

 

탭 만들고 gem과 gold 왔다갔다 하는 것까지 만들려고 했으나 시간관계상 내일 이어서 하기로,,,