Unity/복습

Unity 복습 21.05.04. UGUI Daily Reward 구현

HappyFrog 2021. 5. 5. 00:36

데이터 불러오기, 저장은 잘 되지만 보상을 받았을 때 다음칸으로 넘기는 것을 구현하지 못했다. 내일 쉬니까 해봐야지.

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

public class UIItemInfo
{
    public int id;
    public bool isClaimed;

    public UIItemInfo(int id, bool isClaimed)
    {
        this.id = id;
        this.isClaimed = isClaimed;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;

public class DataManager 
{
    public Dictionary<int, UIItemData> dicUIItemData;
    static DataManager instance;

    public static DataManager GetInstance()
    {
        if(instance == null)
        {
            instance = new DataManager();
        }
        return instance;
    }

    public void LoadDatas()
    {
        var ta = Resources.Load<TextAsset>("Datas/ui_item_data");
        var json = ta.text;
        this.dicUIItemData = JsonConvert.DeserializeObject<UIItemData[]>(json).ToDictionary(x => x.id);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIItemData
{
    public int id;
    public int amount;
    public string icon_sp_name;   
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using Newtonsoft.Json;
using System.Linq;

public class InfoManager
{
    public Dictionary<int, UIItemInfo> dicUIItemInfo;
    public List<UIItemInfo> listUIItemInfos = new List<UIItemInfo>();
    static InfoManager instance;

    public static InfoManager GetInstance()
    {
        if(instance == null)
        {
            instance = new InfoManager();
        }
        return instance;
    }

    public void LoadInfos()
    {
        var path = string.Format("{0}/ui_item_info.json", Application.persistentDataPath);
        if (File.Exists(path))
        {
            var json = File.ReadAllText(path);
            this.dicUIItemInfo = JsonConvert.DeserializeObject<UIItemInfo[]>(json).ToDictionary(x => x.id);
        }
        else
        {
            for(int i = 0; i < DataManager.GetInstance().dicUIItemData.Count; i++)
            {
                var id = DataManager.GetInstance().dicUIItemData[i+1].id;
                var info = new UIItemInfo(id, false);
                this.listUIItemInfos.Add(info);
            }
            var json = JsonConvert.SerializeObject(this.listUIItemInfos);
            File.WriteAllText(path, json);

            LoadInfos();
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D;

public class UIItem : MonoBehaviour
{
    public SpriteAtlas atlas;
    public Image icon;
    public Text amount;
    public Text day;
    public GameObject done;
    public Button today;
    
    public void Init(UIItemInfo info)
    {        
        if (info.isClaimed)
        {
            this.done.SetActive(true);
            this.today.gameObject.SetActive(false);
        }
    }

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

public class UIDailyReward : MonoBehaviour
{
    public GameObject prefab;
    public Transform[] grids;

    int claimedCount = 0;
    void Start()
    {
        Init();
    }
    
    public void Init()
    {
        DataManager.GetInstance().LoadDatas();
        InfoManager.GetInstance().LoadInfos();
        var dicData = DataManager.GetInstance().dicUIItemData;
        var dicInfo = InfoManager.GetInstance().dicUIItemInfo;
        int j = 0;
        foreach (var grid in this.grids)
        {
            for (int i = 0; i < DataManager.GetInstance().dicUIItemData.Count / 3; i++)
            {
                var data = dicData[(10 * j) + i + 1];
                var info = dicInfo[data.id];

                var go = Instantiate(this.prefab, grid);
                var uiItem = go.GetComponent<UIItem>();
                uiItem.icon.sprite = uiItem.atlas.GetSprite(data.icon_sp_name);
                uiItem.icon.SetNativeSize();
                uiItem.amount.text = data.amount.ToString();
                uiItem.day.text = (i + 1).ToString(); ;
                uiItem.Init(info);

                if (info.isClaimed) this.claimedCount++;
                var gridIdx = this.claimedCount / 10;
                var itemIdx = this.claimedCount % 10;

                if (grid == this.grids[gridIdx] && i == itemIdx)
                {                    
                    uiItem.today.gameObject.SetActive(true);

                    uiItem.today.onClick.AddListener(() =>
                    {
                        uiItem.done.SetActive(true);
                        uiItem.today.gameObject.SetActive(false);
                        this.claimedCount++;                        
                    });
                }
            }
            j++;
        }
    }
}

 

-받아온 프리팹과 위치로 그리드 순서에 따라 오브젝트를 생성하고 거기에 불러온 데이터값을 주입

-Info의 수령 여부로 이미 받았는지 아니면 아직 받지 않았는지를 알 수 있도록 했으며

-스프라이트가 넓어지는 현상이 보여서 SetNativeSize를 사용했다. 

 

그리고 아직 받지 않은 보상 중 인덱스가 가장 작은 보상을 찾기위해 gridIdx와 itemIdx를 구했으며(이는 한 줄에 10개씩만 들어간다는 가정 하에 가능하다.)

받은 보상 갯수를 10으로 나눈 자연수 값을 grid인덱스, 10으로 나눈 나머지값을 아이템인덱스로 했다.

그리고 이 인덱스에 맞는다면 보상을 받을 수 있는 버튼을 활성화 시키고, 누르면 버튼이 비활성화되며 보상칸의 뚜껑이 나타난다. 동시에 받은 보상갯수가 올라간다. 

 

UIDailyReward를 더 깔끔하게 작성하고 싶었지만 아직은 이게 최선인 듯 하다. 내일은 다음칸으로 넘기는 것만 구현하면 되겠당.