인게임에서 플레이 한 뒤 모인 골드를 통해 Van을 업그레이드 해준다.
그렇기에 Van을 업그레이드 한 부분을 관리 할 Data Manage를 필요로 한다.
public class DataManager : Singleton<DataManager>
{
public PlayerDatas playerData;
private string path;
[SerializeField]
private string fileName = "/save.txt";
private string keyWord = "sadiqwjwkd#dkwda!! ej2kS@@";
private void Start()
{
path = Application.persistentDataPath + fileName;
Debug.Log(path);
LoadData();
}
public void SaveData()
{
string data = JsonUtility.ToJson(playerData);
File.WriteAllText(path, EncryptAndDecrypt(data));
}
public void LoadData()
{
if (!File.Exists(path))
{
SaveData();
}
string data = File.ReadAllText(path);
playerData = JsonUtility.FromJson<PlayerDatas>(EncryptAndDecrypt(data));
UIManager.Instance.UpdateMoneyText(playerData.money);
UIManager.Instance.UpdateBoosterSpeedLevelAndMoney(playerData.lv_speed, playerData.needUpgradeGold_speed);
UIManager.Instance.UpdateCarHpLevelAndMoney(playerData.lv_durability, playerData.needUpgradeGold_durability);
UIManager.Instance.UpdateOfflineRewardsLevelAndMoney(playerData.lv_offline, playerData.needUpgradeGold_offline);
}
private string EncryptAndDecrypt(string data)
{
string result = "";
for (int i = 0; i < data.Length; i++)
{
result += (char)(data[i] ^ keyWord[i % keyWord.Length]);
}
return result;
}
public void UpgradeBoosterSpeedData()
{
if (playerData.money < playerData.needUpgradeGold_speed)
return;
else
{
playerData.boosterSpeedValue += 0.25f;
playerData.money -= playerData.needUpgradeGold_speed;
UIManager.Instance.UpdateMoneyText(playerData.money);
playerData.needUpgradeGold_speed += 10;
playerData.lv_speed++;
}
UIManager.Instance.UpdateBoosterSpeedLevelAndMoney(playerData.lv_speed, playerData.needUpgradeGold_speed);
SaveData();
}
public void UpgradeDurabilityData()
{
if (playerData.money < playerData.needUpgradeGold_durability)
return;
else
{
playerData.maxVanHP += 1.0f;
playerData.money -= playerData.needUpgradeGold_durability;
UIManager.Instance.UpdateMoneyText(playerData.money);
playerData.needUpgradeGold_durability += 10;
playerData.lv_durability++;
}
UIManager.Instance.UpdateCarHpLevelAndMoney(playerData.lv_durability, playerData.needUpgradeGold_durability);
SaveData();
}
public void UpgradeOfflineMoneyData()
{
if (playerData.money < playerData.needUpgradeGold_offline)
return;
else
{
playerData.increaseMoneyOffline += 0.2f;
playerData.money -= playerData.needUpgradeGold_offline;
UIManager.Instance.UpdateMoneyText(playerData.money);
playerData.needUpgradeGold_offline += 10;
playerData.lv_offline++;
}
UIManager.Instance.UpdateOfflineRewardsLevelAndMoney(playerData.lv_offline, playerData.needUpgradeGold_offline);
SaveData();
}
public void UpdateMoney(float _money)
{
playerData.money += (int)_money;
UIManager.Instance.UpdateMoneyText(playerData.money);
SaveData();
}
public void SetVanData(VanData vanData)
{
vanData.maxVanHP = playerData.maxVanHP;
vanData.boosterSpeedValue = playerData.boosterSpeedValue;
}
}
업그레이드 한 내역을 메인 메뉴에서 진행 한 경우 실시간으로 JSON 형태로 저장이 된다.
게임을 시작 할때 해당 JSON 파일의 Van Data를 담을 Van Data << Plain Class >> 를 만들어 주었다.
public class VanData
{
private float straightSpeed = 40;
public float StraightSpeed { get { return straightSpeed; } }
private float straightMaximumSpeed = 140.0f;
public float StraightMaximumSpeed { get { return straightMaximumSpeed; } }
private float straightMinimumSpeed = 20.0f;
public float StraightMinimumSpeed { get { return straightMinimumSpeed; } }
private float sideSpeed = 8;
public float SideSpeed { get { return sideSpeed; } }
private float sideMinimumSpeed = 8.0f;
public float SideMinimumSpeed { get { return sideMinimumSpeed; } }
private float sideMaximumSpeed = 14.0f;
public float SideMaximumSpeed { get { return sideMaximumSpeed; } }
private float moveSmoothValue = 0.05f;
public float MoveSmoothValue { get { return moveSmoothValue; } }
private float increaseValue = 2f;
public float IncreaseValue { get { return increaseValue; } }
public float maxVanHP = 20;
public float boosterSpeedValue;
public VanData()
{
DataManager.Instance.SetVanData(this);
}
}
게임을 시작할때 해당 VanData를 생성을 하고 이 VanData를 VanController에서 사용을 해준다.
private void Start()
{
data = new VanData();
// 옵저버 세팅
if (vanUIUpdater != null)
Attach(vanUIUpdater);
if (cameraHandler != null)
{
Attach(cameraHandler);
}
inputHandler = new InputHandler();
vanEngine = new VanEngine(data, vanUIUpdater);
vanDrive = new VanDrive(data, rigidbody, transform);
crushManager = new CrushManager(data, vanUIUpdater);
firstPosZ = transform.position.z;
}
즉 Data Manager를 JSON 형태로 Van의 상태를 계속 저장해서 손실되지 않게 해주고
게임 시작시 VanData 클래스를 재생성 함으로써 이 데이터를 가지고 게임 내에서 사용 해주는 구조이다.