Skip to content

explain UserInfo & UserDataManager

Yoo Hyeokjin edited this page Jun 21, 2023 · 5 revisions

UserInfo.cs & UserDataManager.cs의 이해

목차

UserInfo의 구조 및 역할

  • UserData instance가 가지고 있는 정보를 가공하고 조회하는 역할
  • Singleton을 사용해서 하나의 instance만 갖도록 한다.

UserInfo의 설명

  • UserData class를 불러오기
public UserData UserDataSet;
  • UserData가 가지고 있는 정보를 가공하고 조회하는 코드 예시(다음과 같이 정보를 가공하거나 조회할 수 있다.)
public void UpdateGold(int gold)
{
    UserDataSet.Gold += gold;                 // UserData gold에 더해준다.
    UserDataManager.instance.SaveData();      // Json File에 저장한다.
}

public void RefundGold()
{
    UserDataSet.ConsumedGold = 0;             // UserData ConsumeGold를 초기화해준다.
    UserDataManager.instance.SaveData();      // Json File에 저장한다.
}

public void UpdatePowerUpLevel(int powerUpIndex)
{
    UserDataSet.PowerUpLevel[powerUpIndex]++; // 강화에서 해당하는 Accessory의 레벨을 올려준다.
    UserDataManager.instance.SaveData();      // Json File에 저장한다.
}

UserDataManager의 구조 및 역할

  • UserData, UserDataManager class 두개로 이루어져 있다.
  • UserData는 게임에서 User가 저장해야 할 정보를 가지고 있는 class
  • UserDataManager는 UserData instance가 가지고 있는 정보를 Json File로 Save, Load, Reset하는 class이다.
  • Singleton을 사용해서 하나의 instance만 갖도록 한다.

UserDataManager의 설명

  • File과 관련된 함수를 사용하려면 다음과 같은 namespaces가 필요하다
using System.IO;
  • Json File의 유무 확인 예시
if (File.Exists(UserDataManager.instance.SavePath + "UserSaveData.json")) 
{
    LoadData();   // SavePath에 JSon File이 존재한다면 해당 파일을 Load한다.
}
else
{
    DataReset();  // 없다면 Data를 Reset한다.
}
  • 정보 저장(Save) 예시
public void SaveData()
{
    string data = JsonUtility.ToJson(UserInfo.instance.UserDataSet); // UserData인 UserDataSet을 Json 파일화 시켜 string data에 저장한다.
    File.WriteAllText(SavePath + "UserSaveData.json", data);         // SavePath에 Json파일을 만들어 data를 WriteAllText를 이용해 저장한다.
}
  • 정보 불러오기(Load) 예시
public void LoadData()
{
    string data = File.ReadAllText(SavePath + "UserSaveData.json");        // SavePath에 있는 Json파일을 읽어와 string data에 저장한다.
    UserInfo.instance.UserDataSet = JsonUtility.FromJson<UserData>(data);  // data에 저장된 내용의 형식을 UserData에 맞게 바꿔 UserDataSet에 저장한다.
}
  • 정보 초기화하기(Reset) 예시
public void DataReset()
{
    TextAsset textData = Resources.Load("GameData/DefaultUserData") as TextAsset;  // 해당 위치에 있는 파일을 불러온다.
    UserInfo.instance.UserDataSet = JsonUtility.FromJson<UserData>(textData.text); // Json형식으로 된 파일을 UserData에 맞춰 UserDataSet에 저장한다.
    SaveData();                                                                    // 데이터를 저장한다.
}

Script Code

UserInfo

using System;
using System.Linq;
using UnityEngine;

public class UserInfo : MonoBehaviour
{
    public static UserInfo instance;
    public UserData UserDataSet;

