// 원하는 Type을 Object로 넘겨서 시리얼라이즈 한 후, string으로 받아옴.
// 이 값을 PlayerPrefs에 저장.
private string ObjectToString(System.Object _cObject)
{
if (_cObject == null)
return null;
var binaryFormatter = new BinaryFormatter();
var memoryStream = new MemoryStream();
binaryFormatter.Serialize(memoryStream, _cObject);
return Convert.ToBase64String(memoryStream.GetBuffer());
}
// PlayerPrefs에 저장된 값을 string에 받아와서 Object로 변환 후, 맞는 Type으로 형변환. Collection도 가능.
// 예) List<MyClass> listValues = StringToObject(strValue) as List<MyClass>;
private System.Object StringToObject(string _strValue)
{
if (true == string.IsNullOrEmpty(_strValue))
return null;
var binaryFormatter = new BinaryFormatter();
var memoryStream = new MemoryStream(Convert.FromBase64String(_strValue));
System.Object obj = binaryFormatter.Deserialize(memoryStream);
return obj;
}
출처 : http://kookiandkiki.blogspot.kr/2014/01/unity3d_432.html
이전 포스팅에서 간단한 데이터를 저장하는 법을 봤는데요,
만약에 저장할 데이터가 간단하지 않고 좀 복잡하다...라고 한다면 아래처럼 테이블을 만들어서 저장합니다.
==============================================================================
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // 리스트를 쓰기 위해 추가합니다.
public class csTest : MonoBehaviour
{
// 이렇게 클래스를 만들고
[Serializable] // 저장하기 위해서 있어야 합니다.
public class ScoreEntry
{
public string name;
public int score;
}
string currentPlayerName;
int score;
// 만든 클래스를 리스트에 담아서 관리하면 마치 테이블처럼 사용할 수 있습니다.
public List<ScoreEntry> highScore = new List<ScoreEntry>();
void AddData()
{
// 이렇게 새로운 데이터를 추가해주고
highScore.Add(new ScoreEntry { name = currentPlayerName, score = score });
}
void OnGUI()
{
// 이렇게 화면에 랭킹 정보를 보여주면 됩니다.
foreach (ScoreEntry nowScore in highScore)
{
GUILayout.Label(string.Format("{0} : {1:#, 0}", nowScore.name, nowScore.score));
}
}
}
==============================================================================
이렇게 정보를 테이블처럼 만든 후에는 BinaryFormatter를 사용해서 저장할 수 있습니다.
BinaryFormatter는 '파라미터를 갖지 않는 생성자'를 갖는 클래스라면 어떤 클래스도 바이트 배열로 변환하고, 그것을 다시 문자열 값으로 변환할 수 있습니다.
문자열 값으로 변환이 가능하다면 이전 포스팅에서 설명한 PlayerPrefs에 저장할 수 있게 되겠죠.
==============================================================================
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // 리스트를 쓰기 위해 추가합니다.
// BinaryFormatter를 사용하기 위해서는 반드시 아래의 네임스페이스를 추가해줘야 해요.
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class csTest : MonoBehaviour
{
// 이렇게 클래스를 만들고
[Serializable] // 저장하기 위해서 있어야 합니다.
public class ScoreEntry
{
public string name;
public int score;
}
// 만든 클래스를 리스트에 담아서 관리하면 마치 테이블처럼 사용할 수 있습니다.
public List<ScoreEntry> highScore = new List<ScoreEntry>();
void SaveScores()
{
var binaryFormatter = new BinaryFormatter();
var memoryStream = new MemoryStream();
// score를 바이트 배열로 변환해서 저장합니다.
binaryFormatter.Serialize(memoryStream, highScore);
// 그것을 다시 한번 문자열 값으로 변환해서
// 'HighScore'라는 스트링 키값으로 PlayerPrefs에 저장합니다.
PlayerPrefs.SetString("HighScore", Convert.ToBase64String(memoryStream.GetBuffer()));
}
void Start()
{
// 'HighScore' 스트링 키값으로 데이터를 가져옵니다.
var data = PlayerPrefs.GetString("HighScore");
if (!string.IsNullOrEmpty(data))
{
var binaryFormatter = new BinaryFormatter();
var memoryStream = new MemoryStream(Convert.FromBase64String(data)));
// 가져온 데이터를 바이트 배열로 변환하고
// 사용하기 위해 다시 리스트로 캐스팅해줍니다.
highScore = (List<ScoreEntry>)binaryFormatter.Deserialize(memoryStream);
}
}
}
==============================================================================