[Steamworks] Steam Cloud 활용하기 (2)

MINO·2025년 5월 19일

이전 포스팅에서 작성한 SteamCloud 스크립트.

SteamCloudManager.cs

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);
            }
        }

    }
}
profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글