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