2014년 1월 28일 화요일

unity3D, 좀 더 복잡한 데이터 저장하기

이전 포스팅에서 간단한 데이터를 저장하는 법을 봤는데요,

만약에 저장할 데이터가 간단하지 않고 좀 복잡하다...라고 한다면 아래처럼 테이블을 만들어서 저장합니다.
==============================================================================

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

==============================================================================







댓글 없음:

댓글 쓰기