이전 포스팅에서 작성한 SteamCloud 스크립트.
using UnityEngine;
using Steamworks;
using System;
using System.IO;
[System.Serializable]
public class DeathPos
{
public int stageNum;
public Vector2 pos;
public DeathPos()
{
stageNum = 0;
pos = Vector2.zero;
}
public DeathPos(int stageNum, Vector2 pos)
{
this.stageNum = stageNum;
this.pos = pos;
}
}
[System.Serializable]
public class SaveData
{
public DeathPos deathPos = new DeathPos(); // 마지막 죽은 위치
public string keyBindingsJson = null; // 키 설정
public int unlockedDifficulty = 1; // 해금 난이도
}
public class SteamCloudManager : Singleton<SteamCloudManager>
{
private const string SaveFileName = "save_data.json"; // Steam Cloud에 저장될 파일 이름
public SaveData saveData; // 저장할 데이터
// 게임 시작 시 저장 데이터 자동 불러오기
private void Start()
{
if (!SteamClient.IsValid)
{
Debug.LogError("Steam Client가 실행되지 않았습니다.");
return;
}
Load(); // 게임 실행 시 자동 불러오기
}
// 데이터를 초기화하고 저장
public void ResetData()
{
saveData = new SaveData();
Save();
}
// 현재 데이터를 JSON으로 직렬화 후 Steam Cloud에 저장
public void Save()
{
if (!SteamClient.IsValid)
{
Debug.LogError("스팀 클라이언트 연결이 끊김");
return;
}
// 키 설정 파일을 불러와 SaveData에 저장
string keyBindingjson = File.ReadAllText(KeyBindingManager.keyBindingPath);
saveData.keyBindingsJson = keyBindingjson;
// SaveData를 JSON 문자열로 변환
string json = JsonUtility.ToJson(saveData, true);
byte[] data = System.Text.Encoding.UTF8.GetBytes(json);
// Steam Cloud에 저장
bool success = SteamRemoteStorage.FileWrite(SaveFileName, data);
}
// 불러오기 - Steam Cloud 또는 초기값을 기준으로 SaveData 생성
public void Load()
{
// ------------ Save Data 에 저장 ------------------ //
bool success = SteamRemoteStorage.FileExists(SaveFileName);
if (success) // Steam Cloud에 저장된 파일이 있는 경우
{
byte[] data = SteamRemoteStorage.FileRead(SaveFileName);
if (data != null && data.Length > 0)
{
string json = System.Text.Encoding.UTF8.GetString(data);
saveData = JsonUtility.FromJson<SaveData>(json);
}
else // 데이터가 비어 있을 경우 초기화
{
saveData = new SaveData();
}
}
else // Steam Cloud에 파일이 없는 경우 초기화
{
saveData = new SaveData();
}
// 키 설정 파일과 클라우드 데이터를 비교 후 필요 시 덮어쓰기
if (File.Exists(KeyBindingManager.keyBindingPath))
{
string local_json = File.ReadAllText(KeyBindingManager.keyBindingPath);
string cloud_json = saveData.keyBindingsJson;
if (!string.Equals(cloud_json, local_json, StringComparison.Ordinal))
{
local_json = cloud_json; // 덮어 쓰기
File.WriteAllText(KeyBindingManager.keyBindingPath, local_json);
}
}
}
}