I am working on an Unity Project which I use new CloudSave system. On my game normally I use serialization/ deserialization and write the game data to a file. I serialize/deserialize the custom data type: "GameData".
However, now I need to use both systems. writing/ reading on file and cloud as well. and this is first time for me. (since Unity CloudSave is new system, there is almost no source)
I am trying to convert a dictionary to JSON string where dictionary has one key and some of values. I want to have a JSON with only values of the dictionary.
to load the data from Unity Cloud I call LoadHandler() method in CouldHandler.cs from an other trigger script which returns me GameData type result.
CouldHandler.cs:
using System.Collections;
using System.Collections.Generic;
using Unity.Services.Authentication;
using Unity.Services.CloudSave;
using Unity.Services.Core;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
using System.Xml;
using UnityEditor.Experimental.RestService;
using System;
using Unity.VisualScripting;
using System.Text.Json;
using Newtonsoft.Json.Linq;
public class CloudHandler : MonoBehaviour
{
public static string PLAYER_CLOUD_KEY = "PLAYER_DATA";
public static int counter = 0;
public static GameData gameData;
public static Dictionary<string, string> data;
public static string myJson;
public static GameData LoadHandler()
{
LoadData();
return gameData;
}
public static async void LoadData()
{
if (counter == 0)
{
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();
counter++;
}
data = await CloudSaveService.Instance.Data.LoadAsync(new HashSet<string> { PLAYER_CLOUD_KEY});
//string INeedAValueHere = // I NEED HERE JSON FROM DICTIONARY [data]
//GameData INeedAnotherValueHere = // I NEED HERE GAMEDATA FORMAT FROM JSON
string myString = data[PLAYER_CLOUD_KEY];
char[] MyChar = { '{', '}'};
myString = myString.TrimStart(MyChar);
myString = myString.TrimEnd(MyChar);
myJson= JsonConvert.SerializeObject(myString);
gameData = JsonUtility.FromJson<GameData>(myJson);
Debug.Log($"myStore: {myJson}"); // out come: "Panda":false,"Peacock":false,"RedPanda ":false
}
}
GameData.cs:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using Unity.VisualScripting;
using UnityEngine;
[System.Serializable]
public class GameData
{
public bool Panda, Peacock, RedPanda, Sloth, Tapir;
public GameData()
{
this.Panda = false; this.Peacock = false; this.RedPanda = false; this.Sloth = false; this.Tapir = false;
}
}
I need a variable in Json string format as well as I need a variable in GameData format
I canNOT claim that my c# is so sharp!! but anyway at max I could get this outcome.
"Panda":false,"Peacock":false,"RedPanda ":false
above outcome may look like a JSON string. But unity is not writing this values to the file. It is just deleting all earlier values.
and when I want to print the values from my file Unity prints it as below format. Therefore I thought I do something wrong and Unity is not recognizing myJson variable as Json string.
{
"Alligator" : false,
"Alpaca" : false,
"Antelope" :false
}
Assuming that your data is stored as JSON on the dictionary you retrieve from the cloud, all you have to do is directly convert the string you get instead of removing '{' and '}' from it.
myJson = data[PLAYER_CLOUD_KEY];
gameData = JsonUtility.FromJson<GameData>(myJson);