좀 더 복잡한 데이터 저장하기
// 원하는 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); } } } ==============================================================================
'Unity3D > Script' 카테고리의 다른 글
OnGUI() 상에서 마우스 더블 클릭 구현 (0) | 2014.11.20 |
---|---|
LightMap 동적 로딩. (0) | 2014.10.01 |
Unity Serializer (0) | 2014.09.25 |
Simple C# Unity Serializer (0) | 2014.09.25 |
ClipboardHelper (0) | 2014.05.15 |