Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬
- W3Schools
- String
- 문제풀이
- UE5
- Class
- dfs
- C#
- 백준
- DP
- parameter
- loop
- 시작해요 언리얼 2022
- Algorithm
- 오류
- Unity
- Tutorial
- 프로그래밍
- python
- guide
- 기초
- 재귀
- w3school
- c++
- Material
- dynamic
- Unreal Engine 5
- github
- Programming
- Basic
Archives
- Today
- Total
행복한 개구리
Unity 복습 21.05.10. UGUI - DailyReward 본문
신난다 1주일 가까이 잡고있던 일일보상 다음버튼 생성을 해결했다.
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;
int currCount = 0;
void Start()
{
Init();
}
public void Init()
{
InfoManager.GetInstance().LoadInfos();
var dicData = DataManager.GetInstance().dicUIItemData;
var dicInfo = InfoManager.GetInstance().dicUIItemInfo;
int j = 0;
foreach (var grid in this.grids)
{
var length = DataManager.GetInstance().dicUIItemData.Count - j*10;
if (length > 10) length = 10;
for (int i = 0; i < length; i++)
{
var data = dicData[(10 * j) + i + 1];
var info = dicInfo[data.id];
var uiItem = CreateGameObject(grid, i, data, info);
if (info.isClaimed) this.claimedCount++;
var gridIdx = this.claimedCount / 10;
var itemIdx = this.claimedCount % 10;
if (this.claimedCount < DataManager.GetInstance().dicUIItemData.Count && grid == this.grids[gridIdx] && i == itemIdx )
{
uiItem.today.gameObject.SetActive(true);
this.currCount += 1;
}
uiItem.today.onClick.AddListener(() =>
{
this.claimedCount++;
info.isClaimed = true;
uiItem.done.SetActive(true);
uiItem.today.gameObject.SetActive(false);
InfoManager.GetInstance().Save(info);
this.currCount -= 1;
if(this.claimedCount < DataManager.GetInstance().dicUIItemData.Count && this.currCount == 0 )
{
NextButton();
}
});
}
j++;
}
}
void NextButton()
{
var gridIdx = this.claimedCount / 10;
var itemIdx = this.claimedCount % 10;
var go = this.grids[gridIdx].GetChild(itemIdx);
var nextItem = go.GetComponent<UIItem>();
nextItem.today.gameObject.SetActive(true);
this.currCount += 1;
}
UIItem CreateGameObject(Transform grid, int i, UIItemData data, UIItemInfo info)
{
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);
return uiItem;
}
}
일단 UI를 관리하는 스크립트의 Init이 조금 지저분하긴 하지만 여기서 모든 처리를 했다.
1. claimedCount를 선언하여 수령한 보상의 갯수를 셌고, 그 갯수로 버튼오브젝트를 활성화 시키는 방식으로 했다.
2. 또한, grid만 스크립트에 바인딩하고 나머지 아이템들은 알아서 생성될 수 있도록 조건문과 반복문을 사용하여 생성했고, grid 하나에 10개이상 아이템이 못들어가게 length가 10이상 나오지 못하도록 조건문을 선언했다.(이는 테이블의 갯수가 30이 안될 때를 위한 오류처리이기도 하다.)
3. 그리고 grid인데스에 따라 데이터테이블의 값을 불러올 수 있도록 foreach문의 grid인덱스마다 10씩 곱하도록 선언했다.
4.또한 현재 버튼의 카운트가 0일때, 새로운 버튼을 생성할 수 있도록 currCount를 선언했다.(빼도 될것같기도하고... 나는 저대로 실행했다.)
5.Init메서드가 너무 가독성이 떨어진다고 생각하여 CreateGameObject와 NextButton메서드를 따로 생성하여 사용했다.
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 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 Save(UIItemInfo info)
{
var path = string.Format("{0}/ui_item_info.json", Application.persistentDataPath);
var json = File.ReadAllText(path);
foreach(var inform in this.listUIItemInfos)
{
if(inform.id == info.id)
{
inform.isClaimed = info.isClaimed;
}
}
var saveJson = JsonConvert.SerializeObject(this.listUIItemInfos);
File.WriteAllText(path, saveJson);
}
public void LoadInfos()
{
DataManager.GetInstance().LoadDatas();
var path = string.Format("{0}/ui_item_info.json", Application.persistentDataPath);
if (File.Exists(path))
{
var json = File.ReadAllText(path);
this.listUIItemInfos = JsonConvert.DeserializeObject<List<UIItemInfo>>(json);
this.dicUIItemInfo = this.listUIItemInfos.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 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;
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);
}
}
}

'Unity > 복습' 카테고리의 다른 글
Unity Shader 21.05.13. 불 효과만들기 (0) | 2021.05.14 |
---|---|
Unity 복습 21.05.11. PUN2 - 로비 구현2 (0) | 2021.05.12 |
Unity 복습 21.05.10. Shader - AlphaBlending (0) | 2021.05.10 |
Unity 복습 21.05.09. Shader - 빛효과 단계별 적용, halfvector, Hologram, RimLight, lerp (0) | 2021.05.09 |
Unity 복습 21.05.09. Shader - 외곽선, Diffuse Wrap, CubeMap (0) | 2021.05.09 |