블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2323)N
Unity3D (568)N
Programming (472)
Unreal (4)
Gamebryo (56)
Tip & Tech (184)
협업 (34)
3DS Max (3)
Game (12)
Utility (116)
Etc (92)
Link (31)
Portfolio (19)
Subject (90)
iOS,OSX (38)
Android (13)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (19)
Interest (37)
Thinking (36)
한글 (26)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (2)
냥이 (9)
육아 (9)
Total1,343,990
Today28
Yesterday297
Statistics Graph

달력

« » 2019.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

공지사항

태그목록

    // 원하는 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
좀 더 복잡한 데이터 저장하기  (6) 2014.09.25
Unity Serializer  (0) 2014.09.25
Simple C# Unity Serializer  (0) 2014.09.25
ClipboardHelper  (0) 2014.05.15
Posted by blueasa

댓글을 달아 주세요

  1. 2015.09.04 17:04 신고 배고픈멍멍이  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다.
    그런데 적용하는데 있어서 에러가 떠서 질문이 있습니다.
    맨 아래 코드를 참고하고 있습니다.

    Manager 라는 클래스와 SubManager 라는 클래스를 만들었습니다.
    Manager에서 위의 코드를 넣어두었구요

    SubManager에서도 Manager의 List를 쓰기 위해서
    public List<Manager.ScoreEntry> highScore = new List<Manager.ScoreEntry>(); 를 선언했고,
    Start문에 foreach(List<Manager.ScoreEntry> _list in list){} 를 추가해줬습니다.(데이터 로드하기 위해서)
    그런데 _list.score에서 에러가 나옵니다.
    Assets/Scripts/SubManager.cs(51,25): error CS0030: Cannot convert type `Manager.ScoreEntry' to `System.Collections.Generic.List<Manager.ScoreEntry>'

    • 2015.09.05 01:05 신고 blueasa  댓글주소  수정/삭제

      안녕하세요.
      public List<Manager.ScoreEntry> highScore = new List<Manager.ScoreEntry>();
      를 선언하고 foreach를 쓰시려면 아래와 같이 해보세요.
      foreach(Manager.ScoreEntry se in highScore )
      {
      se.머시기; // 사용
      }

  2. 2015.09.07 09:11 신고 배고픈멍멍이  댓글주소  수정/삭제  댓글쓰기

    아 답변 감사합니다..
    답변보고 이제 이해했습니다 ㅜㅜ

  3. 2015.09.07 11:59 신고 배고픈멍멍이  댓글주소  수정/삭제  댓글쓰기

    저 한가지 더 궁금한점이 있는데요! ScoreEntry에 사진은 넣을 수 없을까요?
    점수 + 이름 + 프로필사진 올리고싶은데요!
    바이너리포멧형태로 Texture2D는 못올리나요??
    Texture2D형태를 넣으려고 하니까 SerializeationException: Type UnityEngine.Texture2D is not marked as Serializable.

    클래스
    [Serializable]
    public class ScoreEntry{
    public Texture2D thumbnail;
    public string name;
    public int score;
    }

    • 2015.09.07 13:34 신고 blueasa  댓글주소  수정/삭제

      음..
      아래와 같이 Texture2D 위에 [SerializeField] 프로퍼티를 넣어 보시겠어요?

      [Serializable]
      public class ScoreEntry
      {
      [SerializeField]
      public Texture2D thumbnail;
      public string name;
      public int score;
      }

      참조 : http://docs.unity3d.com/ScriptReference/SerializeField.html