    private const int JUMP_ACCESSORY = 58;
    private const int JUMP_STAGE = 0;
    
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(instance.gameObject);
        }
        DontDestroyOnLoad(this.gameObject);
    }
    public void UpdateAccumulatedTime(float time)
    {
        UserDataSet.AccumulatedTime += time;
        UserDataManager.instance.SaveData();
    }
    public void UpdateAccumulatedKill(int kill)
    {
        UserDataSet.AccumulatedKill += kill;
        UserDataManager.instance.SaveData();
    }   
    public void UpdateGold(int gold)
    {
        UserDataSet.Gold += gold;
        UserDataManager.instance.SaveData();
    }
    public void ConsumeGold(int gold)
    {
        UserDataSet.Gold += gold;
        UserDataSet.ConsumedGold -= gold;
        UserDataManager.instance.SaveData();
    }
    public void RefundGold()
    {
        UserDataSet.ConsumedGold = 0;
        UserDataManager.instance.SaveData();
    }
    public void UpdateColldection(int collectionIndex)
    {
        UserDataSet.BCollection[collectionIndex] = true;
        UserDataManager.instance.SaveData();
    }
    public void UpdateAchievement(int achievementIndexes)
    {
        UserDataSet.BAchievements[achievementIndexes] = true;
        UserDataManager.instance.SaveData();
    }
    public void UpdatePowerUpLevel(int powerUpIndex)
    {
        UserDataSet.PowerUpLevel[powerUpIndex]++;
        UserDataManager.instance.SaveData();
    }
    public void RefundPowerUpLevel(int powerUpIndex)
    {
        UserDataSet.PowerUpLevel[powerUpIndex] = 0;
        UserDataManager.instance.SaveData();
    }
    public void UpdatePowerUpStat(int powerUpIndex, float powerUpStat)
    {
        UserDataSet.PowerUpStat[powerUpIndex] += powerUpStat;
        UserDataManager.instance.SaveData();
    }
    public void RefundPowerUpStat(int powerUpIndex)
    {
        UserDataSet.PowerUpStat[powerUpIndex] = 0;
        UserDataManager.instance.SaveData();
    }
    public void UpdatePowerUpCash(int powerUpIndex)
    {
        UserDataSet.NowPowerUpCash[powerUpIndex] = (int)(UserDataSet.PowerUpCash[powerUpIndex] * (1 + UserDataSet.PowerUpLevel[powerUpIndex]) + 20 * Math.Pow(1.1, UserDataSet.PowerUpLevel.Sum() - 1));
        UserDataManager.instance.SaveData();
    }
    public void RefundPowerUpCash(int powerUpIndex)
    {
        UserDataSet.NowPowerUpCash[powerUpIndex] = UserDataSet.PowerUpCash[powerUpIndex];
        UserDataManager.instance.SaveData();
    }
    public void UpdatePowerUpActive(int powerUpIndex, bool btemp)
    {
        UserDataSet.BPowerUpActive[powerUpIndex] = btemp;
        UserDataManager.instance.SaveData();
    }
    public void RefundPowerUpActive(int powerUpIndex)
    {
        UserDataSet.BPowerUpActive[powerUpIndex] = true;
        UserDataManager.instance.SaveData();
    }
    private void UpdateOption()
    {
        // TODO: Option기능 완성되면 추가
        UserDataManager.instance.SaveData();
    }
    private void UnlockCharacter(int characterIndex)
    {
        UserDataSet.BUnlockCharacters[characterIndex] = true;
        UserDataManager.instance.SaveData();
    }
    private void UnlockWeapon(int weaponIndex)
    {
        UserDataSet.BCollection[(weaponIndex << 1) | 1] = true;
        UserDataManager.instance.SaveData();
    }
    private void UnlockAccessory(int accessoryIndex)
    {
        UserDataSet.BCollection[accessoryIndex + JUMP_ACCESSORY] = true;
        UserDataManager.instance.SaveData();
    }
    private bool IsWeaponUnlock(int weaponIndex)
    {
        return UserDataSet.BCollection[(weaponIndex << 1) | 1];
    }
    private bool IsAccessoryUnlock(int accessoryIndex)
    {
        return UserDataSet.BCollection[accessoryIndex + JUMP_ACCESSORY];
    }
}

UserDataManager

using System;
using System.IO;
using UnityEngine;

[Serializable]
public class UserData
{
    public int Gold = 0;
    public int ConsumedGold = 0;
    public float AccumulatedTime = 0;
    public int AccumulatedKill = 0;
    public int[] Options;
    public int[] PowerUpLevel = new int[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    public float[] PowerUpStat = new float[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    public float[] PowerUpMaxstat = new float[16] { 0.25f, 3, 0.3f, 0.5f, -0.05f, 0.1f, 0.2f, 0.3f, 1, 0.1f, 0.5f, 0.3f, 0.15f, 0.5f, 0.5f, 1 };
    public int[] PowerUpCash = new int[16] { 200, 600, 200, 200, 900, 300, 300, 300, 5000, 300, 300, 600, 900, 200, 1666, 10000 };
    public int[] NowPowerUpCash = new int[16] { 200, 600, 200, 200, 900, 300, 300, 300, 5000, 300, 300, 600, 900, 200, 1666, 10000 };
    public bool[] BPowerUpActive = new bool[16] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true };
    public bool[] BAchievements;
    public bool[] BCollection;
    public bool[] BUnlockStages;
    public bool[] BUnlockCharacters;
}

public class UserDataManager : MonoBehaviour
{
    public static UserDataManager instance;
    public string SavePath;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(instance.gameObject);
        }
        DontDestroyOnLoad(this.gameObject);
        SavePath = Application.persistentDataPath + "/";
    }
    private void Start()
    {
        if (File.Exists(UserDataManager.instance.SavePath + "UserSaveData.json"))
        {
            LoadData();
        }
        else
        {
            DataReset();
        }
    }
    public void SaveData()
    {
        string data = JsonUtility.ToJson(UserInfo.instance.UserDataSet);
        File.WriteAllText(SavePath + "UserSaveData.json", data);
    }
    public void LoadData()
    {
        string data = File.ReadAllText(SavePath + "UserSaveData.json");
        UserInfo.instance.UserDataSet = JsonUtility.FromJson<UserData>(data);
    }
    public bool LoadData(string dataPath)
    {
        string data = File.ReadAllText(dataPath);
        UserData tempData;
        try
        {
            tempData = JsonUtility.FromJson<UserData>(data);
        }
        catch (ArgumentException)
        {
            return false;
        }

        UserInfo.instance.UserDataSet = tempData;
        SaveData();

        return true;
    }
    public void DataReset()
    {
        TextAsset textData = Resources.Load("GameData/DefaultUserData") as TextAsset;
        UserInfo.instance.UserDataSet = JsonUtility.FromJson<UserData>(textData.text);
        SaveData();
    }
}
Clone this wiki locally