본문 바로가기
게임개발/게임 UI.UX 프로그래밍

DataManager 싱글톤 클래스 만들기

by pudding81 2024. 2. 13.

 
 

 
 
다양한 데이터를 관리하는 싱글톤 클래스 
 
DataManager / 여러 씬의 데이터를 관리 
 
-> ShopGemData      ->  Test3Main
-> MissonData           ->  Test7Main
-> RewardData         ->   Test7Main
 

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System;


//데이터를 관리하는 싱글톤 클래스 
public class DataManager
{
    //싱글톤 패턴 
    //클래스에 인스턴스가 한개
    //전역적으로 접근 가능하다


    //public static readonly 변수를 정의하고 인스턴스를 생성해라 
    public static readonly DataManager Instance = new DataManager();
   
    private Dictionary<int, ShopGemData> dicShopGemDatas;
    private Dictionary<int, MissionData> dicMissionDatas;
    private Dictionary<int, RewardData> dicRewardDatas;

    //생성자 
    private DataManager()
    {

    }

    public void LoadShopGemData()
    {
        TextAsset asset = Resources.Load<TextAsset>("shop_gem_data");
        string json = asset.text;
        ShopGemData[] datas = JsonConvert.DeserializeObject<ShopGemData[]>(json);
      
      //x => x.id는 람다식, 배열의 각 요소 x에 대해 x의 id 속성을 키로 사용
      this.dicShopGemDatas = datas.ToDictionary(x => x.id);
        
        Debug.LogFormat("dicShopGemDatas.Count: {0}", dicShopGemDatas.Count);
    }

    public List<ShopGemData> GetShopGemDataValues()
    {
        return this.dicShopGemDatas.Values.ToList();
    }

    public ShopGemData GetShopGemDataById(int id)
    {
        return this.dicShopGemDatas[id];
    }

    public void LoadMissionData()
    {
        TextAsset asset = Resources.Load<TextAsset>("mission_data");
        string json = asset.text;
        MissionData[] datas = JsonConvert.DeserializeObject<MissionData[]>(json);
        this.dicMissionDatas = datas.ToDictionary(x => x.id);
        Debug.LogFormat("dicMissionDatas.Count: {0}", dicMissionDatas.Count);
    }

    public void LoadRewardData()
    {
        TextAsset asset = Resources.Load<TextAsset>("reward_data");
        string json = asset.text;
        RewardData[] datas = JsonConvert.DeserializeObject<RewardData[]>(json);
        this.dicRewardDatas = datas.ToDictionary(x => x.id);
        Debug.LogFormat("dicRewardDatas.Count: {0}", dicRewardDatas.Count);
    }

    public MissionData GetMissionData(int id)
    {
        return this.dicMissionDatas[id];

    }

    public RewardData GetRewardData(int id)
    {
        return this.dicRewardDatas[id];

    }
}

 
 
-> ShopGemData      ->  Test3Main

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft;
using Newtonsoft.Json;

public class Test3Main : MonoBehaviour
{
    [SerializeField]
    private Item[] cellViews;

    void Start()
    {
        DataManager.Instance.LoadShopGemData();

        List<ShopGemData> shopGemDatas =
            DataManager.Instance.GetShopGemDataValues();

        for (int i = 0; i < shopGemDatas.Count; i++)
        {
            var cellView = cellViews[i];
            var data = shopGemDatas[i];
            cellView.btn.onClick.AddListener(() =>
            {
                Debug.LogFormat("=> {0}, {1}, {2}", data.id, data.name, data.price);
            });
            cellView.Init(data);
        }

        

    }


}

 
-> MissonData           ->  Test7Main
-> RewardData         ->   Test7Main
 
 

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

public class MissionData 
{
    public int id;
    public string name;
    public int goal;
    public string desc;
    public string sprite_name;
    public int reward_id;
    public int reward_amount;
}

 

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

public class Test7Main : MonoBehaviour
{
    void Start()
    {
        DataManager.Instance.LoadMissionData();
        DataManager.Instance.LoadRewardData();

        this.UpdateMissionCellView(1000);
    }

    private void UpdateMissionCellView(int id)
    {
        MissionData missionData = DataManager.Instance.GetMissionData(1000);
        RewardData rewardData = DataManager.Instance.GetRewardData(missionData.reward_id);

        //미션아이콘이름, 미션명, 미션DESC, 보상아이콘이름, 보상수량 
        //icon_coins_pouch, Collect Golds, Collect 10000 Golds, icon_color_energy, 1

        string missionDesc = string.Format(missionData.desc, missionData.goal);
        Debug.LogFormat("{0}, {1}, {2}, {3}, {4}", missionData.sprite_name, missionData.name, missionDesc, rewardData.sprite_name, missionData.reward_amount);
    }
}