-
Notifications
You must be signed in to change notification settings - Fork 2
explain UserInfo & UserDataManager
Yoo Hyeokjin edited this page Jun 21, 2023
·
5 revisions
- UserData instance가 가지고 있는 정보를 가공하고 조회하는 역할
- Singleton을 사용해서 하나의 instance만 갖도록 한다.
- 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에 저장한다.
}
- UserData, UserDataManager class 두개로 이루어져 있다.
- UserData는 게임에서 User가 저장해야 할 정보를 가지고 있는 class
- UserDataManager는 UserData instance가 가지고 있는 정보를 Json File로 Save, Load, Reset하는 class이다.
- Singleton을 사용해서 하나의 instance만 갖도록 한다.
- 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(); // 데이터를 저장한다.
}
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];
}
}
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();
}
}