์ธ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋ ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ArgumentException: JSON parse error: The document root must not follow by other values
์ ํํ ์ค๋ฅ๋ ์ ์ค๊ณผ ๊ฐ์ผ๋ฉฐ ์ฆ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ ์ด๋ํ๋ฉด์ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ด (์ด ๋ A, B ๋ผ๋ ์ฌ์ด ์์ผ๋ฉด B->A ๋ง ๋ฌธ์ ๊ฐ ์๊น) -> ์ธ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค์ง ๋ชปํจ
-> ์ด๊ฑธ ์ ์ฅํ๋ฉด ์ธ์ด๋ธ ๋ฐ์ดํฐ๊ฐ ๊ธ์ ํ๋ ์์ด ๋ค ๋ ์๊ฐ๋ฉฐ
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ก๋ ์คํฌ๋ฆฝํธ ์ชฝ์์ ๋ฐ์ํ์ต๋๋ค.
์ธ์ด๋ธ๋ฅผ ๋ด๋นํ๋ ์คํฌ๋ฆฝํธ๋ ์๋ A ์ฌ์ ์์ผ๋ฉฐ DontDestroyOnLoad ์ฒ๋ฆฌ๊ฐ ๋์ด์์ต๋๋ค.
๋ฐ๋ผ์ A -> B ์ฌ์ผ๋ก ๋์ด๊ฐ ๋ ํ๊ดด๋์ง ์์ผ๋ฉฐ, B -> A๋ก ๋์ด๊ฐ ๋ ํ๋์ฉ ๋์ด๋๊ธธ๋ ์ด ๋ Destroyํ๋๋ก ํ์ต๋๋ค.
๋ฐ๋ผ์ ํด๋น ์คํฌ๋ฆฝํธ๋ 1๊ฐ๋ฅผ ์ ์งํฉ๋๋ค.
ํน์ดํ ์ ์ผ๋ก๋ ๊ฐ์ ๋ฐ์ดํฐ๋ก๋ A <-> B๋ฅผ ์์ฃผ ๋น ๋ฅด๊ฒ ์ด๋ํด๋ ์ด์์ด ์์ผ๋, A ์ฌ์์ ๋ณํ๊ฐ ์์ ๋๋ง B -> A์์ ์ ๋ชฉ๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์๋๋ ์์ธ์ผ๋ก๋ ์ธ์ด๋ธ์ ๋ก๋๋ฅผ ๋งค์ฐ ์งง์ ๊ฐ๊ฒฉ์ผ๋ก ํ ๊ฒ์ ๋๋ค๋ง, ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ธ์ ์๋ ๋ถ์ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
public static class SaveSystem
{
public static void SavePlayer (DiceDirector diceDirector)
{
string path = Application.persistentDataPath + "/savedata.json";
if(File.Exists(path))
File.Delete(path);
using (FileStream stream = File.Create(path))
{
SaveData data = new SaveData(diceDirector);
AddText(stream, JsonUtility.ToJson(data, true));
}
}
public static SaveData LoadPlayer()
{
string path = Application.persistentDataPath + "/savedata.json";
if (File.Exists(path))
{
using (FileStream stream = File.OpenRead(path))
{
StringBuilder json = new StringBuilder("");
byte[] b = new byte[1024];
UTF8Encoding temp = new UTF8Encoding(true);
while (stream.Read(b,0,b.Length) > 0)
{
json.Append(temp.GetString(b));
}
SaveData data = JsonUtility.FromJson<SaveData>(json.ToString()); // ์ค๋ฅ ๋ฐ์ ์ง์ ์
๋๋ค.
//Debug.Log(path);
return data;
}
}
else
{
Debug.LogError("Save file not found in " + path);
return null;
}
}
private static void AddText(FileStream fs, string value)
{
byte[] info = new UTF8Encoding(true).GetBytes(value);
fs.Write(info, 0, info.Length);
}
}
์ฌ๊ธฐ์ DiceDirector๊ฐ DontDestroyOnLoad ์ ์ฉ๋ ์ธ์ด๋ธ ๋ด๋น ์คํฌ๋ฆฝํธ์ ๋๋ค.
์๋๋ ์ธ์ด๋ธ ๋ฐ์ดํฐ์ ๋๋ค. "1,2,3,4,5,6" ์ด๋ฐ ์์ผ๋ก ๋์ด์๋ ๊ฑด ๋ฐฐ์ด์ string์ผ๋ก ๋ณํํ ๊ฒ์ ๋๋ค.
{
"fieldDicesLevelForSave": "3,2,2",
"dicePosForSave": "(-0.2, 2.1),(0.2, -2.1),(0.3, 1.5)",
"dicesAppearInRoll": "1,2,3,4,5,6",
"dicesAmountInHand": 15,
"maxDicesAmountInHand": 100,
"dicesAmountInField": 3,
"maxDicesAmountInField": 100,
"diceRollCoolDown": 0.8342360258102417,
"maxDiceRollCoolDown": 1.0,
"diceLayer": 7,
"totalDicesAmount": 8,
"boardType": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,104,104,112,105,108,106,106,111,109,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,111,0,0,0,0,0,0,108,0,0,0,0,0,0,0,0,111,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,106,0,0,0,0,0,0,104,0,0,0,0,0,0,0,0,108,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,104,0,0,0,0,0,0,0,0,107,0,0,0,0,0,0,108,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,106,104,104,112,108,104,106,104,106,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0",
"boardNumber": 1,
"boardLevel": 0
}
์ค๋ฅ ๋ฐ์ ์ ๋ก๊ทธ์์ ๋์จ ์ธ์ด๋ธ ๋ฐ์ดํฐ์
๋๋ค.
{
ย ย "fieldDicesLevelForSave": "1,1",
ย ย "dicePosForSave": "(-0.5, 0.9),(-0.8, -0.2)",
ย ย "dicesAppearInRoll": "1,2,3,4,5,6",
ย ย "dicesAmountInHand": 25,
ย ย "maxDicesAmountInHand": 100,
ย ย "dicesAmountInField": 2,
ย ย "maxDicesAmountInField": 100,
ย ย "diceRollCoolDown": 0.14612144231796266,
ย ย "maxDiceRollCoolDown": 1.0,
ย ย "diceLayer": 2,
ย ย "totalDicesAmount": 2,
ย ย "boardType": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,106,109,104,109,109,112,111,104,111,0,0,0,0,0,0,110,0,0,0,0,0,0,0,0,108,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,108,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,110,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,109,106,108,109,110,106,106,108,104,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0",
ย ย "boardNumber": 1,
ย ย "boardLevel": 0
}
ย ย "fieldDicesLevelForSave": "1,1",
ย ย "dicePosForSave": "(-0.5, 0.9),(-0.8, -0.2)",
ย ย "dicesAppearInRoll": "1,2,3,4,5,6",
ย ย "dicesAmountInHand": 25,
ย ย "maxDicesAmountInHand": 100,
ย ย "dicesAmountInField": 2,
ย ย "maxDicesAmountInField": 100,
ย ย "diceRollCoolDown": 0.14612144231796266,
ย ย "maxDiceRollCoolDown": 1.0,
ย ย "diceLayer": 2,
ย ย "totalDicesAmount": 2,
ย ย "boardType": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,106,109,104,109,109,112,111,104,111,0,0,0,0,0,0,110,0,0,0,0,0,0,0,0,108,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,108,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,105,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,110,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,111,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,109,106,108,109,110,106,106,108,104,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0",
ย ย "boardNumber": 1,
ย ย "boardLevel": 0
๋ ๋ฒ์งธ ๊บผ๊ฐ ์ค๊ดํธ๋ ์์ด ์ถ๋ ฅ๋์์ต๋๋ค.
์๋ฌ๋ก๊ทธ๊ฐ ์์ธํ ์๋ ค์ฃผ๊ณ ์๋๋ฐ ์ง๋ฌธํ๋๊ฑด ๋ญ์ง..
๋ฌธ์ ๋ฃจํธ์ ๋ค๋ฅธ ๋ฐธ๋ฅ๊ฐ ๋ฐ๋ผ์ค๋ฉด ์ ๋๋ค๋๋ฐ ์ ํํ ์ํฉ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ตฌ๊ธ๋งํด๋ ์ดํด๊ฐ ์ ๋ฉ๋๋ค.
๋๊ฐ ์ด๋ค json์ ์ฐ๊ณ ์๋๋ฐ
JsonUtility๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ ์ ์ฅํ๊ณ ์๋?
๋ฐฐ์ด์ string์ผ๋ก ๋ณํํด์ ์ ์ฅํ๊ณ ์์ต๋๋ค. ๋ถ๋ฌ์ฌ ๋๋ ,๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฝ๋์ฌ๋ ค ์์จ๋ฐ์ง์ง ์ฝ๋์์์ ๋ ์ด๊ฐ์ข๊ฐ์๊ฑฐ ์ด์ฉ๋ถํธ์ผ๋ก ์ ๊ณ ํด์ผ์ง ์ง์ง ์ข๊ฐ๋ค
์๋ ์์ผ๋ถํ ์ด๊ฑฐ ์์ค๋ณธ๋ค๊ณ ์์์๋ ๋ฌธ์ ๋ ์๋๊ฑฐ๊ฐ์๋ฐ ใ ใ
์ ์ฝ๋ ๋งํ๋๊ฒ ์๋๊ณ ๋๊ธ ์ฐ๋ ค๋ฉด ์ฝ๋ 7์๋ฆฌ ์จ์ผํ๋๋ฐ ์ข๊ฐ์ด ์๋ณด์ด๊ณ ๊ณ์ํ๋ฆฌ๊ณ ์ข๊ฐ๋ค
๋ญ์ง ๋ชจ๋ฐ์ผ๋ง ์ฝ๋์๋๋ด pc๋ ์๋๋ฐ์ง๊ธ ใ ใ
์ ์ฅ์ ๋ฐฐ์ด๋ก ํ๋๋ฐ ์ ๋ถ๋ฌ์ค๋๊ฑด ํต์ง๋ก ๋ถ๋ฌ์ด ๋๋ฌด ๋ฐ๋ค๋ค๋ฅ ๋ถ์ด์์ด์ ๋ด๊ฐ ์๋ชป๋ณธ๊ฑด๊ฐ
์จ์๋๊ฑฐ ๋ณด๋๊น B -> A ๊ฐ๋ json ์ฌ์ฉํ๊ณ ๋์ ๋์คํธ๋ก์ด ํด์ค์ผ๋๋๋ฐ ๋์คํธ๋ก์ด ํ๋ค์ json ๋ถ๋ฅด๋๊ฑฐ์๋?ใ ใ
B -> A์์ ๊ตฌ์ธ์ด๋ธ ์คํฌ๋ฆฝํธ๋ ์ ์ฅํ๊ณ ๋์คํธ๋ก์ด๋๊ณ , ์ ๊ฐ ์๋ ์์๊ฐ ๋ง์ ๊ฒฝ์ฐ ๊ทธ ๋ค์์ ์ฌ์ด ๋ถ๋ฌ์์ง๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ์ธ์ด๋ธ ์คํฌ๋ฆฝํธ๊ฐ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ์์ ํฉ๋๋ค. B -> A๋ก ๊ฐ๋ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด ๊ตฌ์ธ์ด๋ธ ์ ์ฅ ํ ๋์คํธ๋ก์ด; ์ฌ ๋ถ๋ฌ์ค๊ธฐ; ์ด๋ฐ ์์ ๋๋ค.
์๋ง- ํ๋ก์ ํธ์ธํ ์ ๋ณด๋ฉด Script Execution Order ์๋๋ฐ ์ฌ๊ธฐ์ ์คํฌ๋ฆฝํธ ์คํ์์ ํ์ธํด๋ด?
์๋๋ฉด ์ธ์ด๋ธ๋ฐ์ดํฐ json์ ์ฝ์์ฐฝ์ debug.log๋ก ์ฐ์ด๋ณด์ ์๋ง ๊ทธ๊ฒ ์ ค ๋น ๋ฅผ๋ฏ
์ง๊ธ json ์์์ด ์๋ง๋๊ฑด์ง, ์์ ๋ชป๋ถ๋ฌ์ค๋๊ฑด์ง, ์์๊ฐ ์๋ชป๋๊ฑด์ง ํ์ ์ด ์์๋๋ฐ ์ ๊ฑฐ ํ๋ฒ ํด๋ณด๋ฉด ๊ฑ ์์์์๋ฏ
์คํฌ๋ฆฝํธ ์คํ ์์๋ ํด๋น ์คํฌ๋ฆฝํธ ์ ๋ถ default๋ก ๋์ด์๊ณ , ์์๋ฅผ ๊ฐ๊ฐ ์ค์ ํด๋ ๊ทธ๋๋ก์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ด์ผ๊ฒ ๋ค!
๊ทธ๋ฆฌ๊ณ json์ ์ฝ์์ฐฝ์ ์ด๋ป๊ฒ ๋ถ๋ฌ์ค๋์? ์ธ์ด๋ธ ๋ถ๋ฌ์ฌ ๋์ ๊ฐ์ด ํด์ ๋๋ฒ๊ทธ์ ์ฐ์ผ๋ฉด ๋๋์?
SaveData LoadPlayer() ์์ while๋ฌธ ๋๋๊ณ ๋๋ค์ Debug.log(json.ToString()); ํ๋ฉด ๋๊ฒ๋ค
Application.persistentDataPath ์ด๊ฑฐ๋ ํจ ์ฐ์ด๋ณด์ ๊ทธ๋ฌ๊ณ ์ฝ์์ฐฝ์์ ๋น๊ต ใฑใฑ
๋ ๊ฑ ์์ฌ๊ฐ๋ฉด ์ผ๋จ ๋ก๊ทธ์ฐ์ด๋ณด๋ ์คํ์ผ์ด๋ผ
path๋ ๋ฉ์ฉกํ๊ณ , ์ค๋ฅ ๋ฐ์ ์ ์ธ์ด๋ธ ๋ฐ์ดํฐ๊ฐ ์ถฉ๋์ด ์๊ธด ๊ฒ ๊ฐ์ต๋๋ค.
์ ๊ฑฐ ๊ทธ๋ฅ ToString() ๋นผ๋ฉด ํด๊ฒฐ๋ ๊ฑฐ๊ฐ๋ค
์ ์์ธ์ ๋ค๋ฅธ๋ฐ์ ์๋๊ฑด๊ฐ ์ฐพ์๋๋ณด๋ค
์ผ๋จ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋๋ง ์ ๊ธ์ฒ๋ผ ๋ ๋ฒ ์ถ๋ ฅ๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋ค๋ง ์ ํ์์ด ์ธ์ด๋ธ๋ฅผ ์ฐ์์ผ๋ก 2๋ฒํด์์ธ์ง, ์ธ์ด๋ธ-๋ก๋๋ฅผ ๋์์ ํด์ ๋ฌธ์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ผ๋จ ๋๋ถ์ ์ฌ๊ธฐ๊น์ง ์ฌ ์ ์์์ด์. ์น์ ํ๊ฒ ๊ฐ๋ฅด์ณ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
ํน์ jsonํ์ผ ๋ฐฐ์ด(์ค๊ดํธ,๊ดํธ)์ด๋ ๊ทธ๋ฐ๊ฑฐ ์์์ ์๋ชป ์์ฑํ๊ฑฐ๋ ๊ทธ๋ฌ์ง ์์์ด? ์์ธ๋ก ์์ฒญ ๊ฐ๋จํ ๋ฌธ์ ์ผ์ง๋ ๋ชจ๋ฅด๋ ํ๋ฒ ํ์ธํด๋ด
์์์ ์ด๋ป๊ฒ ํ์ธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค๋ง ์ ์ฅํ ๋ฐ์ดํฐ์ ๊ฐ์์ ๋ฐ๋ผ ํด๋น ํ์์ ๋ฐ์๋ฅ ์ด ๋งค์ฐ ํฌ๊ฒ ์ฐจ์ด๋ฉ๋๋ค. ์ธ์ด๋ธ ๋ฐ์ดํฐ์ ์์์ ๋ฉ์ฉกํด๋ณด์ ๋๋ค.
๋น๋๊ธฐ๋ก ๋ญ ํ๋
๋ก์ปฌ ์ ์ฅ ๋ง์ํ์๋๊ฑด๊ฐ์? ์์ง ์ด๋ณด๋ผ ์๋ฒ ์ ์ฅ์ ๋จผ ํ๋ ๋ก ์๊ฐํ๊ณ ์์ต๋๋ค...