Notice
Recent Posts
Recent Comments
Link
스토리지
[4.23] Json데이터에 기반한 ScrollView 본문
DataManager.cs
// 제너릭 쓰는 법을 한번 알아봐야됨. 이대로는 코드가 너무 더럽다.
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using UnityEngine;
public class DataMgr
{
public Dictionary<int, MissionData> arrMission;
public Dictionary<int, RewardDATA> arrReward;
public Dictionary<int, MissionInfo> arrInfo;
public Dictionary<int, ThumbData> arrThumb;
private static DataMgr instance;
public static DataMgr Instance
{
get
{
if (instance == null)
{
instance = new DataMgr();
}
return instance;
}
}
private DataMgr()
{
}
public void GetDatas()
{
var path = Resources.Load<TextAsset>("mission_data");
string data = path.text;
MissionData[] arr1 = JsonConvert.DeserializeObject<MissionData[]>(data);
this.arrMission = arr1.ToDictionary(x => x.missionID);
path = Resources.Load<TextAsset>("reward_data");
data = path.text;
RewardDATA[] arr2 = JsonConvert.DeserializeObject<RewardDATA[]>(data);
this.arrReward = arr2.ToDictionary(x => x.rewardID);
path = Resources.Load<TextAsset>("mission_info");
data = path.text;
MissionInfo[] arr3 = JsonConvert.DeserializeObject<MissionInfo[]>(data);
this.arrInfo = arr3.ToDictionary(x => x.missionID);
path = Resources.Load<TextAsset>("thumb_data");
data = path.text;
ThumbData[] arr4 = JsonConvert.DeserializeObject<ThumbData[]>(data);
this.arrThumb = arr4.ToDictionary(x => x.thumbNum);
}
}
UIPopupMission.cs
//Init 할 것이 많아서 인자가 좀 길다.
using UnityEngine;
using UnityEngine.U2D;
public class UIPopupMission : MonoBehaviour
{
public Transform position;
public GameObject prefab;
public SpriteAtlas atlas;
// Start is called before the first frame update
void Start()
{
this.Init();
}
private void Init()
{
DataMgr.Instance.GetDatas();
foreach (var item in DataMgr.Instance.arrMission)
{
MissionData mission = item.Value;
var go = Instantiate(this.prefab, this.position);
go.GetComponent<UIMissionItem>().Init(
this.atlas.GetSprite(DataMgr.Instance.arrThumb[mission.thumbNum].path), mission.desc, DataMgr.Instance.arrInfo[mission.missionID].count, mission.star,
this.atlas.GetSprite(DataMgr.Instance.arrThumb[DataMgr.Instance.arrReward[mission.rewardID].thumbNum].path),
DataMgr.Instance.arrReward[mission.rewardID].num, DataMgr.Instance.arrInfo[mission.missionID].isClear);
}
}
}
프리팹
- 퀘스트 하나당 프리팹 하나이다.
- Stars : 별이 들어갈 장소들의 집합
- Mission Status : 미션이 Doing 상태, Done 상태, Complete 상태에 따른 다른 버튼들의 집합
using UnityEngine;
using UnityEngine.UI;
public class UIMissionItem : MonoBehaviour
{
public Image imgItem;
public Text missionDesc;
public Slider slider;
public Image[] stars;
public Sprite starSprite;
public Image rewardThumb;
public Text rewardNum;
public Button[] missionStatus;
public void Init(Sprite sprite, string desc, int degree, int starNum, Sprite rewardSprite, int rewardNum, int status)
{
this.imgItem.sprite = sprite;
this.missionDesc.text = desc;
slider.value = (float)degree / 100f;
for (int i = 0; i < starNum; i++)
{
stars[i].sprite = this.starSprite;
}
this.rewardThumb.sprite = rewardSprite;
this.rewardNum.text = rewardNum.ToString();
if (rewardSprite.name.Contains("mission_btn_icon_coin"))
{
this.rewardNum.color = Color.yellow;
}
else if (rewardSprite.name.Contains("mission_btn_icon_gem"))
{
this.rewardNum.color = new Color(67f / 255f, 136f / 255f, 215f / 255f);
}
if (status == 0)
{
this.missionStatus[0].gameObject.SetActive(true);
this.missionStatus[1].gameObject.SetActive(false);
this.missionStatus[2].gameObject.SetActive(false);
}
else if (status == 1)
{
this.missionStatus[0].gameObject.SetActive(false);
this.missionStatus[2].gameObject.SetActive(false);
this.missionStatus[1].gameObject.SetActive(true);
}
else
{
this.missionStatus[0].gameObject.SetActive(false);
this.missionStatus[1].gameObject.SetActive(false);
this.missionStatus[2].gameObject.SetActive(true);
}
}
}
'Unity > 유니티 기본' 카테고리의 다른 글
[4.26] NGUI (0) | 2021.04.26 |
---|---|
[4.23] 가로로 드래그되는 ScrollView (0) | 2021.04.23 |
[4.23] ScrollView (0) | 2021.04.23 |
[4.22] UI Animation (0) | 2021.04.22 |
[4.21] Json파일에서 읽은 미션을 스테이지에 적용 (0) | 2021.04.21 |
Comments