일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 시작해요 언리얼 2022
- 백준
- 파이썬
- Algorithm
- 오류
- Basic
- 재귀
- parameter
- Material
- 기초
- Unity
- UE5
- Unreal Engine 5
- loop
- Tutorial
- W3Schools
- dfs
- c++
- Programming
- dynamic
- C#
- w3school
- String
- python
- github
- 문제풀이
- DP
- 프로그래밍
- Class
- guide
- Today
- Total
행복한 개구리
Unity 복습 21.05.06. - 데이터 저장 및 불러오기 본문
Emission을 Albedo로 하면 홀로그램의 아랫쪽이 검정색으로 나온다. 빛의 영향을 받는 Albedo는 빛의 영향이 필요없는 이와 같은 작업에선 필요 없는듯 하다. 반면에 Emission은 빛의 영향없이 자신이 가진 색을 그대로 출력하므로 적합하다.
블린퐁공식을 사용하여 빛효과를 준 것이다. 빛의 벡터와 시선벡터의 중간값(하프벡터) 하프벡터와 표면벡터의 내각을 구하여 그 값을 적용한다.
++ UI데이터저장 불러오기가 꼬였다. 이미 할당된 키라면서 오류가 나오는데 뭐가 잘못됐는지 잘 모르겠다. 아마도 새로 하면서 기존의 것과 무엇이 다른지를 보는게 빠를듯 싶다.
============================================================================
이미 수령한 보상은 더이상 받지 못한다. 하지만 버튼을 누르면 옆 버튼이 활성화되는 기능을 아직 구현하지 못했다.
InfoManager에서 오류가 많았다. 딕셔너리에 중복되는 키가 들어간 경우도 있었고, listInfo가 정의되지 않은 채로 진행하여 생긴 오류도 있었으며, 무엇보다 저장을 어떻게 할건지를 잘 몰라서 오래걸렸다. 하지만 역시 시간이 깡패다.
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();
}
}
}
만약 이미 저장된 데이터가 있다면 불러오는 칸에서 바로 dictionary 로 변형시키니까 list가 없어서 두번째부터 save할때 오류가 생겨서 저렇게 나누어 불러오고 dictionary를 생성하도록 했다. 그리고 listInfo에 Add하여 데이터를 저장하니 id가 1인 데이터가 중복저장되어 오류가 발생하길래 누른 아이템의 아이디와 같다면 그 dictionary의 value값을 수정하도록 코드를 바꿨다.
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()
{
Debug.Log(Application.persistentDataPath);
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)
{
for (int i = 0; i < DataManager.GetInstance().dicUIItemData.Count / 3; i++)
{
var data = dicData[(10 * j) + i + 1];
Debug.Log(data.id);
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(() =>
{
info.isClaimed = true;
this.currCount = this.claimedCount;
uiItem.done.SetActive(true);
uiItem.today.gameObject.SetActive(false);
this.claimedCount++;
InfoManager.GetInstance().Save(info);
});
}
}
j++;
}
}
}
전체적인 작업을 수행하는 UIDailyReward는 차례대로 버튼을 활성화시켜 받을 수 있게했으며, 해당 데이터값의 수령여부를 참으로 바꾸도록 했다. 이제 여기서 시간을 놓쳐 못받은 보상을 비활성화 시킬수 있다면 구현하는게 좋을것 같고 그보다 우선적으로 UI를 다시 로딩하지 않아도 버튼을 눌렀을 때, 옆 버튼이 바로 활성화되게 만들면 될 것 같다.
'Unity > 복습' 카테고리의 다른 글
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 |
Unity Shader 21.05.06. LambertLight 복습 (0) | 2021.05.06 |
Unity 복습 21.05.04. UGUI Daily Reward 구현 (0) | 2021.05.05 |
Unity 복습 21.05.03. 데이터 저장&불러오기 // 쉐이더 (0) | 2021.05.03 |